通过N个输入查找C中的最大数字

时间:2015-10-15 15:09:00

标签: c arrays int main stdio

所以我有这段代码:

#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,我可以插入七个名字和年龄等等。

3 个答案:

答案 0 :(得分: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(或其他名称,但同一角色)应适合此处。

答案 1 :(得分: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

答案 2 :(得分:0)

问题分为两部分:用户如何指定输入的人数?我如何存储数据?

第二部分很简单:无论你要考虑多少人,如果你只想知道谁是最老的人,就足以保留当前最老的人的姓名和年龄。 (当然,如果有一个平局,很多人,比方说,80岁,你只能保持第一场比赛。)

不存储任何东西也简化了第一个问题。您可以要求用户事先指定人数,如果您的人数很少,则可以找到。如果您有许多人的列表,则用户必须手动计数然后输入计数。很可能是分期付款。

更好的方法是通过其他方式指示输入的结束,例如通过负年龄或两个破折号作为名称。输入也可能会耗尽,例如在输入后重定向文件输入或按Ctrl-Z或Ctrl-D之一时,具体取决于您的平台。

以下示例按行读取输入,然后扫描该行。循环while (1)理论上是无限的,在实践中,当输入用完时执行会突然退出循环 - fgets返回NULL - ,当读取空白行或输入为&n时#39; t采用单字名称和年龄的格式。

#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;
}