通过 N 个输入找到 C 中的最大数
Find Biggest Number in C, by N number of inputs
所以我有这个代码:
#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
,我可以输入7个名字和年龄等等)
您可以使用 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;
}
另请注意:
- 对于
scanf
中的 %s
,您应该传递 char*
,而不是 char(*)[20]
peopleAge[maxAge]
可能越界了。 maxName
(或其他名称但角色相同)应该适合这里。
你可以这样做 -
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
问题分为两部分:用户如何指定输入多少人?我如何存储数据?
第二部分很简单:无论你要考虑多少人,如果你只想知道谁是最年长的,那么保留当前最年长的人的姓名和年龄就可以了。 (当然,如果平局并且很多人都是 80 岁,那么您只需要保留第一场比赛即可。)
不存储任何东西也简化了第一个问题。您可以要求用户事先指定人数,如果您的人数很少,那就是 find。如果您有一个包含很多人的列表,用户将不得不手动计数然后输入计数。很可能算错了。
更好的方法是用另一种方式来表示输入的结束,例如用一个负数的年龄或者两个破折号作为名字。输入也有可能会用完,例如,当从文件重定向输入时,或者在输入后按 Ctrl-Z 或 Ctrl-D 中的一个时,取决于您的平台。
下面的示例逐行读取输入,然后扫描该行。循环 while (1)
在理论上是无限的,在实践中,当输入用完时执行会跳出循环 – fgets
return NULL
– 当读取到空白行或当输入的格式不是单字名称和年龄时。
#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;
}
所以我有这个代码:
#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
,我可以输入7个名字和年龄等等)
您可以使用 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;
}
另请注意:
- 对于
scanf
中的 peopleAge[maxAge]
可能越界了。maxName
(或其他名称但角色相同)应该适合这里。
%s
,您应该传递 char*
,而不是 char(*)[20]
你可以这样做 -
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
问题分为两部分:用户如何指定输入多少人?我如何存储数据?
第二部分很简单:无论你要考虑多少人,如果你只想知道谁是最年长的,那么保留当前最年长的人的姓名和年龄就可以了。 (当然,如果平局并且很多人都是 80 岁,那么您只需要保留第一场比赛即可。)
不存储任何东西也简化了第一个问题。您可以要求用户事先指定人数,如果您的人数很少,那就是 find。如果您有一个包含很多人的列表,用户将不得不手动计数然后输入计数。很可能算错了。
更好的方法是用另一种方式来表示输入的结束,例如用一个负数的年龄或者两个破折号作为名字。输入也有可能会用完,例如,当从文件重定向输入时,或者在输入后按 Ctrl-Z 或 Ctrl-D 中的一个时,取决于您的平台。
下面的示例逐行读取输入,然后扫描该行。循环 while (1)
在理论上是无限的,在实践中,当输入用完时执行会跳出循环 – fgets
return NULL
– 当读取到空白行或当输入的格式不是单字名称和年龄时。
#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;
}