对数组元素进行排序,查找c中最大和最小的数字



我正在解决这个问题,我需要给出一些输入,找到其中最大和最小的。下面是问题说明

Ivan Vasilyevich来到市场,决定买两个西瓜:一个给自己,另一个给岳母。很明显,要给自己挑最重的西瓜,给婆婆挑最轻的西瓜。但有一个问题:西瓜很多,他不知道如何选择最轻和最重的西瓜。帮助他!

输入

第一行为西瓜个数n (n≤30000)。第二行包含n个数字,每个数字是相应西瓜的质量。西瓜的重量均为正整数,且不超过30000。

输出

打印两个数字:Ivan Vasilyevich要给岳母买的西瓜的重量和他要给自己买的西瓜的重量,或者打印"Ooops!"(不带引号),如果有人离开时没有带西瓜

这是我的代码

#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i, w[30000], gw, lw;
scanf("%d", &n);

n = abs(n);

for (i = 0; i < n; i++)
{
scanf("%d", &w[i]);
}
if (n >= 2)
{

for (i = 0; i < n; i++)
{
if (w[0] < w[i])
w[0] = w[i];
gw = w[0];
}
for (i = 0; i < n; i++)
{
if (w[0] > w[i])
w[0] = w[i];
lw = w[0];
}
printf("%d %d", lw, gw);

return 0;
}
else
{
printf("Ooops!");
return 0;
}

}

我得到了错误的答案(96/100)。我说错了什么?

您不需要为一个包含30k个整数的数组分配空间来查找输入的最小和最大权重。

首先,将minmax的权重初始化为输入的第一个整数,然后在读取更多权重时相应地更新minmax。使用变量cur(一个整数)来存储最后读取的整数(即权重)。

这样,你就可以一次完成,而不是多次循环。

如果你使用scanf,检查它的返回值是很好的做法。参考(来自C99标准):

如果在任何转换之前发生输入失败,则scanf函数返回宏EOF的值。否则,scanf函数返回赋值的输入项数,在早期匹配失败的情况下,该数可能小于所提供的数,甚至为零。

在本例中,当scanf调用的形式为scanf("%d", &a),其中a是某个int,我们期望调用scanf("%d", &a)返回1

虽然检查返回值是一个好习惯,但这并不是绝对必要的。如果这是一个类的程序,并且您从未处理过scanf的返回值,那么您可以删除对下面返回值的所有检查,程序应该运行相同。也就是说,如果您检查返回值并在检查它的理由中引用C标准(因为返回值提供了非常有用的信息),则会显示出很大的主动性。

#include <stdio.h>
#include <stdlib.h>
#define MAX_WAT 30000    /* maximum number of watermelons */
int main(void) {
int n, i, min, max, cur;
/* prompt user for number of watermelons */
printf("Enter number of watermelons: ");
/* read integer, checking return value of scanf as expected */
if (scanf("%d", &n) != 1) {
printf("error in scanfn");
exit(EXIT_FAILURE);
}
if (n > MAX_WAT) {
printf("Please enter less than %d watermelons.n", MAX_WAT);
return 0;
}
/* if zero or one watermelons, at least one person leaves without */
if (n <= 1) {
printf("Ooops!n");
return 0;
}
/* initialize min, max to first integer and update
min, max accordingly as new weights are read    */
printf("Enter weights of %d watermelons: ", n);
scanf("%d", &cur);
min = max = cur;
for (i = 1; i < n; i++) {
if (scanf("%d", &cur) != 1) {
printf("error in scanfn");
exit(EXIT_FAILURE);
}
if (cur < min)
min = cur;
if (cur > max)
max = cur;
}
printf("Ivan Vasilyevich: %dnMother: %dn", max, min);
return 0;
}

会话1:

Enter number of watermelons: 5
Enter weights of 5 watermelons: 2 5 1 9 10
Ivan Vasilyevich: 10
Mother: 1

会话2:

Enter number of watermelons: 1
Ooops!

会话示例3:

Enter number of watermelons: 30001
Please enter less than 30000 watermelons.
  • 不修改原始数组
  • 初始化gw和lw
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i, w[30000], gw, lw;
scanf("%d", &n);

n = abs(n);

for (i = 0; i < n; i++)
{
scanf("%d", &w[i]);
}
if (n >= 2)
{

gw = w[0];
for (i = 0; i < n; i++)
{
if (gw < w[i]) gw = w[i];
}
lw = w[0];
for (i = 0; i < n; i++)
{
if (lw > w[i]) lw = w[i];
}
printf("%d %d", lw, gw);

return 0;
}
else
{
printf("Ooops!");
return 0;
}    
}

最新更新