不枉风来水顺 发表于 2023-10-16 12:50:40

我有问题吗??

问题:
请写一段程序求一个数列的最大值和最小值。

输入格式:
为2行,第一行为整数n(1<n<200)。第二行为n个整数,这些整数均大于-10000且小于10000。

输出格式:
只有一行,为用一个空格分隔的两个整数,依次为这n个整数中的最小值和最大值,中间用一个空格分隔。

输入样例:
10
1 2 6 7 8 9 10 3 4 5

输出样例:
1 10

我的代码
#include<stdio.h>
int main()
{
        int n ; scanf("%d",&n) ;
        int num,m = 0,max,min,op;
        for (scanf("%d",num) == 1;m < n;m++)
        {
                ;
        }m=0;
        for(m=2;m<n;m++)
        {
                max = num;min = num;
                max>= min ? max = max : max = op,max = min,min = op;
                max>= num ? max = max : max = num;
                min<= num ? min = min : min = num;
        }
        printf("%d %d",min,max);
       
        return 0 ;
       
}

不枉风来水顺 发表于 2023-10-17 19:21:59

AFUL 发表于 2023-10-17 00:07
太神奇了,这个帖子下面,几乎所有的回答。
都是用变量定义数组,C语言中这样显然会报错,他们都没试 ...

哥哥们,我借这个帖子说一下,C语言中是可以用变量定义数组的,可能你们的C语言是很多年前学习的,在小甲鱼的C语言课程里面也讲了从C99标准开始就允许了呀。是真的可以的,我已经交了PTA的作业了,里面有使用变量定义数组呢。{:10_282:}

isdkz 发表于 2023-10-16 12:50:55

你的代码有几个问题:

1. 在输入数组的时候,应该使用 scanf("%d",&num) 而不是 scanf("%d",num) 。

2. 在第二个循环中,你将 max 和 min 赋为了数组中的前两个数,但这样的话,如果数组中的最大值或最小值在前两个数中不存在,那么就会出现错误。因此,应该将 max 和 min 分别赋为数组中的第一个数,然后再从第二个数开始遍历。

3. 在判断 max 和 min 的时候,应该使用 op 来交换两个变量的值,而不是直接赋值。因为直接赋值的话,会导致变量的值被覆盖。

下面是修改后的代码:

#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    int num;
    for (int i = 0; i < n; i++) {
      scanf("%d", &num[ i]);
    }
    int max = num, min = num;
    for (int i = 1; i < n; i++) {
      if (num[ i] > max) {
            max = num[ i];
      }
      if (num[ i] < min) {
            min = num[ i];
      }
    }
    printf("%d %d", min, max);
    return 0;
}


希望对你有帮助。

陶远航 发表于 2023-10-16 12:51:13

你的代码有一些问题,我已经修复了这些问题并提供了一个新的版本。这是一个使用C语言编写的程序,用于找到一个数列中的最大值和最小值。

#include<stdio.h>

