2013-08-16 3 views
0

Создайте программу, которая считывает у пользователя массив с n элементами и находит элемент с наименьшим значением. Затем программа находит число элементов, имеющих равное значение с этим минимумом. Найденный элемент с наименьшим значением вдоль с числом элементов, которые имеют равное значение с минимумом массива должны быть отображены на экране ..c программирование относительно массивов и минимум?

Я написал этот код:

#include <stdio.h> 
int main() { 
    int n = 1, min = 0, count = 0; 
    int number[n]; 

    printf("Enter the size of array you want"); 
    scanf("%i", &n); 

    int x; 
    for (x = 0; x < n; x++) { 
    int num; 
    printf("\nEnter a Integer"); 
    scanf("%i", &num); 
    number[x] = num; 
    if (number[x] < min) 
     min = number[x]; 
    } 
    int i; 
    for (i = 0; i < n; i++) { 
    if (min = number[i]) 
     count++; 
    } 
    printf("%s%i", "\nThe smallest Integer you entered was ", min); 
    printf("%s%i", "\nNumber of times you entered this Integer: ", count); 

    return 0; 
} 

Но проблема в том, что, когда я запускаю это, и я добавляю целые числа, он не находит наименьшее значение и как его время повторяется правильно!

Где я ошибаюсь?

+3

'if (min = number [i])' не является сопоставлением. И ваш 'int number [n]' не будет работать правильно, потому что значение 'n' изменяется * после того, как этот массив объявлен. (И проверьте возвращаемое значение 'scanf' вместо того, чтобы вслепую предположить, что он преуспел.) – DCoder

ответ

2

вы проверяете элемент массива < 0 в строке:

if (number[x] < min/*as u specified min =0 before*/),... 

поэтому минимум устанавливается равным нулю, и нет никакой замены на самом деле происходит ..

Полное решение:

#include <stdio.h> 
int main() { 
    int n = 1, min = 0, count = 0; 
    int number[n]; 

    printf("Enter the size of array you want"); 
    scanf("%i", &n); 

    int x,y; 
    for (y = 0; y < n; y++) 
    { 
    printf("\nEnter a Integer"); 
    scanf("%i", &number[y]); 
    } 
    min=number[0]; 
    for (x = 0; x < n; x++) { 

    if (number[x] < min) 
     min = number[x]; 
    } 
    int i; 
    for (i = 0; i < n; i++) { 
    if (min == number[i]) 
     count++; 
    } 
    printf("%s%i", "\nThe smallest Integer you entered was ", min); 
    printf("%s%i", "\nNumber of times you entered this Integer: ", count); 

    return 0; 
} 
+0

лучший ответ ftw! – user2685334

+0

спасибо ... :) – Abhishek

+0

Обратите внимание, что здесь есть пара ошибок. Вы не можете безопасно объявить номер VLA перед инициализацией 'n'. Если 'n' установлен в' 0', доступ к 'number [0]' приведет к тому, что вы будете читать нераспределенную память, что приведет к неопределенному поведению – simonc

5

Предполагая, что ваш компилятор поддерживает массивы переменной длины, необходимо изменить порядок вызовов

int number[n]; 
scanf("%i", &n); 

так, что вы знаете значение n, прежде чем объявить массив

scanf("%i", &n); 
int number[n]; 

После этого , вы должны инициализировать min на большее значение, чтобы избежать игнорирования всех положительных значений

int min = INT_MAX; 

(Вам необходимо включить <limits.h> для определения INT_MAX)

Наконец,

if (min = number[i]) 

назначает number[i] к min. Используйте == для проверки равенства.

Ваш компилятор должен был предупредить вас о «присваивании в условном заявлении» для этой последней точки. Если это не так, убедитесь, что вы включили предупреждения (-Wall с GCC, /W4 с MSVC)

+1

Вам не нужно int min to be = INT_MAX, более быстрый способ - это просто инициализировать первую запись. – Ion

+0

@Ion Согласен, что это было бы возможно. Я бы сказал, что он более сложный, чем код, который я предложил - вам нужно будет проверить n == 0 перед доступом к номеру [0] – simonc

2
for (i = 0; i < n; i++) { 
    if (min = number[i]) 
     count++; 
    } 

Заменить min = number[i] с min == number[i].

0

В вашем коде

if (min = number[i]) 

вы присвоили номер [i] мин. Вы должны написать

if (min == number[i]) 

вместо этого.

1

1. Только после ввода размера массива, вы можете определить размер номера массива.Поскольку размер массива неопределен, вы должны использовать malloc для динамического распределения массива.

2.you должен установить min на первый элемент массива. Поскольку минимальный вход пользователя может быть отличным от нуля, если вы установите min на ноль, то он будет возвращать ноль, даже если минимум больше нуля

3.you должен использовать == но не = проверить равенство двух чисел.

4.last, вы должны использовать бесплатно, чтобы сделать память доступной и избежать утечки памяти.

Ниже приводится полная программа:

#include <stdio.h> 
int main() { 
int n = 1, min = 0, count = 0; 
int* number; 

printf("Enter the size of array you want"); 
scanf("%i", &n); 
number = (int*)malloc(sizeof(int)*n); 

int x; 
for (x = 0; x < n; x++) { 
    int num; 
    printf("\nEnter a Integer"); 
    scanf("%i", &num); 
    number[x] = num; 

    if(x == 0 || number[x] < min) 
    min = number[x]; 
} 
int i; 
for (i = 0; i < n; i++) { 
    if (min == number[i]) 
     count++; 
} 
printf("%s%i", "\nThe smallest Integer you entered was ", min); 
printf("%s%i", "\nNumber of times you entered this Integer: ", count); 

free(number); 
number = NULL; 
return 0; 

}

+0

Было бы полезно добавить текст, чтобы объяснить, какой код вы изменили и почему. Кроме того, вам не хватает 'free (number);' call to the end of function. – simonc

+0

Я добавил текст, это так? – ningyuwhut

+0

Отлично (+1). Вместо того, чтобы просто решать текущую проблему OP, теперь это поможет ему понять, как решить подобные проблемы в будущем. – simonc

0

Есть несколько вещей неправильно в вашем коде. Сначала вы определили массив number[1]. Во-вторых, min инициализируется до min = 0.

Предлагаю определить массив для максимально возможного размера, например number[100]. И прочитайте номер ввода n от пользователя и используйте только первые n элементов массива. Для второй проблемы определите min как максимальное число, представленное типом int.

Смежные вопросы