#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
void menu();
void input(int total);
void add(int total);
void del(int total);
void display(int total);
void find(int total);
void sort(int total);
void quit();
char stu_ID[200][12],name[200][10],subname[200][20];
int c_language[200],pc[200],dw[200],yz[200],gx[200],total_score[200],average[200];
void main()
{
char ch,c;
int total,i;
char str[100];
FILE*fp;
fp=fopen("学生成绩单","r");
if(fp==NULL)
{
printf("文件打开失败!");
exit(0);
}
fgets(str,100,fp);
i=0;
while(!feof(fp))
{
fscanf(fp,"%s %s %s %d %d %d %d %d",stu_ID[i],name[i],subname[i],&c_language[i],&pc[i],&dw[i],&yz[i],&gx[i]);
i++;
}
total=i;
fclose(fp);
for(i=0;i<total;i++)
{
total_score[i]=c_language[i]+pc[i]+dw[i]+yz[i]+gx[i];
average[i]=total_score[i]/5;
}
menu();
do
{
fflush(stdin);
if((ch=getchar())!='\n')
{
switch(ch)
{
case '1':input(total);break;
case '2':add(total);break;
case '3':del(total);break;
case '4':display(total);break;
case '5':find(total);break;
case '6':sort(total);break;
case '7':quit();break;
default:printf("\n输入错误!按任意键继续:\n");
}
c=getch();
system("cls");
menu();
}
}while(1);
}
void menu()
{
printf(" ******************菜单******************\n");
printf(" 1. 输 入 成 绩\n");
printf(" 2. 添 加 成 绩\n");
printf(" 3. 删 除 成 绩\n");
printf(" 4. 查 看 成 绩\n");
printf(" 5. 查 找 成 绩\n");
printf(" 6. 排 序 查 看\n");
printf(" 7. 退 出\n");
printf(" ****************************************\n");
printf(" 请输入数字选择菜单:");
}
void input(int total)
{
char z;
int num,i;
system("cls");
printf("选择此功能将覆盖掉以前保存的成绩,确认继续(y/n):");
fflush(stdin);
scanf("%c",&z);
if(z=='n')
printf("按任意键回到主菜单:");
else if(z=='y')
{
system("cls");
printf("请输入您要写入的学生个数:");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("请依次输入学号、姓名、班级、C语言成绩、计算机成绩、大物成绩、原子物理成绩、光学成绩:\n");
fflush(stdin);
printf("学号:");
scanf("%s",stu_ID[i]);fflush(stdin);
printf("姓名:");
scanf("%s",name[i]);getchar();
printf("班级:");
scanf("%s",subname[i]);getchar();
printf("C语言:");
scanf("%d",&c_language[i]);getchar();
printf("计算机:");
scanf("%d",&pc[i]);getchar();
printf("大物:");
scanf("%d",&dw[i]);getchar();
printf("原子物理:");
scanf("%d",&yz[i]);getchar();
printf("光学:");
scanf("%d",&gx[i]);
putchar('\n');
}
total=num;
printf("输入成功!按任意键回到主菜单:");
}
else
printf("输入错误!按任意键回到主菜单:");
}
void add(int total)
{
char tem[20],ch[12];
int num,i;
system("cls");
printf("请输入您要添加的学生个数:");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("请依次输入学号、姓名、班级、C语言成绩、计算机成绩、大物成绩、原子物理成绩、光学成绩:\n");
fflush(stdin);
printf("学号:");
scanf("%s",stu_ID[total+i]);fflush(stdin);
printf("姓名:");
gets(tem);
strcpy(name[total+i],tem);
printf("班级:");
gets(ch);
strcpy(subname[total+i],ch);
printf("C语言:");
scanf("%d",&c_language[total+i]);getchar();
printf("计算机:");
scanf("%d",&pc[total+i]);getchar();
printf("大物:");
scanf("%d",&dw[total+i]);getchar();
printf("原子物理:");
scanf("%d",&yz[total+i]);getchar();
printf("光学:");
scanf("%d",&gx[total+i]);
putchar('\n');
total_score[total+i]=c_language[total+i]+pc[total+i]+dw[total+i]+yz[total+i]+gx[total+i];
average[total+i]=total_score[total+i]/5;
}
total+=num;
printf("添加成功!按任意键回到主菜单:");
}
void del(int total)
{
int i,m,flag=0,num;
char name1[20],stu_ID1[12];
system("cls");
printf("您想以学号删除还是以姓名删除?\n");
printf("1、以学号\n2、以姓名\n");
printf("请输入数字选择:");
scanf("%d",&m);
switch(m)
{
case 1:
printf("请输入学号:");
scanf("%s",&stu_ID1);
for(i=0;i<total;i++)
{
if(strcmp(stu_ID[i],stu_ID1)==0)
{
flag=1;
num=i;
break;
}
}
if(flag!=1)
{
printf("无此学号!");
}
else
{
if(num==(total-1))
total--;
else
{
for(i=num;i<(total-1);i++)
{
strcpy(stu_ID[i],stu_ID[i+1]);
strcpy(name[i],name[i+1]);
strcpy(subname[i],subname[i+1]);
c_language[i]=c_language[i+1];
pc[i]=pc[i+1];
dw[i]=dw[i+1];
yz[i]=yz[i+1];
gx[i]=gx[i+1];
total--;
}
}
}
printf("删除成功!按任意键回到主菜单:");
break;
case 2:
printf("请输入姓名:");
fflush(stdin);
gets(name1);
for(i=0;i<total;i++)
{
if(strcmp(name1,name[i])==0)
{
flag=1;
num=i;
break;
}
}
if(flag!=1)
{
printf("查无此人!");
}
else
{
if(num==(total-1))
total--;
else
{
for(i=num;i<(total-1);i++)
{
strcpy(stu_ID[i],stu_ID[i+1]);
strcpy(name[i],name[i+1]);
strcpy(subname[i],subname[i+1]);
c_language[i]=c_language[i+1];
pc[i]=pc[i+1];
dw[i]=dw[i+1];
yz[i]=yz[i+1];
gx[i]=gx[i+1];
total_score[i]=total_score[i+1];
average[i]=average[i+1];
total--;
}
}
}
printf("删除成功!按任意键回到主菜单:");
break;
default:
printf("输入错误!按任意键回到主菜单:");
}
}
void display(int total)
{
int j;
system("cls");
printf("**************************************************成绩单**********************************************\n\n");
printf("学号 姓名 班级 C语言 计算机 大物 、原子物理 光学 总分 平均分\n");
for(j=0;j<total;j++)
{
total_score[j]=c_language[j]+pc[j]+dw[j]+yz[j]+gx[j];
average[j]=total_score[j]/5;
printf("%-15s%-10s%-10s%-5d%-5d%-5d%-5d%-5d%-5d%-5d\n",stu_ID[j],name[j],subname[j],c_language[j],pc[j],dw[j],yz[j],gx[j],total_score[j],average[j]);
}
printf("按任意键回到主菜单:");
}
void find(int total)
{
int i,m,flag=0,num;
char name1[20],stu_ID1[12];
system("cls");
printf("查找方式:\n1、按学号查找\n2、按姓名查找\n");
printf("请输入数字选择:");
scanf("%d",&m);
switch(m)
{
case 1:
printf("请输入学号:");
scanf("%s",&stu_ID1);
for(i=0;i<total;i++)
{
if(strcmp(stu_ID[i],stu_ID1)==0)
{
flag=1;
num=i;
break;
}
}
if(flag!=1)
{
printf("无此学号!按任意键回到主菜单:");
}
else
{
printf("\n学号 姓名 学号 C语言 计算机 大物 原子物理 光学 总分 平均分\n");
printf("%-15s%-10s%-10s%-5d%-5d%-5d%-5d%-5d%-5d%-5d\n",stu_ID[i],name[i],subname[i],c_language[i],pc[i],dw[i],yz[i],gx[i],total_score[i],average[i]);
printf("查找成功!按任意键回到主菜单:");
}
break;
case 2:
printf("请输入姓名:");
fflush(stdin);
gets(name1);
for(i=0;i<total;i++)
{
if(strcmp(name1,name[i])==0)
{
flag=1;
num=i;
break;
}
}
if(flag!=1)
{
printf("查无此人!按任意键回到主菜单:");
}
else
{
printf("\n学号 姓名 班级 C语言 计算机 大物 原子物理 光学 总分 平均分\n");
printf("%-15s%-10s%-10s%-5d%-5d%-5d%-5d%-5d%-5d%-5d\n",stu_ID[i],name[i],subname[i],c_language[i],pc[i],dw[i],yz[i],gx[i],total_score[i],average[i]);
printf("查找成功!按任意键回到主菜单:");
}
break;
default:
printf("输入错误!按任意键回到主菜单:");
}
}
void sort(int total)
{
int i,j,k,t;
char ch,temp[20];
system("cls");
printf("以何方式排序?\n1、学号\n2、总分\n请输入数字选择:");
fflush(stdin);
scanf("%c",&ch);
switch(ch)
{
case '1':
system("cls");
printf("按学号排序如下:\n");
for(k=0;k<total-1;k++)
{
for(i=0;i<total-k-1;i++)
{
if(stu_ID[i+1]>stu_ID[i])
{
strcpy(temp,stu_ID[i]);strcpy(stu_ID[i],stu_ID[i+1]);strcpy(stu_ID[i+1],temp);
strcpy(temp,name[i]);strcpy(name[i],name[i+1]);strcpy(name[i+1],temp);
strcpy(temp,subname[i]);strcpy(subname[i],subname[i+1]);strcpy(subname[i+1],temp);
t=c_language[i];c_language[i]=c_language[i+1];c_language[i+1]=t;
t=pc[i];pc[i]=pc[i+1];pc[i+1]=t;
t=dw[i];dw[i]=dw[i+1];dw[i+1]=t;
t=yz[i];yz[i]=yz[i+1];yz[i+1]=t;
t=gx[i];gx[i]=gx[i+1];gx[i+1]=t;
t=total_score[i];total_score[i]=total_score[i+1];total_score[i+1]=t;
t=average[i];average[i]=average[i+1];average[i+1]=t;
}
}
}
printf("\n学号 姓名 班级 C语言 计算机 大物 原子物理 光学 总分 平均分\n");
for(j=0;j<total;j++)
{
printf("%-15s%-10s%-10s%-5d%-5d%-5d%-5d%-5d%-5d%-5d\n",stu_ID[j],name[j],subname[j],c_language[j],pc[j],dw[j],yz[j],gx[j],total_score[j],average[j]);
}
printf("按任意键回到主菜单:");
break;
case '2':
system("cls");
printf("按总分排序如下:\n");
for(k=0;k<total-1;k++)
{
for(i=0;i<total-k-1;i++)
{
if(total_score[i]<total_score[i+1])
{
strcpy(temp,stu_ID[i]);strcpy(stu_ID[i],stu_ID[i+1]);strcpy(stu_ID[i+1],temp);
strcpy(temp,name[i]);strcpy(name[i],name[i+1]);strcpy(name[i+1],temp);
strcpy(temp,subname[i]);strcpy(subname[i],subname[i+1]);strcpy(subname[i+1],temp);
t=c_language[i];c_language[i]=c_language[i+1];c_language[i+1]=t;
t=pc[i];pc[i]=pc[i+1];pc[i+1]=t;
t=dw[i];dw[i]=dw[i+1];dw[i+1]=t;
t=yz[i];yz[i]=yz[i+1];yz[i+1]=t;
t=gx[i];gx[i]=gx[i+1];gx[i+1]=t;
t=total_score[i];total_score[i]=total_score[i+1];total_score[i+1]=t;
t=average[i];average[i]=average[i+1];average[i+1]=t;
}
}
}
printf("\n学号 姓名 班级 C语言 计算机 大物 原子物理 光学 总分 平均分\n");
for(j=0;j<total;j++)
{
printf("%-15s%-10s%-10s%-5d%-5d%-5d%-5d%-5d%-5d%-5d\n",stu_ID[j],name[j],subname[j],c_language[j],pc[j],dw[j],yz[j],gx[j],total_score[j],average[j]);
}
printf("按任意键回到主菜单:");
break;
default:
printf("输入错误!按任意键回到主菜单:\n");
break;
}
}
void quit()
{
system("cls");
exit(0);
}
咋判断每个都能正常使用的呢?
当一个用户提交的请求超过了服务器可以处理的最大长度时,你可以向用户返回一个响应状态码为 413 Payload Too Large 的 HTTP 响应。这个状态码表示服务器拒绝该请求,因为请求实体太大。同时,你也可以在响应正文中提供一些错误提示信息,以便用户知道请求被拒绝的原因。
下面是一个可能的响应示例:
HTTP/1.1 413 Payload Too Large
Content-Type: text/plain
The incoming request exceeded the maximum allowed length. Please try again with a shorter request.
在这个示例中,HTTP 响应状态码为 413,响应正文类型为纯文本,并且包含一条错误提示信息,告诉用户请求被拒绝的原因:请求长度过长,请使用更短的请求再试一次。
需要注意的是,请求实体大小限制是由服务器和客户端之间的协议规定的。如果客户端发送的请求超过了服务器预设的大小限制,服务器就会返回 413 响应状态码,告知客户端请求被拒绝。为了避免这种情况,通常需要在客户端开发过程中仔细检查请求体大小并确保其不会超过服务器规定的最大限制。
报错提示是什么呢
error贴一下
你是在什么环境编译的linux还是windows,报什么错?windows下的话,参照下面代码:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
void menu();
void input(int total);
void add(int total);
void del(int total);
void display(int total);
void find(int total);
void sort(int total);
void quit();
char stu_ID[200][12], name[200][10], subname[200][20];
int c_language[200], pc[200], dw[200], yz[200], gx[200], total_score[200], average[200];
void main()
{
char ch, c;
int total, i;
char str[100];
FILE*fp;
fp = fopen("学生成绩单", "r");
if (fp == NULL)
{
printf("文件打开失败!");
exit(0);
}
fgets(str, 100, fp);
i = 0;
while (!feof(fp))
{
fscanf(fp, "%s %s %s %d %d %d %d %d", stu_ID[i], name[i], subname[i], &c_language[i], &pc[i], &dw[i], &yz[i], &gx[i]);
i++;
}
total = i;
fclose(fp);
for (i = 0; i<total; i++)
{
total_score[i] = c_language[i] + pc[i] + dw[i] + yz[i] + gx[i];
average[i] = total_score[i] / 5;
}
menu();
do
{
fflush(stdin);
if ((ch = getchar()) != '\n')
{
switch (ch)
{
case '1':input(total); break;
case '2':add(total); break;
case '3':del(total); break;
case '4':display(total); break;
case '5':find(total); break;
case '6':sort(total); break;
case '7':quit(); break;
default:printf("\n输入错误!按任意键继续:\n");
}
c = _getch();
system("cls");
menu();
}
} while (1);
}
void menu()
{
printf(" ******************菜单******************\n");
printf(" 1. 输 入 成 绩\n");
printf(" 2. 添 加 成 绩\n");
printf(" 3. 删 除 成 绩\n");
printf(" 4. 查 看 成 绩\n");
printf(" 5. 查 找 成 绩\n");
printf(" 6. 排 序 查 看\n");
printf(" 7. 退 出\n");
printf(" ****************************************\n");
printf(" 请输入数字选择菜单:");
}
void input(int total)
{
char z;
int num, i;
system("cls");
printf("选择此功能将覆盖掉以前保存的成绩,确认继续(y/n):");
fflush(stdin);
scanf("%c", &z);
if (z == 'n')
printf("按任意键回到主菜单:");
else if (z == 'y')
{
system("cls");
printf("请输入您要写入的学生个数:");
scanf("%d", &num);
for (i = 0; i<num; i++)
{
printf("请依次输入学号、姓名、班级、C语言成绩、计算机成绩、大物成绩、原子物理成绩、光学成绩:\n");
fflush(stdin);
printf("学号:");
scanf("%s", stu_ID[i]); fflush(stdin);
printf("姓名:");
scanf("%s", name[i]); getchar();
printf("班级:");
scanf("%s", subname[i]); getchar();
printf("C语言:");
scanf("%d", &c_language[i]); getchar();
printf("计算机:");
scanf("%d", &pc[i]); getchar();
printf("大物:");
scanf("%d", &dw[i]); getchar();
printf("原子物理:");
scanf("%d", &yz[i]); getchar();
printf("光学:");
scanf("%d", &gx[i]);
putchar('\n');
}
total = num;
printf("输入成功!按任意键回到主菜单:");
}
else
printf("输入错误!按任意键回到主菜单:");
}
void add(int total)
{
char tem[20], ch[12];
int num, i;
system("cls");
printf("请输入您要添加的学生个数:");
scanf("%d", &num);
for (i = 0; i<num; i++)
{
printf("请依次输入学号、姓名、班级、C语言成绩、计算机成绩、大物成绩、原子物理成绩、光学成绩:\n");
fflush(stdin);
printf("学号:");
scanf("%s", stu_ID[total + i]); fflush(stdin);
printf("姓名:");
gets_s(tem);
strcpy(name[total + i], tem);
printf("班级:");
gets_s(ch);
strcpy(subname[total + i], ch);
printf("C语言:");
scanf("%d", &c_language[total + i]); getchar();
printf("计算机:");
scanf("%d", &pc[total + i]); getchar();
printf("大物:");
scanf("%d", &dw[total + i]); getchar();
printf("原子物理:");
scanf("%d", &yz[total + i]); getchar();
printf("光学:");
scanf("%d", &gx[total + i]);
putchar('\n');
total_score[total + i] = c_language[total + i] + pc[total + i] + dw[total + i] + yz[total + i] + gx[total + i];
average[total + i] = total_score[total + i] / 5;
}
total += num;
printf("添加成功!按任意键回到主菜单:");
}
void del(int total)
{
int i, m, flag = 0, num;
char name1[20], stu_ID1[12];
system("cls");
printf("您想以学号删除还是以姓名删除?\n");
printf("1、以学号\n2、以姓名\n");
printf("请输入数字选择:");
scanf("%d", &m);
switch (m)
{
case 1:
printf("请输入学号:");
scanf("%s", &stu_ID1);
for (i = 0; i<total; i++)
{
if (strcmp(stu_ID[i], stu_ID1) == 0)
{
flag = 1;
num = i;
break;
}
}
if (flag != 1)
{
printf("无此学号!");
}
else
{
if (num == (total - 1))
total--;
else
{
for (i = num; i<(total - 1); i++)
{
strcpy(stu_ID[i], stu_ID[i + 1]);
strcpy(name[i], name[i + 1]);
strcpy(subname[i], subname[i + 1]);
c_language[i] = c_language[i + 1];
pc[i] = pc[i + 1];
dw[i] = dw[i + 1];
yz[i] = yz[i + 1];
gx[i] = gx[i + 1];
total--;
}
}
}
printf("删除成功!按任意键回到主菜单:");
break;
case 2:
printf("请输入姓名:");
fflush(stdin);
gets_s(name1);
for (i = 0; i<total; i++)
{
if (strcmp(name1, name[i]) == 0)
{
flag = 1;
num = i;
break;
}
}
if (flag != 1)
{
printf("查无此人!");
}
else
{
if (num == (total - 1))
total--;
else
{
for (i = num; i<(total - 1); i++)
{
strcpy(stu_ID[i], stu_ID[i + 1]);
strcpy(name[i], name[i + 1]);
strcpy(subname[i], subname[i + 1]);
c_language[i] = c_language[i + 1];
pc[i] = pc[i + 1];
dw[i] = dw[i + 1];
yz[i] = yz[i + 1];
gx[i] = gx[i + 1];
total_score[i] = total_score[i + 1];
average[i] = average[i + 1];
total--;
}
}
}
printf("删除成功!按任意键回到主菜单:");
break;
default:
printf("输入错误!按任意键回到主菜单:");
}
}
void display(int total)
{
int j;
system("cls");
printf("**************************************************成绩单**********************************************\n\n");
printf("学号 姓名 班级 C语言 计算机 大物 、原子物理 光学 总分 平均分\n");
for (j = 0; j<total; j++)
{
total_score[j] = c_language[j] + pc[j] + dw[j] + yz[j] + gx[j];
average[j] = total_score[j] / 5;
printf("%-15s%-10s%-10s%-5d%-5d%-5d%-5d%-5d%-5d%-5d\n", stu_ID[j], name[j], subname[j], c_language[j], pc[j], dw[j], yz[j], gx[j], total_score[j], average[j]);
}
printf("按任意键回到主菜单:");
}
void find(int total)
{
int i, m, flag = 0, num;
char name1[20], stu_ID1[12];
system("cls");
printf("查找方式:\n1、按学号查找\n2、按姓名查找\n");
printf("请输入数字选择:");
scanf("%d", &m);
switch (m)
{
case 1:
printf("请输入学号:");
scanf("%s", &stu_ID1);
for (i = 0; i<total; i++)
{
if (strcmp(stu_ID[i], stu_ID1) == 0)
{
flag = 1;
num = i;
break;
}
}
if (flag != 1)
{
printf("无此学号!按任意键回到主菜单:");
}
else
{
printf("\n学号 姓名 学号 C语言 计算机 大物 原子物理 光学 总分 平均分\n");
printf("%-15s%-10s%-10s%-5d%-5d%-5d%-5d%-5d%-5d%-5d\n", stu_ID[i], name[i], subname[i], c_language[i], pc[i], dw[i], yz[i], gx[i], total_score[i], average[i]);
printf("查找成功!按任意键回到主菜单:");
}
break;
case 2:
printf("请输入姓名:");
fflush(stdin);
gets_s(name1);
for (i = 0; i<total; i++)
{
if (strcmp(name1, name[i]) == 0)
{
flag = 1;
num = i;
break;
}
}
if (flag != 1)
{
printf("查无此人!按任意键回到主菜单:");
}
else
{
printf("\n学号 姓名 班级 C语言 计算机 大物 原子物理 光学 总分 平均分\n");
printf("%-15s%-10s%-10s%-5d%-5d%-5d%-5d%-5d%-5d%-5d\n", stu_ID[i], name[i], subname[i], c_language[i], pc[i], dw[i], yz[i], gx[i], total_score[i], average[i]);
printf("查找成功!按任意键回到主菜单:");
}
break;
default:
printf("输入错误!按任意键回到主菜单:");
}
}
void sort(int total)
{
int i, j, k, t;
char ch, temp[20];
system("cls");
printf("以何方式排序?\n1、学号\n2、总分\n请输入数字选择:");
fflush(stdin);
scanf("%c", &ch);
switch (ch)
{
case '1':
system("cls");
printf("按学号排序如下:\n");
for (k = 0; k<total - 1; k++)
{
for (i = 0; i<total - k - 1; i++)
{
if (stu_ID[i + 1]>stu_ID[i])
{
strcpy(temp, stu_ID[i]); strcpy(stu_ID[i], stu_ID[i + 1]); strcpy(stu_ID[i + 1], temp);
strcpy(temp, name[i]); strcpy(name[i], name[i + 1]); strcpy(name[i + 1], temp);
strcpy(temp, subname[i]); strcpy(subname[i], subname[i + 1]); strcpy(subname[i + 1], temp);
t = c_language[i]; c_language[i] = c_language[i + 1]; c_language[i + 1] = t;
t = pc[i]; pc[i] = pc[i + 1]; pc[i + 1] = t;
t = dw[i]; dw[i] = dw[i + 1]; dw[i + 1] = t;
t = yz[i]; yz[i] = yz[i + 1]; yz[i + 1] = t;
t = gx[i]; gx[i] = gx[i + 1]; gx[i + 1] = t;
t = total_score[i]; total_score[i] = total_score[i + 1]; total_score[i + 1] = t;
t = average[i]; average[i] = average[i + 1]; average[i + 1] = t;
}
}
}
printf("\n学号 姓名 班级 C语言 计算机 大物 原子物理 光学 总分 平均分\n");
for (j = 0; j<total; j++)
{
printf("%-15s%-10s%-10s%-5d%-5d%-5d%-5d%-5d%-5d%-5d\n", stu_ID[j], name[j], subname[j], c_language[j], pc[j], dw[j], yz[j], gx[j], total_score[j], average[j]);
}
printf("按任意键回到主菜单:");
break;
case '2':
system("cls");
printf("按总分排序如下:\n");
for (k = 0; k<total - 1; k++)
{
for (i = 0; i<total - k - 1; i++)
{
if (total_score[i]<total_score[i + 1])
{
strcpy(temp, stu_ID[i]); strcpy(stu_ID[i], stu_ID[i + 1]); strcpy(stu_ID[i + 1], temp);
strcpy(temp, name[i]); strcpy(name[i], name[i + 1]); strcpy(name[i + 1], temp);
strcpy(temp, subname[i]); strcpy(subname[i], subname[i + 1]); strcpy(subname[i + 1], temp);
t = c_language[i]; c_language[i] = c_language[i + 1]; c_language[i + 1] = t;
t = pc[i]; pc[i] = pc[i + 1]; pc[i + 1] = t;
t = dw[i]; dw[i] = dw[i + 1]; dw[i + 1] = t;
t = yz[i]; yz[i] = yz[i + 1]; yz[i + 1] = t;
t = gx[i]; gx[i] = gx[i + 1]; gx[i + 1] = t;
t = total_score[i]; total_score[i] = total_score[i + 1]; total_score[i + 1] = t;
t = average[i]; average[i] = average[i + 1]; average[i + 1] = t;
}
}
}
printf("\n学号 姓名 班级 C语言 计算机 大物 原子物理 光学 总分 平均分\n");
for (j = 0; j<total; j++)
{
printf("%-15s%-10s%-10s%-5d%-5d%-5d%-5d%-5d%-5d%-5d\n", stu_ID[j], name[j], subname[j], c_language[j], pc[j], dw[j], yz[j], gx[j], total_score[j], average[j]);
}
printf("按任意键回到主菜单:");
break;
default:
printf("输入错误!按任意键回到主菜单:\n");
break;
}
}
void quit()
{
system("cls");
exit(0);
}
你不说具体错误现象是很难分析的啊
我们先来谈谈为什么单片机有时候会丢失事件。首先,我们知道单片机程序是轮询模式,是一个语句执行完以后,再执行下一条语句,整个主函数就是一个进程,进程里面就只有一个线程。那么在这种模式下,我们完成一个项目会写很多的任务,这些任务都是有顺序的执行的。那么丢失事件是如何发生的呢?我用 图一 比较简易的代码来解释。
图一
程序分析:从图一的代码来看,一开始,没有检测到开盖事件,然后我的程序就一直往下跑。假如我的程序正在执行任务二,如果这时候,有开盖事件发生,但此时我正在执行任务二,那么我们是无法及时响应开盖事件的相应的动作。这时候,我们就丢失了一次开盖事件。
贴出报错信息
没看到错误位置在哪,现在碰到啥新问题呢
不调用主函数,是怎么实现单个都没问题得
可以参考下
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
struct score //定义存放学生成绩信息的结点
{
int num; //学号
string name; //姓名
float math; //数学成绩
float english; //英语成绩
float computer; //计算机基础成绩
float scoresum; //三门成绩总和
struct score * next; //next为指向下一结点的指针
};
struct score * head; //指向链表头结点的指针
int studentSum = 0; //学生总人数
class record
{
public:
struct score * InsertRecord(struct score *h);//插入学生成绩信息
struct score * DeleteRecord(struct score *h);//删除学生成绩信息
struct score * UpdateRecord(struct score *h);//修改学生成绩信息
void FindRecord(struct score *h, int x, float s1, float s2);//根据某门课程的分数段查询学生成绩信息
void FindRecord(struct score *h, string x); //根据学生姓名查询学生成绩信息
void FindRecord(struct score *h, int x); //根据学生学号查询学生成绩信息
void StatisticRecord(struct score *h, int x); //统计某门课程的及格学生人数、及格率,并显示不及格学生信息
void StacRecordFind(struct score *h); //统计三门课程成绩全部优秀的学生人数,并显示全部优秀的学生信息
void StacRecordDisq(struct score *h); //统计三门课程成绩全部不及格的学生人数,并显示全部不及格的学生信息
void PrintRecord(struct score *h); //输出所有 学生成绩
void SaveRecordFile(struct score *h); //保存学生成绩信息到文件
struct score *LoadRecordFile(struct score *h); //从文件中加载学生成绩信息
};
struct score *record:: InsertRecord(struct score *h)
{
struct score *p1, *p2, *p3;
p3 = new score; //创建新的学生成绩结点
cout << "\n请输入学生学号:";
cin >> p3->num;
cout << "\n请输入学生姓名:";
cin >> p3->name;
cout << "\n请输入学生的数学成绩:";
cin >> p3->math;
cout << "\n请输入学生的英语成绩:";
cin >> p3->english;
cout << "\n请输入学生的计算机基础成绩:";
cin >> p3->computer;
p3->scoresum = p3->math + p3->english + p3->computer; //计算结点的总成绩
p3->next = NULL; //将要插入结点的指针域置为空
if (h == NULL)
{
h = p3;
return h;
}
p1 = p2 = h;
while (p1 != NULL && p3->num > p1->num) //查找结点的学号大于要插入结点的学号的第一个结点
{ //指针p1表示符合条件的结点的指针,指针p2是指针p1的前一个结点的指针
p2 = p1;
p1 = p1->next;
}
if (p1 == h) //插入位置为链表头结点前
{
p3->next = h;
h = p3;
return h;
}
else //插入位置为链表的中间的链表的尾部
{
p2->next = p3;
p3->next = p1;
}
studentSum += 1; //学生人数加1
return h; //返回链表的头结点
}
void record::PrintRecord(score *h)
{
if (h == NULL)
{
cout << "\n抱歉,没有任何记录!";
return;
}
cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
while (h) //输出链表中每个结点的学生成绩信息
{
cout << h->num << "\t" << h->name << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum << endl;
h = h->next;
}
}
struct score *record::DeleteRecord(struct score *h)
{
struct score *p1, *p2;
int num;
if (h == NULL) //链表为空
{
cout << "\n抱歉,没有任何记录!";
return h;
}
p1 = p2 = h;//将链表的头指针赋给指针p1和p2
cout << "\n请输入要删除记录的学生学号";
cin >> num;
while (p1 != NULL && p1->num != num)//查找结点的学号等于要删除学生学号的第一个结点
{ //指针p1表示符合条件的结点的指针,指针p2是指针p1的前一个结点指针
p2 = p1;
p1 = p1->next;
}
if (p1 == NULL)
{
cout << "\n抱歉啊,表中没有该记录哦!";
return h;
}
if (p1->num == num)
{
studentSum -= 1;//学生人数减1
if (p1 == h) //删除的是头结点
h = h->next;
else //删除的是非头结点
p2->next = p1->next;
delete p1; //释放p1所指向的存储单元
}
return h;
}
struct score *record::UpdateRecord(struct score *h)
{
struct score *p1;
int num;
if (h == NULL)
{
cout << "\n抱歉,没有任何记录!";
return h;
}
p1 = h;
cout << "\n请输入要修改记录的学生学号:";
cin >> num;
while (p1 != NULL && p1->num != num) //查找结点的学号等于要修改学生学号的结点指针
{
p1 = p1->next; //将p1指针移到下一个结点
}
if (p1 == NULL) //没有找到符合要求的结点
{
cout << "\n抱歉,表中没有该记录!";
return h;
}
if (p1->num == num) //找到符合要求的结点,并修改学生的相关成绩
{
cout << "\n请重新输入学生的数学成绩:";
cin >> p1->math;
cout << "\n请重新输入学生的英语成绩:";
cin >> p1->english;
cout << "\n请重新输入学生的计算机基础成绩:";
cin >> p1->computer;
p1->scoresum = p1->math + p1->english + p1->computer;
}
return h;
}
void record::FindRecord(struct score *h, int x, float s1, float s2)
{
if (h == NULL) //链表为空
{
cout << "\n,抱歉,没有任何记录!";
return;
}
cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
while (h)
{
if (x == 1) //查找数学成绩在某分数段的学生成绩信息
{
if (h->math >= s1 && h->math <= s2)
cout << h->num << "\t" << h->name << "\t" << h->math << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum << endl;
}
if (x == 2)
{
if (h->english >= s1 && h->english <= s2)
cout << h->num << "\t" << h->name << "\t" << h->math << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum << endl;
}
if (x == 3)
{
if (h->computer >= s1 && h->computer <= s2)
cout << h->num << "\t" << h->name << "\t" << h->math << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum << endl;
}
h = h->next;
}
}
void record::FindRecord(struct score *h, int num) //根据学生学号查找学生成绩信息
{
struct score *p1;
if (h == NULL)
{
cout << "\n抱歉,没有任何记录";
return;
}
p1 = h; //将链表的头结点指针h赋给指针p1
while (p1 != NULL && p1->num != num) //查找结点的学号等于要查找学生学号的结点指针
{
p1 = p1->next;
}
if (p1 == NULL) //没有找到
{
cout << "抱歉啊,表中没有该记录的哦!";
return;
}
if (p1->num == num) //找到并显示信息
{
cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
cout << p1->num << "\t" << p1->name << "\t" << p1->math << "\t" << p1->math << "\t" << p1->english << "\t" << p1->computer << "\t" << p1->scoresum << endl;
}
}
void record::FindRecord(struct score *h, string name) //根据学生姓名查找学生成绩信息
{
struct score *p1;
if (h == NULL)
{
cout << "\n抱歉,没有任何记录!";
return;
}
p1 = h;
while (p1 != NULL && p1->name != name) //查找结点的姓名等于要查找学生姓名的结点指针
{
p1 = p1->next;
}
if (p1 == NULL)
{
cout << "\n抱歉,表中没有该记录!";
return;
}
if (p1->name == name)
{
cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
cout << p1->num << "\t" << p1->name << "\t" << p1->math << "\t" << p1->math << "\t" << p1->english << "\t" << p1->computer << "\t" << p1->scoresum << endl;
}
}
void record::StatisticRecord(struct score* h, int x)
{
struct score *p = h; //将链表的头结点指针赋给指针p
int count = 0;//定义统计人数count变量并赋初值为0
if (p == NULL)
{
cout << "\n抱歉,没有任何记录!";
return;
}
while (p)
{
if (x == 1)
if (p->math >= 60)
count += 1;
if (x == 2)
if (p->english >= 60)
count += 1;
if (x == 3)
if (p->computer >= 60)
count += 1;
p = p->next;
}
if (x == 1)
{
cout << "数学成绩及格人数为:";
cout << count;
cout << ",及格率为:";
cout << count / (float)studentSum << endl;
if (count < studentSum)
cout << "\n学号\t姓名\t数学" << endl;
else
cout << "没有数学成绩不及格学生" << endl;
}
else
{
if (x == 2)
{
cout << "英语成绩及格人数为:";
cout << count;
cout << ",及格率为:";
cout << count / (float)studentSum << endl;
if (count < studentSum)
cout << "\n学号\t姓名\t英语" << endl;
else
cout << "没有英语成绩不及格学生" << endl;
}
else
{
if (x == 3)
{
cout << "计算机成绩及格人数为:";
cout << count;
cout << ",及格率为:";
cout << count / (float)studentSum << endl;
if (count < studentSum)
cout << "\n学号\t姓名\t计算机" << endl;
else
cout << "没有计算机成绩不及格学生" << endl;
}
}
}
p = h;
while (p)
{
if (x == 1)
if (p->math < 60)
cout << p->num << "\t" << p->name << "\t" << p->math << endl;
if (x == 2)
if (p->english < 60)
cout << p->num << "\t" << p->name << "\t" << p->english << endl;
if (x == 13)
if (p->computer < 60)
cout << p->num << "\t" << p->name << "\t" << p->computer << endl;
p = p->next;
}
}
void record::StacRecordFind(struct score *h)
{
struct score *p = h;
int count = 0;
if (p == NULL)
{
cout << "\n抱歉,没有任何记录!";
return;
}
while (p)
{
if (p->math >= 90 && p->english >= 90 && p->computer >= 90)
{
count += 1;
}
p = p->next;
}
cout << "三门成绩全为优秀的学生人数为:";
cout << count << endl;
cout << "全为优秀的学生信息为:" << endl;
cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
p = h;
while (p)
{
if (p->math >= 90 && p->english >= 90 && p->computer >= 90)
cout << p->num << "\t" << p->name << "\t" <<p->math<<"\t"<<p->english<<"\t"<< p->computer <<"\t"<<p->scoresum<< endl;
p = p->next;
}
}
void record::StacRecordDisq(struct score *h)
{
struct score *p = h;
int count = 0;
if (p == NULL)
{
cout << "\n抱歉,没有任何记录!";
return;
}
while (p)
{
if (p->math < 60 && p->english < 60 && p->computer < 60)
count += 1;
p = p->next;
}
cout << "三门成绩全不及格的学生人数为:";
cout << count << endl;
cout << "全为不及格的学生信息为:" << endl;
cout << "\n学号\t姓名\t数学\t英语\t计算机\t总分" << endl;
p = h;
while (p)
{
if (p->math <60 && p->english <60 && p->computer <60)
cout << p->num << "\t" << p->name << "\t" << p->math << "\t" << p->english << "\t" << p->computer << "\t" << p->scoresum << endl;
p = p->next;
}
}
void record::SaveRecordFile(struct score *h) //将链表中的数据写入文件
{
struct score *p;
ofstream ofile; //定义输出文件对象
ofile.open("score.dat", ios::out); //以定的方式打开文件score.dat,若该文件不存在,则创建score.dat文件
if (!ofile)
{
cout << "\n数据文件打开错误没有将数据写入文件!\n";
return;
}
ofile << "\n学号\t姓名\t数学\t英语\t计算机\t总分";
while (h)
{
ofile<<endl<< h->num << "\t" << h->name << "\t" << "\t" << h->math << "\t" << h->english << "\t" << h->computer << "\t" << h->scoresum;
p = h; //将当前结点的数据信息写入到文件中
h = h->next;
delete p;
}
ofile.close();
}
struct score* record::LoadRecordFile(struct score *h)
{
ifstream ifile; //定义输入文件对象
ifile.open("score.dat", ios::in);//以读写方式打开文件score.dat
struct score *p, *q;
if (!ifile)
{
cout << "\n数据文件不存在,加载不成功!\n";
return NULL;
}
char s[50];
ifile.getline(s, 50); //读取文件指针当前行数据
while (!ifile.eof())
{
studentSum = studentSum + 1;
p = new score;
ifile >> p->num >> p->name >> p->math >> p->english >> p->computer >> p->scoresum; //
p->next = NULL;
if (h == NULL)
{
q = h = p;
}
else
{
q->next = p;
q = p;
}
}
ifile.close();
return h;
}
void SystemMenu(record r)
{
int choice;
while (1)
{
cout << "\n\t\t欢迎进入学生成绩管理系统!";
cout << "\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@";
cout << "\n\t1、添加学生成绩信息";
cout << "\n\t2、删除学生成绩信息";
cout << "\n\t3、修改学生成绩信息";
cout << "\n\t4、查询学生成绩信息";
cout << "\n\t5、显示所有学生成绩信息";
cout << "\n\t6、统计学生成绩信息";
cout << "\n\t0、退出系统";
cout << "\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@";
cout << "\n请根据提示选择操作:";
cin >> choice;
switch (choice)
{
case 1: //增加学生成绩信息
head = r.InsertRecord(head);
break;
case 2: //删除学生成绩信息
head = r.DeleteRecord(head);
break;
case 3: //修改学生成绩信息
head = r.UpdateRecord(head);
break;
case 4: //查询活到成绩信息
while (1)
{
int c;
cout << "\n*************************************";
cout << "\n\t1、根据学号查询学生成绩信息";
cout << "\n\t2、根据姓名查询学生成绩信息";
cout << "\n\t3、根据数学分数查询学生成绩信息";
cout << "\n\t4、根据英语分数查询学生成绩信息";
cout << "\n\t5、根据计算机基础成绩查询学生成绩信息";
cout << "\n\t6、返回上级目录";
cout << "\n*************************************";
cout << "\n请根据提示选择操作:"; //显示查询子菜单
cin >> c;
if (c == 1) //根据学生学号查询学生成绩信息
{
int x;
cout << "\n请输入需要查询的学生学号:";
cin >> x;
r.FindRecord(head, x);
}
if (c == 2) //根据学生姓名查询学生成绩信息
{
string name;
cout << "\n请输入需要查询的学生姓名:";
cin >> name;
r.FindRecord(head, name);
}
if (c == 3) //根据数学分数段查询学生成绩信息
{
float s1, s2;
cout << "\n请输入查询的数学最低分的最高分:";
cin >> s1 >> s2;
r.FindRecord(head, 1, s1, s2);
}
if (c == 4) //根据英语分数段查询学生成绩信息
{
float s1, s2;
cout << "\n请输入查询的英语最低分的最高分:";
cin >> s1 >> s2;
r.FindRecord(head, 2, s1, s2);
}
if (c == 5) //根据计算机分数段查询学生成绩信息
{
float s1, s2;
cout << "\n请输入查询的计算机基础最低分的最高分:";
cin >> s1 >> s2;
r.FindRecord(head, 3, s1, s2);
}
if (c == 6) //退出查询子菜单
break;
}
break;
case 5: //输出所有学生成绩信息
r.PrintRecord(head);
break;
case 6: //统计学生成绩信息
while (1)
{
int c;
cout << "\n***********************************************************";
cout << "\n\t1、统计数学成绩及格学生人数,并显示不及格学生信息";
cout << "\n\t2、统计英语成绩及格学生人数,并显示不及格学生信息";
cout << "\n\t3、统计计算机成绩及格学生人数,并显示不及格学生信息";
cout << "\n\t4、统计三门功课都不及格的学生人数,并显示学生信息(〉=90)";
cout << "\n\t5、统计三门功课都优秀的学生人数,并显示学生信息";
cout << "\n\t6、返回上级目录";
cout << "\n***********************************************************";
cout << "\n请根据提示选择操作:"; //显示统计子菜单
cin >> c;
if (c == 1)
{
r.StatisticRecord(head, 1);//统计数学成绩及格人数,并显示不及格学生信息
}
if (c == 2)
{
r.StatisticRecord(head, 2);//统计英语成绩及格人数,并显示不及格学生信息
}
if (c == 3)
{
r.StatisticRecord(head, 3);//统计计算机成绩及格人数,并显示不及格学生信息
}
if (c == 4)
{
r.StacRecordFind(head);//统计三门功课都不及格学生人数,并显示学生信息
}
if (c == 5)
{
r.StacRecordDisq(head);//统计三门功课都优秀学生人数,并显示学生信息
}
if (c == 6) //退出统计子菜单
break;
}
break;
}
if (choice == 0)//退出系统
break;
}
}
int main()
{
head = NULL;
record r; //定义record类的对象r
head = r.LoadRecordFile(head); //将文件中的数据读取到链表中
SystemMenu(r); //显示系统菜单,并处理用户选择
r.SaveRecordFile(head); //将链表中的数据写到文件中
return 0;
}
每一个函数都能正常单独使用,但在主函数调用之后就出错了,说明单个函数的逻辑和代码没有问题,问题出现在主函数中的代码逻辑。建议检查下主函数中的调用逻辑是否有问题,比如变量初始化的先后,函数调用的先后,使用使用了全局变量影响到了单个函数中的变量等。
报错信息是什么呢,贴出来呀,主函数调用出错,可能会因为全局变量、作用域等没有调好,导致出错
你不在主函数里面调用,你怎么知道你就可以正常使用。即使单个函数正常,但是几个函数联合起来之后,因为全局变量是公用的,也可能出现问题