समस्या
डायनामिक मेमोरी आवंटन का उपयोग करके सरणी में अधिकतम और न्यूनतम मान ढूंढना।
एल्गोरिदम
- आकार
nइनपुट लें malloc(n * sizeof(int))से मेमोरी आवंटित करेंmax = INT_MIN,min = INT_MAXप्रारंभ करें- लूप में प्रत्येक तत्व पढ़ें और साथ-साथ max/min अपडेट करें
- परिणाम प्रिंट करें
free()से मेमोरी मुक्त करें
पूर्ण C प्रोग्राम
#include <stdio.h>
#include <stdlib.h>
#include <limits.h> // INT_MIN, INT_MAX
int main() {
int n, *arr, max, min;
printf("सरणी का आकार: ");
if (scanf("%d", &n) != 1 || n <= 0) {
printf("अमान्य आकार\n");
return 1;
}
// डायनामिक आवंटन
arr = malloc(n * sizeof(int));
if (arr == NULL) {
printf("मेमोरी आवंटन विफल\n");
return 1;
}
// प्रारंभिकरण
max = INT_MIN; // -2147483648
min = INT_MAX; // 2147483647
printf("%d तत्व दर्ज करें:\n", n);
for (int i = 0; i < n; i++) {
if (scanf("%d", &arr[i]) != 1) {
printf("अमान्य इनपुट\n");
free(arr);
return 1;
}
// साथ-साथ max/min अपडेट
if (arr[i] > max) max = arr[i];
if (arr[i] < min) min = arr[i];
}
printf("अधिकतम = %d\n", max);
printf("न्यूनतम = %d\n", min);
free(arr);
return 0;
}
आउटपुट
सरणी का आकार: 5 5 तत्व दर्ज करें: 45 12 78 3 99 अधिकतम = 99 न्यूनतम = 3
मूल प्रोग्राम की समस्याएं (सुधार)
- क्रिटिकल बग:
scanf("%d", &n)से पहलेmalloc(n * ...)कॉल किया गया था!nअनारंभिकृत था → अपरिभाषित व्यवहार। maxऔरminके प्रारंभिक मान गलत थे (हार्डकोडेड -32768/32767 के बजायINT_MIN/INT_MAXउपयोग करें)- कोई इनपुट सत्यापन नहीं
free()गायब था
बेहतर संस्करण: फंक्शन में अलग करना
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
void findMinMax(int *arr, int n, int *min, int *max) {
*min = INT_MAX;
*max = INT_MIN;
for (int i = 0; i < n; i++) {
if (arr[i] < *min) *min = arr[i];
if (arr[i] > *max) *max = arr[i];
}
}
int main() {
int n, *arr, min, max;
printf("आकार: ");
if (scanf("%d", &n) != 1 || n <= 0) return 1;
arr = malloc(n * sizeof(int));
if (!arr) return 1;
printf("तत्व: ");
for (int i = 0; i < n; i++)
if (scanf("%d", &arr[i]) != 1) { free(arr); return 1; }
findMinMax(arr, n, &min, &max);
printf("न्यूनतम: %d, अधिकतम: %d\n", min, max);
free(arr);
return 0;
}
पॉइंटर अंकगणित संस्करण
for (int i = 0; i < n; i++) {
int val = *(arr + i);
if (val > max) max = val;
if (val < min) min = val;
}
समय और स्थान जटिलता
- समय: O(n) - एक पास
- स्थान: O(n) - सरणी के लिए (इनपुट संग्रहीत करने के लिए आवश्यक)
- अनुकूलन: यदि केवल max/min चाहिए तो सरणी संग्रहीत न करें, सीधे प्रोसेस करें → O(1) स्थान
O(1) स्थान संस्करण
int main() {
int n, val, max = INT_MIN, min = INT_MAX;
printf("आकार: "); scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &val);
if (val > max) max = val;
if (val < min) min = val;
}
printf("अधिकतम: %d, न्यूनतम: %d\n", max, min);
return 0; // कोई malloc/free नहीं!
}