源代码如下:
```#include<stdio.h>#include<time.h>#include<string.h>#include<stdlib.h>#include<conio.h>#include<windows.h>#pragma warning(disable:4996)void menu();void function1(void);//输入、添加void function2();//排序void function3();//查询void function4();//修改void function5();//删除void function6();//退出struct student { char name[30]; char studentID[30]; int sex[30]; double BMI[30];//体重指数 int vital[30];//肺活量 int yin_yang[30]; double score[30];}stu[30];int main(){ printf(" \n"); printf(" 欢迎使用学生体测成绩判定系统 \n"); printf(" \n"); menu();}void menu(){ printf(" 1、输入(添加)学生个人信息 \n"); printf(" 2、对学生信息进行排序 \n"); printf(" 3、查询学生体测成绩 \n"); printf(" 4、修改学生个人指标 \n"); printf(" 5、删除学生个人信息 \n"); printf(" 6、退出系统 \n"); printf("\n"); int chioce; printf(" 请选择相应的选项: \n"); loop:scanf_s("%d", &chioce); switch (chioce) { case 1:system("cls"); function1(); break; case 2:system("cls"); function2(); break; case 3:system("cls"); function3(); break; case 4:system("cls"); function4(); break; case 5:system("cls"); function5(); break; case 6:system("cls"); function6(); break; default: { printf("输入错误,请再次输入\n"); goto loop; } }}void function1(void){ system("cls"); int n=0,q;loop:printf("请按顺序输入学生学号、姓名、性别(男生输入1,女生输入2)、体重指数、肺活量、引体向上或仰卧起坐数\n"); scanf_s("%s %s %d %lf %d %d", &stu[n].studentID, &stu[n].name, &stu[n].sex, &stu[n].BMI, &stu[n].vital, &stu[n].yin_yang); printf("%s %s %d %lf %d %d", stu[n].studentID, stu[n].name, stu[n].sex, stu[n].BMI, stu[n].vital, stu[n].yin_yang); fflush(stdin); for(n=0;n<=10;n++) { if (n>=1) { char *st1, *st2; st1 = stu[n].studentID, st2 = stu[n - 1].studentID; if (st1 == st2) { printf("\n该学生已存在\n"); printf("请问是否还需要添加新的学生信息 '1'代表是, '0'代表否,且回到菜单页面 \n"); scanf_s("%d", &q); if (q == 1) { goto loop; } else if (q == 0) { system("cls"); menu(); } else { system("cls"); menu(); } } } goto loop; } printf("请问是否还需要添加新的学生信息 '1'代表是, '0'代表否,且进入菜单界面\n"); scanf_s("%d", &q); if (q == 1) { n = n + 1; goto loop; } else if (q == 0) { n = n + 1; system("cls"); menu(); } else { n = n + 1; system("cls"); menu(); }}
求问这里为什么出错:
scanf_s("%s %s %d %lf %d %d", &stu[n].studentID, &stu[n].name, &stu[n].sex, &stu[n].BMI, &stu[n].vital, &stu[n].yin_yang);
printf("%s %s %d %lf %d %d", stu[n].studentID, stu[n].name, stu[n].sex, stu[n].BMI, stu[n].vital, stu[n].yin_yang);
```
提示如下(看得不是很懂):
顺便求问为什么我这个程序运行到一半直接跳出了
格式字符串和提供的参数之间存在类型不匹配.
具体来说,第一个scanf_s()的格式字符串中使用了%s来接收两个字符串型参数stu[n].studentID和stu[n].name,这是正确的用法。但在printf()的格式字符串中,对应的参数都是字符串,却使用了%d和%lf来表示整型和浮点型参数,这就会导致类型不匹配的问题,进而导致输出结果出错。
同样的问题也存在于第一个scanf_s()中,其中有一个%lf用于读取浮点型变量,但在printf()中却使用了%d来输出相应的变量。
为了避免这种问题,需要保证scanf_s()和printf()中的格式字符串和提供的变量参数类型一一对应,并且数量也应该匹配。
scanf_s("%s%s%d%lf%d%d", stu[n].studentID, sizeof(stu[n].studentID), stu[n].name, sizeof(stu[n].name), &stu[n].sex, &stu[n].BMI, &stu[n].vital, &stu[n].yin_yang);
printf("%s %s %d %lf %d %d", stu[n].studentID, stu[n].name, stu[n].sex, stu[n].BMI, stu[n].vital, stu[n].yin_yang);
结构体数组中的成员变量不应设置数组:
```c
struct student {
char name[30];
char studentID[30];
int sex;
double BMI;//体重指数
int vital;//肺活量
int yin_yang;//引体向上或仰卧起坐数
double score;
}stu[30];
在函数中添加学生信息时,将循环控制变量n的初始值设为当前已经从键盘输入的学生人数。并且读入字符串时需要指定数组的长度,避免信息溢出。
将循环内置的goto语句去掉,改为使用while循环。如果需要再次输入新的信息,则将n加1。
对于学生信息输入重复的情况,可以将其作为特殊情况处理,防止进入无限循环。建议使用break语句退出当前循环,而不是使用goto语句。
在function1()函数中,在以输入完成后询问是否继续添加学生信息时,应该将循环控制变量n加1。
下面是按照上述修改的function1()函数代码,您可以参考一下:
```c
void function1(void)
{
system("cls");
int n = 0, q, i;
while (n < 30) {
printf("请按顺序输入学生学号、姓名、性别(男生输入1,女生输入2)、体重指数、肺活量、引体向上或仰卧起坐数:\n");
scanf_s("%s %s %d %lf %d %d", stu[n].studentID, sizeof(stu[n].studentID), stu[n].name, sizeof(stu[n].name), &stu[n].sex, &stu[n].BMI, &stu[n].vital, &stu[n].yin_yang);
printf("%s %s %d %lf %d %d\n", stu[n].studentID, stu[n].name, stu[n].sex, stu[n].BMI, stu[n].vital, stu[n].yin_yang);
// 判断是否有重复的学生信息
for (i = 0; i < n; i++) {
if (strcmp(stu[n].studentID, stu[i].studentID) == 0) {
printf("\n该学生已存在\n");
printf("请问是否还需要添加新的学生信息 '1'代表是, '0'代表否,且回到菜单页面:\n");
scanf_s("%d", &q);
if (q == 1) {
break;
}
else if (q == 0) {
system("cls");
menu();
}
else {
system("cls");
menu();
}
}
}
// 判断是否需要继续输入新的学生信息
printf("请问是否还需要添加新的学生信息,'1'代表是,'0'代表否,且回到菜单页面:\n");
scanf_s("%d", &q);
if (q == 1) {
n++;
}
else if (q == 0) {
system("cls");
menu();
}
else {
system("cls");
menu();
}
}
}
希望能对您有所帮助!