自己编写的c语言程序有问题,急求解决。程序能运行,但运行途中输入某些菜单选项经常停止运行,急求各位大神解决,谢谢了。

weixin_41845099 2018-03-15 02:34:55
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
#define HEADER1 "------------------------------教室综合信息表------------------------------\n"
#define HEADER2 "| 编号 | 座位数 | 有无多媒体 | 是否可用 |\n"
#define HEADER3 "| ------------| --------- | ---------- | ----------|\n"
#define END "------------------------------------------------------\n"
#define FORMAT "|% -12d|%-8d|%8s|%8s|\n"
#define DATA p->num,p->snum,p->tv,p->use
typedef struct Classroom
{
int num;
int snum;
char tv;
char use;
}CLA;
int clas_num=0;
void input(CLA * );
void disp(CLA * );
void app(CLA * );
void del(CLA * );
void modify(CLA* );
void qur(CLA * );
void save(CLA * );
void printHeader()
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
void showMenu()
{
system("cls");
printf(" 教室使用管理系统 \n");
printf("***************菜单***************\n");
printf(" * 1输入 * \n");
printf(" * 2显示 * \n");
printf(" * 3添加 * \n");
printf(" * 4删除 * \n");
printf(" * 5修改 * \n");
printf(" * 6查询 * \n");
printf(" * 7保存 * \n");
printf(" * 0退出 * \n");
printf(" ******************************** \n");
}
void showWrong()
{
printf("\n*****Error:输入错误! ***\n请重新输入您的操作选择[0-7]:");
}

