鱼C论坛

 找回密码
 立即注册
查看: 1158|回复: 7

[已解决]运行崩溃

[复制链接]
发表于 2023-11-25 22:18:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
输入共11行,前10行每行是一个学生的姓名,最后一行是10个用空格分开的整数表示对应的10个学生成绩。(姓名大小不超过20个字符)

输出姓名按字典序排列后的学生姓名和成绩,共10行,每个学生的姓名和成绩占一行,姓名和成绩间用逗号分开。 为什么运行崩溃
#include <stdio.h>
#include <string.h>
int main()
{
    char name[10][10],names[10];
    int score[10],scores;
    int i,j;
    for(i=0;i<10;i++)
    {
        scanf("%s\n",name[i]);
    }
    for(i=0;i<10;i++)
    {
        scanf("%d",&score[i]);
    }
    for(i=0;i<10;i++)
    {
        for(j=0;j<10-i-1;j++)
        {
            if(strcmp(name[j],name[j+1])>0)
            {
                 strcpy(names,name[j]);
        strcpy(name[j],name[j+1]);
        strcpy(name[j+1],names);
        scores=score[j];
        score[j]=score[j+1];
          score[j+1]=scores;
            }

        }
    }
    for(i=0;i<10;i++)
    {
        printf("%s,%d\n",name[i],score[i]);
    }
    return 0;
}
最佳答案
2023-11-25 22:30:42
mamaaini 发表于 2023-11-25 22:30
只用#include 和#include 两个头文件,也不用结构体的 ...

如果你只能使用`#include`和`#include`两个头文件,并且不能使用结构体,可以使用以下代码来实现你的需求:
#include <stdio.h>#include <string.h>int main() {    char names[10][21];  // 10个学生的姓名,每个姓名最长为20个字符    int scores[10];      // 对应的10个学生成绩    // 输入学生姓名和成绩    printf("请输入10个学生的姓名和成绩:\n");    for (int i = 0; i < 10; i++) {        scanf("%s %d", names[i], &scores[i]);    }    // 使用冒泡排序按照姓名进行排序    for (int i = 0; i < 9; i++) {        for (int j = 0; j < 9 - i; j++) {            if (strcmp(names[j], names[j + 1]) > 0) {                // 交换学生姓名                char temp[21];                strcpy(temp, names[j]);                strcpy(names[j], names[j + 1]);                strcpy(names[j + 1], temp);                // 交换学生成绩                int tempScore = scores[j];                scores[j] = scores[j + 1];                scores[j + 1] = tempScore;            }        }    }    // 输出排序后的学生姓名和成绩    printf("姓名按字典序排列后的学生姓名和成绩:\n");    for (int i = 0; i < 10; i++) {        printf("%s,%d\n", names[i], scores[i]);    }    return 0;}
这段代码使用了一个二维字符数组`names`来保存学生的姓名,长度为10(10个学生),每个姓名的最大长度为20。同时,使用一个一维整数数组`scores`来保存学生成绩。在输入学生姓名和成绩后,通过冒泡排序按照姓名进行字典序排序。最后,输出排序后的学生姓名和成绩。请注意,这种方法是比较简单的排序方法,如果数据量较大,建议使用更高效的排序算法。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-25 22:18:50 | 显示全部楼层
根据你提供的代码,我看到一些问题可能导致程序运行崩溃。首先,你声明了`char name, names;`和`int score, scores;`,但它们应该是字符数组和整数数组。所以应该使用`char name[11][21];`和`int score[10];`。

其次,你在`for`循环中使用了`name`和`score`,但它们是单个字符和整数,无法存储所有学生的姓名和成绩。你需要使用`name[i ]`和`score[i ]`来保存每个学生的姓名和成绩。

