2015-10-15 5 views
0

Поэтому у меня есть этот код:Найти наибольшее количество в C, по N число входов

#include <stdio.h> 
int main() 
{ 
char peopleName[5][20],peopleAge[5]; 
int i; 
int maxAge=0, maxName=-1; 
for(i=0;i<5;i++) 
{ 
    printf("Name & Age %d :",i+1); 
    scanf("%s",&peopleName[i]); 
    scanf("%d",&peopleAge[i]); 
if(peopleAge[i]>maxAge) 
{ 
    maxAge=peopleAge[i]; 
    maxName=i; 
} 
} 
printf("%s %d", peopleName[maxName],peopleAge[maxAge]); 
} 

Этот код находит из 5 людей самый старый. Я хочу изменить от 5 людей до N количество людей, независимо от числа, которое я сам вводил. (Например, я положил 7, и я могу вставить семь имен и возрастов и т. Д.).

+0

идут по коду и заменить все 5 с именем переменной, такой как N, а затем присвоить значение N (конечно, прежде, чем N используется) – CIsForCookies

+0

Я думаю, что ОП хочет, чтобы во время выполнения не время компиляции - т.е. введите «N» в командной строке или прочитайте все строки в файле и т. д. – kdopen

ответ

0

вопрос состоит из двух частей: Как задающие пользователь сколько человек введено? И как я могу хранить данные?

Вторая часть проста: независимо от того, сколько человек вы собираетесь рассмотреть, если вы просто хотите узнать, кто является старшим, достаточно сохранить имя и возраст самого старого человека. (Конечно, если есть галстук, и многие люди, скажем, 80 лет, вы просто получите первый матч.)

Не хранить ничего также упрощает первый вопрос. Вы можете попросить пользователя указать количество людей заранее и это найти, если у вас мало людей. Если у вас есть список многих людей, пользователь должен будет подсчитать вручную, а затем ввести счетчик. Перепродажа очень вероятна.

Лучше всего указать конец ввода другими средствами, например, отрицательным возрастом или двумя тире в качестве имени. Также существует вероятность того, что вход заканчивается, например, при перенаправлении ввода из файла или при нажатии клавиши Ctrl-Z или Ctrl-D, в зависимости от вашей платформы, после ввода.

В приведенном ниже примере прочитайте строку ввода, а затем сканируйте эту строку. Цикл while (1) теоретически бесконечен, на практике выполнение вырывается из цикла, когда заканчивается вход – fgetsNULL –, когда пустая строка считывается или когда вход не находится в формате однословного имени и возраста.

#include <stdio.h> 

int main(void) 
{ 
    char oldest[80] = "no-one"; 
    int max_age = -1; 
    int count = 0; 

    puts("Enter name & age on each line, blank line to stop:"); 

    while (1) { 
     char line[80]; 
     char name[80]; 
     int age; 

     if (fgets(line, sizeof(line), stdin) == NULL) break; 
     if (sscanf(line, "%s %d", name, &age) < 2) break; 

     if (age > max_age) { 
      strcpy(oldest, name); 
      max_age = age; 
     } 

     count++; 
    } 

    printf("The oldest of these %d people is %s, aged %d.\n", 
     count, oldest, max_age); 

    return 0; 
} 
+0

Спасибо, теперь все ясно! – acm1pt2

0

Вы можете использовать malloc для динамического выделения буфера.

#include <stdio.h> 
#include <stdlib.h> 
int main(void) 
{ 
    char (*peopleName)[20]; 
    int *peopleAge; 
    int i; 
    int maxAge=0, maxName=-1; 
    int dataNum; 
    printf("How many people? :"); 
    if(scanf("%d",&dataNum)!=1)return 1; 
    peopleName=malloc(sizeof(char[20])*dataNum); 
    peopleAge=malloc(sizeof(int)*dataNum); 
    for(i=0;i<dataNum;i++) 
    { 
     printf("Name & Age %d :",i+1); 
     scanf("%s",peopleName[i]); 
     scanf("%d",&peopleAge[i]); 
     if(peopleAge[i]>maxAge) 
     { 
      maxAge=peopleAge[i]; 
      maxName=i; 
     } 
    } 
    printf("%s %d", peopleName[maxName],peopleAge[maxName]); 
    free(peopleName); 
    free(peopleAge); 
    return 0; 
} 

Также обратите внимание, что:

  • Вы должны пройти char*, не char(*)[20], для %s в scanf
  • peopleAge[maxAge] может быть вне границ. maxName (или другое имя, но такая же роль).
+0

Спасибо, что помогли мне, я очень благодарен – acm1pt2

0

Вы можете сделать это -

int n;         // number of people 
scanf("%d",&n);       // take input from user 
char peopleName[n][20],peopleAge[n]; // declare 2-d array 

for(i=0;i<n;i++) 
{ 
    // your code 
} 

Кроме того, это утверждение -

scanf("%s",&peopleName[i]); // pass char * as argument to %s 

должно быть -

scanf("%19s",peopleName[i]); // one space is left for null character 
+0

'peopleAge [5]' -> 'peopleAge [n]' – MikeCAT

+0

@MikeCAT Отредактировано. Благодаря !! :) – ameyCU

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