void input(CLA *s)
{
int i,j,num,count;
CLA * pstu;
system("cls");
printf("请输入要录入的记录数: ");
scanf("%d",&count);
for(i=0;i<count;i++)
{
printf("请输入第%d条记录数据:\n",i+1);
printf("请输入编号:");
scanf("%d",&num);
for(j=0;j<clas_num;j++)
while(s[j].num==num)
{
printf("编号已存在,请重新输入!\n");
printf("请输入编号:");
scanf("%d",&num);
}
pstu=s+clas_num;
pstu->num=num;
printf("请输入座位数 :");
scanf("%d",&pstu->snum);
printf("请输入有无多媒体:");
scanf("%s",&pstu->tv);
printf("请输入是否可用:");
scanf("%s",&pstu->use);
clas_num++;
}
showMenu();
printf("请输入您的操作选择[0-7]");
}
void disp(CLA *p)
{
int i;
showMenu();
if(clas_num==0)
{
printf("无此教室!");
printf("\n请输入您的操作选择[0-7]:");
return;
}
printHeader();
for(i=0;i<clas_num;i++)
{
printf(FORMAT,DATA);
p++;
}
printf("请输入您的操作选择[0-7]:");
}
void app(CLA *s)
{
int num,n=1,i;
CLA *pstu;
do
{
system("cls");
printf("请输入编号:");
scanf("%d",&num);
for(i=0;i<clas_num;i++)
while(s[i].num==num)
{
printf("编号已存在,请重新输入!\n");
printf("请输入编号:");
scanf("%d",&num);
}
pstu=s+clas_num;
pstu->num=num;
printf("请输入座位数:");
scanf("%s",pstu->snum);
printf("请输入有无多媒体:");
scanf("%d",pstu->tv);
printf("请输入是否可用:");
scanf("%d",pstu->use);;
clas_num++;
printf("输入0输出,输入其他数字继续!");
scanf("%d",&n);
if(n==0)
{
showMenu();
printf("请输入您的操作选择[0-7]");
break;
}
}while(1);
}
void del(CLA *p)
{
int sel,i,j,num,snum;
CLA *s=p;
showMenu();
printf("1----------------根据编号删除\n");
printf("2----------------根据座位数删除\n");
printf("请输入您的操作选择:[1or2]");
scanf("%d",&sel);
getchar();
if(sel==1)
{
printf("请输入您要删除的记录的编号:");
scanf("%d",&num);
for(i=1;i<=clas_num;i++)
{
if(num==p->num)break;
p++;
}
if(i>clas_num)
{
printf("无此记录!\n");
return;
}
else if(i==clas_num)
{
clas_num--;
printf("删除成功!\n");
}
else{
for(j=i-1;j<clas_num-1;j++)
s[j]=s[j+1];
clas_num--;
printf("删除成功!\n");
}
}
else if(sel==2)
{
printf("请输入您要删除的记录的座位数:");
scanf("%d",&snum);
for(i=1;i<=clas_num;i++)
{
if(snum=p->snum)break;
p++;
}
if(i>clas_num)
printf("无此记录!\n");
else if(i==clas_num)
{
clas_num--;
printf("删除成功!\n");
}
else{
for(j=i-1;j<clas_num-1;j++)
s[j]=s[j+1];
clas_num--;
printf("删除成功!\n");
}
}
printf("请输入您的操作选择[0-7]:");
}
void modify(CLA *p)
{
int num,i;
CLA *s=p;
printf("请输入您要修改的记录的编号:");
scanf("%d",&num);
for(i=1;i<=clas_num;i++)
{
if(num==p->num)break;
p++;
}
if(i>clas_num)
printf("无此记录!\n");
else
{
printf("请输入编号:(输入0退出修改)");
scanf("%d",&num);
if(num!=0)
{
p->num=num;
printf("请输入座位数");
scanf("%d",p->num);
printf("请输入有无多媒体");
scanf("%s",p->tv);
printf("请输入是否可用");
scanf("%s",p->use);
}
}
disp(s);
}
void qur(CLA *p)
{
int sel,i,num,snum;
showMenu();
printf("1------------根据学号查询\n");
printf("2------------根据座位数查询\n");
printf("请输入您的操作选择:[1or2]?");
scanf("%d",&sel);
getchar();
if(sel!=1&&sel!=2)
{
showWrong();
printf("请输入您的操作选择[0-7]:");
}
if(sel==1)
{
printf("请输入您要查询的记录的编号:");
scanf("%d",&num);
for(i=1;i<=clas_num;i++)
{
if(num==p->num) break;
p++;
}
if(i>clas_num)
{
printf("无此记录!\n");
}
else
{
printHeader();
printf(FORMAT,DATA);
printf(END);
}
}
else if(sel==2)
{
printf("请输入您要查询的记录的座位数:");
scanf("%d",&snum);
for(i=1;i<=clas_num;i++)
{
if(snum==p->snum) break;
p++;
}
if(i>clas_num)
{
printf("无此记录!\n");
}
else
{
printHeader();
printf(FORMAT,DATA);
printf(END);
}
}
printf("请输入您的操作选择[0-7]:");
}
void save(CLA *p)
{
FILE *fp;
if((fp=fopen("clas_info.dat","wb+"))==NULL)
{
printf("File open error!\n");
exit(1);
}
fwrite(p,sizeof(CLA),clas_num,fp);
printf("保存成功!\n");
fclose(fp);
printf("请输入您的操作选择[0-7]:");
}
void main()
{
CLA clas[N];
int sel;
showMenu();
printf("请输入您的操作选择[0-7]:");
do{
scanf("%d",&sel);
if(sel==0)
break;
switch(sel)
{
case 1:input(clas);break;
case 2:disp(clas);break;
case 3:app(clas);break;
case 4:del(clas);break;
case 5:modify(clas);break;
case 6:qur(clas);break;
case 7:save(clas);break;
default:showWrong();
}
}while(1);
printf("操作结束,再见!\n");
}
...全文
626 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-16
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
自信男孩 2018-03-15
  • 打赏
  • 举报
回复
typedef struct Classroom
{
    int num;
    int snum;
    char tv;
    char use;
}CLA;
结构体是这样定义的,但是对于tv 和use为啥要用%s格式输入呢,这样肯定会导致越界,程序异常。
老马何以识途 2018-03-15
  • 打赏
  • 举报
回复
首先你要明確輸入什麽會導致停止運行,然後對這個分支的程序做一個輸出調試和代碼檢查。通常停止運行都是内存問題引起的,比如數組越界運行等。檢查一下再説吧。 另外發代碼時最好做一下排版,特別是這麽長的代碼。

69,375

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