int main() {
    int n;
    scanf(\"%d\", &n);
    int num, i, max, min;

    for(i = 0; i < n; i++) {
      scanf(\"%d\", &num[ i]);
    }

    max = min = num;

    for(i = 1; i < n; i++) {
      if(num[ i] > max) {
            max = num[ i];
      }
      if(num[ i] < min) {
            min = num[ i];
      }
    }

    printf(\"%d %d\", min, max);

    return 0;
}


这个程序首先读取一个整数n,然后读取n个整数并存储在数组num中。然后,它将数组的第一个元素设置为最大值和最小值。接下来,它遍历数组的其余部分,如果找到更大的数,就更新最大值,如果找到更小的数,就更新最小值。最后,它打印出最小值和最大值。

这个程序应该能够正确地找到你的数列中的最大值和最小值。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案

jackz007 发表于 2023-10-16 13:39:25

#include <stdio.h>
int main(void)
{
      int d , m , n , min , max                           ; // 没有必要使用数组
      scanf("%d", & n)                                    ;
      if(n > 0) {
                scanf("%d" , & d)                           ;
                min = max = d                                 ;
                for(m = 1 ; m < n ; m ++) {
                        scanf("%d" , & d)                     ;
                        if(d > max) max = d                   ;
                        if(d < min) min = d                   ;
                }
                printf("%d %d\n" , min , max)               ;
      } else {
                printf("* 错误 * : 输入必须是一个正整数 !\n") ;
      }
}

AFUL 发表于 2023-10-16 19:24:44

本帖最后由 AFUL 于 2023-10-17 13:32 编辑

前面回答都是有问题的!(除了楼上那个)他们都没找到这个问题!都是想当然的回答!

错误发生在你代码的第5行,后面有没有错误我都没看。
因为C语言中不允许用变量初始化数组。
int m;
n必须是常量,比如const int n = 10;不能是变量int n;   // 错误!!

这道题你可以不用数组来做。下面是不用数组的方式:
include <stdio.h>
int main() {
int n, data, max=-10001, min=10001;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
    scanf("%d", &data);
    if (data > max) max = data;
    if (data < min) min = data;
}
printf("%d %d\n", min, max);
return 0;
}

非要用数组也可以:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
scanf("%d", &n);
int *m = (int *)malloc(n * sizeof(int));
int max = -10001, min = 10001;
for (int i = 0; i < n; ++i) {
//    scanf("%d", &m);      // 这样也行,下面那样也行
    scanf("%d", m+i);
    if (m > max) max = m;
    if (m < min) min = m;
}
printf("%d %d\n", min, max);
free(m);
return 0;
}

yinda_peng 发表于 2023-10-16 20:51:24

AFUL 发表于 2023-10-16 19:24
前面回答都是有问题的!(除了楼上那个)他们都没找到这个问题!都是想当然的回答!

错误发生在你代码的 ...

因为前面几个都是GPT

琅琊王朝 发表于 2023-10-16 21:05:46

这段代码有几个问题。首先,数组的大小应该是固定的,不能使用变量n来定义数组的大小。其次,scanf函数不能在for循环中连续使用,这会导致程序进入无限循环。最后,代码中出现了未初始化的变量op,它没有在代码中被赋值或初始化。

以下是对这段代码的修改建议:

#include <stdio.h>

int main() {
    int n, i;
    scanf("%d", &n);
    int num, max, min, op;
    for (i = 0; i < n; i++) {
      scanf("%d", &num);
    }
    for (i = 1; i < n; i++) {
      if (num > num) {
            max = i;
      }
      if (num < num) {
            min = i;
      }
    }
    printf("%d %d", num, num);
    return 0;
}
这段代码首先读取一个整数n,表示将要输入的数个数。然后定义一个大小为n的数组num,并使用for循环读取n个数字。接下来,使用另一个for循环找到数组中的最大值和最小值,并打印出来。注意,这里我们使用数组索引代替变量op来存储最大值和最小值的位置。最后,程序返回0表示正常结束。

AFUL 发表于 2023-10-17 00:07:17

本帖最后由 AFUL 于 2023-10-17 13:31 编辑

yinda_peng 发表于 2023-10-16 20:51
因为前面几个都是GPT

太神奇了,这个帖子下面,几乎所有的回答。
都是用变量定义数组,C语言中这样显然会报错,他们都没试一下就回答吗?
这个互助区质量真的堪忧啊。
// 下面这样一定是错误的!因为变量就不能这样初始化数组
int n;
scanf("%d", &n);
int arr;// 错误!因为n不是常量!
但是几乎所有用到数组的回答中的代码都是这样初始化,这错的太离谱了。
貌似cpp中也不能这样定义。

yinda_peng 发表于 2023-10-17 16:47:04

AFUL 发表于 2023-10-17 00:07
太神奇了,这个帖子下面,几乎所有的回答。
都是用变量定义数组,C语言中这样显然会报错,他们都没试 ...

因为是脚本+GPT回答,回答者不会自己人工验证,所以说GPT远远没有所宣传的那么神奇

YSW9527 发表于 2023-10-17 17:55:58

#include<stdio.h>
int main()
{
      int n ,i;
                scanf("%d",&n) ;
      int num,max,min;
      for (i=0;i<n;i++)
      {
                scanf("%d",&num);
      }
                max=num;
                min=num;
      for(i=1;i<n;i++)
      {
            if(max<num)
                        {
                                max=num;
                        }
                        else if(min>num)
                        {
                                min=num;
                        }
      }
      printf("%d %d\n",min,max);
      
      return 0 ;
      
}

不枉风来水顺 发表于 2023-10-17 19:18:34

jackz007 发表于 2023-10-16 13:39


学到了不少东西,谢谢!

AFUL 发表于 2023-10-17 19:46:22

不枉风来水顺 发表于 2023-10-17 19:21
哥哥们,我借这个帖子说一下,C语言中是可以用变量定义数组的,可能你们的C语言是很多年前学习的,在小甲 ...

你本地编译器用的是哪个?

我试了一下,
如果编译器是g++ 11.4版本,选择c++11以上,确实能编译通过。
但是,如果Clion配置中选择编译器msvc,version 17.7.2,你这个编译就是不能通过(默认支持c++14标准,是高于C99标准的),报错就是这个n有问题。并且理论上msvc这个版本是支持c99标准。

你本地编译器用的什么??

AFUL 发表于 2023-10-17 20:01:51

不枉风来水顺 发表于 2023-10-17 19:21
哥哥们,我借这个帖子说一下,C语言中是可以用变量定义数组的,可能你们的C语言是很多年前学习的,在小甲 ...

另外补充一点,
我觉得PTA这个平台做的不如leetcode。之前我发现它时间判定方式有比较大的问题。
如果学校要求用PTA做一些作业,可以用。但是自己刷题玩,个人建议leetcode。

不枉风来水顺 发表于 2023-10-17 20:04:38

AFUL 发表于 2023-10-17 19:46
你本地编译器用的是哪个?

我试了一下,


我刚刚开始学C,我用的dev C++,我不懂编译器,但是我看窗口左上角有GCC 4.9.2 64-bit Release,不知道是不是呀.
{:5_99:}{:5_99:}

不枉风来水顺 发表于 2023-10-17 20:07:14

AFUL 发表于 2023-10-17 20:01
另外补充一点,
我觉得PTA这个平台做的不如leetcode。之前我发现它时间判定方式有比较大的问题。
如果 ...

好的好的,我现在就去琢磨琢磨leetcode,谢谢您指路!
{:5_95:}

AFUL 发表于 2023-10-17 20:22:28

不枉风来水顺 发表于 2023-10-17 20:04
我刚刚开始学C,我用的dev C++,我不懂编译器,但是我看窗口左上角有GCC 4.9.2 64-bit Release,不知道是 ...

我推荐你尝试一下linux下面的编译,也尝试一下命令行。这东西会对你理解C语言系列更有帮助一点。(不过这些建议也都是坑,但是学C语言系列要想深入理解一些东西,又很难避开,小甲鱼几乎也都没讲)

如果刚开始学,用dev C++这个IDE先将就用着,省心,这个软件也比较小。

如果有额外时间什么的(必须是那种额外的时间踩坑),我建议换一个编辑器,并且自己尝试配置一下(最好是先学会用命令行编译运行小文件,自己体会一下之后,再自己配置一个编译环境,会有更好的理解,这儿我个人推荐学一下用CMake管理项目,然后配置使用Clion或者vscode,或者直接用VS免费的社区版),不然dev C++首先支持的gcc太老了,gcc只能支持到C++11的标准,现在都到了C++20,并且dev C++这个管理稍微大点的项目也比较吃力。

我个人建议,上B站再找一些专业一点的视频学,最好是老外的视频(小甲鱼的很多东西,实际上跟PTA一样,有些细节是有点问题的,感觉上小甲鱼不是科班出身,也没有相关大项目经验,不过讲的挺细,从他这儿入门可以,再进阶需要重新找一些专业的)。

不枉风来水顺 发表于 2023-10-17 20:44:08

AFUL 发表于 2023-10-17 20:22
我推荐你尝试一下linux下面的编译,也尝试一下命令行。这东西会对你理解C语言系列更有帮助一点。(不过这 ...

收到前辈的消息了,我一定会谨遵的,能碰到一个老师,我感觉我挺幸运的,
linux,CMake,Clion,vscode
Okok,我会学习的,相信我!{:5_105:}{:5_105:}

AFUL 发表于 2023-10-17 21:02:48

不枉风来水顺 发表于 2023-10-17 20:44
收到前辈的消息了,我一定会谨遵的,能碰到一个老师,我感觉我挺幸运的,
linux,CMake,Clion,vscode
Ok ...

实际上,如果为了工作的话,没必要玩C语言。
因为现在绝大多数程序员都不玩C系列的语言了。学一下Python或者Java都是会有更多的就业面。
C语言就是一个大坑,跨平台不行(所以我个人喜欢用CMake来自动构造工程,相对来说跨平台好用一些),玩内存什么的比较多,所以很多bug莫名其妙,调起来挺难受。
其他的那些语言,简单又容易上手,调bug也容易很多,实现一些东西花费程序员的时间最少。

C语言只有一个优点,是真的快,写的好的话内存也最小,但是现在硬件不值钱,程序员的时间最贵。所以我个人觉得你就玩一下就行,尽早学一个python或者java比较好。

一家之言。你自己可以参考。

不枉风来水顺 发表于 2023-10-17 21:10:29

AFUL 发表于 2023-10-17 21:02
实际上,如果为了工作的话,没必要玩C语言。
因为现在绝大多数程序员都不玩C系列的语言了。学一下Python ...

{:5_109:}{:5_101:}
这个我跟前辈看法一样,我很早就开始学python了,基础知识都有了,就是刷题不多,我打算把C的基础知识掌握好,就回去捡我的Py去!JAVA我打算把这两个语言学好在学,相信不会太迟的。
页: [1] 2
查看完整版本: 我有问题吗??