最后,你只给出了代码的一部分,可能还有其他错误存在。如果你能提供完整的代码,我可以更好地帮助你解决问题。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-25 22:26:24 | 显示全部楼层
FishC_GPT 发表于 2023-11-25 22:18
根据你提供的代码,我看到一些问题可能导致程序运行崩溃。首先,你声明了`char name, names;`和`int score, ...

#include <stdio.h>
#include <string.h>
int main()
{
    char name[21][100],names[21];
    int score[20],scores;
    int i,j;
    for(i=0;i<10;i++)
    {
        scanf("%s\n",name[i]);
    }
    for(i=0;i<10;i++)
    {
        scanf("%d",&score[i]);
    }
    for(i=0;i<10;i++)
    {
        for(j=i+1;j<10;j++)
        {
            if(strcmp(name[i],name[j])>0)
            {
                 strcpy(names,name[i]);
                 strcpy(name[i],name[j]);
                 strcpy(name[j],names);
                 scores=score[i];
                 score[i]=score[j];
                 score[j]=scores;
            }

        }
    }
    for(i=0;i<9;i++)
    {
        printf("%s,%d\n",name[i],score[i]);
    }
    printf("%s,%d",name[9],score[9]);
    return 0;
}
为啥运行崩溃
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-25 22:26:40 | 显示全部楼层
mamaaini 发表于 2023-11-25 22:26
#include
#include
int main()
{
    char name ...

根据你提供的代码,我看到以下问题可能导致程序运行崩溃:

1. 变量`name`和`names`应该是字符数组,用来存储学生的姓名。同样,变量`score`和`scores`应该是整数数组,用来存储学生的成绩。

2. `for`循环的条件不完整,缺少一个条件判断语句来控制循环的次数。应该为`for(i=0; i<10; i++)`,表示循环10次。

3. 在每次循环中,应该使用`scanf`函数来读取每个学生的姓名和成绩。例如,可以使用`scanf("%s%d", name, &score)`来读取学生的姓名和成绩。

4. 当读取完每个学生的姓名和成绩后,需要将它们存储在相应的数组中,以便后续处理。

5. 排序学生姓名时,可以使用标准库函数`qsort`来进行排序,并提供一个自定义的比较函数。

下面是修正后的代码示例:
#include <stdio.h>#include <stdlib.h>#include <string.h>int compare(const void *a, const void *b) {    return strcmp((const char *)a, (const char *)b);}int main() {    char names[10][20]; // 学生姓名数组    int scores[10];     // 学生成绩数组    for(int i = 0; i < 10; i++) {        scanf("%s %d", names[i], &scores[i]);    }    // 根据学生姓名排序    qsort(names, 10, sizeof(names[0]), compare);    // 输出排序后的学生姓名和成绩    for(int i = 0; i < 10; i++) {        printf("%s,%d\n", names[i], scores[i]);    }    return 0;}
这样,你可以输入10个学生的姓名和成绩,然后程序将按字典序排序并输出。注意,本代码假设每个学生的姓名不超过20个字符。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-25 22:27:37 | 显示全部楼层
FishC_GPT 发表于 2023-11-25 22:26
根据你提供的代码,我看到以下问题可能导致程序运行崩溃:

1. 变量`name`和`names`应该是字符数组,用来 ...

不用stdlib.h这个头文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-25 22:27:52 | 显示全部楼层
mamaaini 发表于 2023-11-25 22:27
不用stdlib.h这个头文件

如果你不想使用标准库中的<stdlib.h>头文件,可以考虑使用以下代码来实现你的需求:
#include <stdio.h>#include <string.h>// 定义学生结构体typedef struct {    char name[20];    int score;} Student;// 比较函数,用于给学生姓名排序int compare(const void *a, const void *b) {    Student *studentA = (Student *)a;    Student *studentB = (Student *)b;    return strcmp(studentA->name, studentB->name);}int main() {    Student students[10];    // 输入学生信息    printf("请输入10个学生的姓名和成绩:\n");    for (int i = 0; i < 10; i++) {        scanf("%s %d", students[i].name, &students[i].score);    }    // 根据学生姓名排序    qsort(students, 10, sizeof(Student), compare);    // 输出排序后的学生信息    printf("姓名按字典序排列后的学生姓名和成绩:\n");    for (int i = 0; i < 10; i++) {        printf("%s,%d\n", students[i].name, students[i].score);    }    return 0;}
这段代码首先定义了一个包含学生姓名和成绩的结构体Student。然后,通过循环输入10个学生的姓名和成绩。接下来,使用qsort函数对学生数组按照姓名进行排序。最后,通过循环输出排序后的学生姓名和成绩。

请注意,在这个示例中,我们使用了标准库中的<stdio.h>和<string.h>头文件,因为它们提供了一些方便的输入输出和字符串处理函数。如果你仍然不想使用这些头文件,那么可能需要自己实现一些相应的功能。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-25 22:30:24 | 显示全部楼层
FishC_GPT 发表于 2023-11-25 22:27
如果你不想使用标准库中的头文件,可以考虑使用以下代码来实现你的需求:

只用#include <stdio.h>和#include <string.h>两个头文件,也不用结构体的C语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-25 22:30:42 | 显示全部楼层    本楼为最佳答案   
mamaaini 发表于 2023-11-25 22:30
只用#include 和#include 两个头文件,也不用结构体的 ...

如果你只能使用`#include`和`#include`两个头文件,并且不能使用结构体,可以使用以下代码来实现你的需求:
#include <stdio.h>#include <string.h>int main() {    char names[10][21];  // 10个学生的姓名,每个姓名最长为20个字符    int scores[10];      // 对应的10个学生成绩    // 输入学生姓名和成绩    printf("请输入10个学生的姓名和成绩:\n");    for (int i = 0; i < 10; i++) {        scanf("%s %d", names[i], &scores[i]);    }    // 使用冒泡排序按照姓名进行排序    for (int i = 0; i < 9; i++) {        for (int j = 0; j < 9 - i; j++) {            if (strcmp(names[j], names[j + 1]) > 0) {                // 交换学生姓名                char temp[21];                strcpy(temp, names[j]);                strcpy(names[j], names[j + 1]);                strcpy(names[j + 1], temp);                // 交换学生成绩                int tempScore = scores[j];                scores[j] = scores[j + 1];                scores[j + 1] = tempScore;            }        }    }    // 输出排序后的学生姓名和成绩    printf("姓名按字典序排列后的学生姓名和成绩:\n");    for (int i = 0; i < 10; i++) {        printf("%s,%d\n", names[i], scores[i]);    }    return 0;}
这段代码使用了一个二维字符数组`names`来保存学生的姓名,长度为10(10个学生),每个姓名的最大长度为20。同时,使用一个一维整数数组`scores`来保存学生成绩。在输入学生姓名和成绩后,通过冒泡排序按照姓名进行字典序排序。最后,输出排序后的学生姓名和成绩。请注意,这种方法是比较简单的排序方法,如果数据量较大,建议使用更高效的排序算法。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 12:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表