| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 916 人关注过本帖
标题:请好心人帮我看一下这个程序
只看楼主 加入收藏
稳重的小蘑菇
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-5-10
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:19 
请好心人帮我看一下这个程序
做的是一个学生选课系统
明明没有错误,但是运行了之后录入了课程和学生然后选好课之后,一旦查看学生的选课情况就会出现乱码,程序停止运行。。。
帮我看看吧~!看一下有什么不合适的地方?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int N1,N2;
struct course
{
    int num1;        //课程编号
    char name1[20];  
    int people;                   //选此门课程的人数
    struct course *next;            //结构体指针
};
struct student
{
    int num2;
    char name2[20];
    int nelenum[50];//所选课程编号
    struct student * next;
};

struct course * head1;
struct student * head2;

void insert(struct course *incourse)             //增加课程信息
{
    struct course *p0,*p1,*p2;
    p1=head1;
    p0=incourse;
    if(head1==NULL)
    {
        head1=p0;
        p0->next=NULL;
    }
    else
    {
        while((p0->num1>p1->num1) && (p1->next!=NULL))
        {
            p2=p1;
            p1=p1->next;
        }
        if(p0->num1<=p1->num1)
        {
            if(head1==p1)
                head1=p0;
            else
                p2->next=p0;
            p0->next=p1;
        }
        else
        {
            p1->next=p0;
            p0->next=NULL;
        }
    }
    N1=N1+1;
}
void delc(int num1)             //删除课程信息
{
    struct course *p1,*p2;
    if(head1==NULL)
    {
        printf("\n无法删除!\n");
        goto end;
    }
    p1=head1;
    while(num1!=p1->num1 && p1->next!=NULL)
    {
        p2=p1;
        p1=p1->next;
    }
    if(num1==p1->num1)
    {
        if(p1==head1)
            head1=p1->next;
        else
            p2->next=p1->next;
        printf("已删除\n");
        N1=N1-1;
    }
    else
        printf("没有此课程\n");
    end:;
}
void managementc()             //课程信息管理函数
{
    struct course * p1;
    int i,num1;
    printf("\t\t\t课程信息管理\n");
    printf("1.添加课程\n");
    printf("2.删除课程\n");
    printf("3.返回\n");
    printf("请输入1-3:\n");
    scanf("%d",&i);
    switch(i)
    {
    case 1:{p1=(struct course *)malloc(sizeof(struct course));
        printf("课程编号\t课程名称\n");
        scanf("%d%s",&p1->num1,p1->name1);
        p1->people=0;
        insert(p1);
           }      break;
    case 2:printf("请输入您要删除的课程编号:\n");
        scanf("%d",&num1);
        delc(num1);      break;
    case 3:break;
    }
}

void inserts(struct student * incouse)             //增加学生信息
{
    struct student *p0,*p1,*p2;
    p1=head2;
    p0=incouse;
    if(head2==NULL)
    {
        head2=p0;
        p0->next=NULL;
    }
    else
    {
        while((p0->num2>p1->num2) && (p1->next!=NULL))
        {
            p2=p1;
            p1=p1->next;
        }
        if(p0->num2 <= p1->num2)
        {
            if(head2==p1) head2=p0;
            else p2->next=p0;
            p0->next=p1;
        }
        else
        {
            p1->next=p0;
            p0->next=NULL;}
    }
    N2=N2+1;
}
void dels(int num2)                   //删除学生信息
{
    struct student *p1,*p2;
    if(head2==NULL)
    {
        printf("\n无法删除\n");
        goto end;
    }
    p1=head2;
    while(num2!=p1->num2 && p1->next!=NULL)
    {
        p2=p1;
        p1=p1->next;
    }
    if(num2==p1->num2)
    {
        if(p1==head2)
            head2=p1->next;
        else
            p2->next=p1->next;
        printf("已删除\n");
        N2=N2-1;
    }
    else
        printf("没有此学生编号\n");
end:;
}
void managements()          //学生信息管理函数
{
    struct student * p1;
    int i,num2;
    printf("\t\t\t学生信息管理\n");
    printf("1.添加学生信息\n");
    printf("2.删除学生信息\n");
    printf("3.返回主菜单\n");
    printf("请选择1-3:\n");
    scanf("%d",&i);
    switch(i)
    {
    case 1:{p1=(struct student *)malloc(sizeof(struct student));
   
        printf("num\tname\n");
        scanf("%d%s",&p1->num2,p1->name2);
        inserts(p1);}break;
    case 2:{printf("请输入您要删除的学生编号:\n");
        scanf("%d",&num2);
        dels(num2);
           }    break;
    case 3:break;
    }
}
void elect()             //学生选课
{
    struct student * s;
    struct course * p;
    int a,i,b;
    printf("请输入您的学号:\n");
    scanf("%d",&a);
    s=head2;
    while((s->num2)!=a&&s->next!=NULL) s=s->next;
    if(s->num2!=a)
    {
        printf("您的信息不存在,请重新输入:\n");
        goto end;
    }

    printf("请输入您要选修的课程编号\n");
    scanf("%d",&b);
    for(i=0;(s->nelenum[i])==0;i++);
    s->nelenum[i]=b;
    p=head1;
    while((p->num1)!=b)
        p=p->next;
    for(i=0;(s->nelenum[i])!=0;i++);
    s->nelenum[i]=b;
    (p->people)++;
   
    (p->people)++;
end:;
}
void back()              //学生退课
{
    struct student * p;
    struct course * p1;
    int b,i,j,a;
    printf("请输入您的学号:\n");
    scanf("%d",&a);
    p=head2;
    while(p->num2!=a&&p!=NULL) p=p->next;
    if(p==NULL)
        printf("您的信息不存在:\n");
    else
    {
        printf("请输入您要退选的课程:\n");
        scanf("%d",&b);
        p1=head1;
        while(p1->num1!=b) p1=p1->next;
        for(i=0;p->nelenum[i]!=b;i++);
        for(j=i;p->nelenum[j]!=0;j++)
            p->nelenum[j]=p->nelenum[j+1];
        p->nelenum[--j]=0;
        
        (p1->people)--;
        printf("succeed!\n");
    }
}
void elective()             //学生选课信息管理
{
    int i;
    printf("\t\t\t学生选课信息管理\n");
    printf("1.选课\n");
    printf("2.退课\n");
    printf("3.返回主菜单\n");
    printf("请输入1-3:\n");
    scanf("%d",&i);
    switch(i)
    {
    case 1:elect();break;
    case 2:back();break;
    case 3:break;
    }
}
void listc()                 //浏览课程信息
{
    struct course * p;
    p=head1;
    printf("课程编号    课程名称   选课人数\n");
    while(p!=NULL)
    {
        printf("%d%s%d\n",p->num1,p->name1,p->people);
        p=p->next;
    }
}
void lists()                     //浏览学生信息
{
    struct student * p;
    int a;
    p=head2;
    printf("学生编号     学生姓名      所选课程编号\n");
    while(p!=NULL)
    {
        printf("%d%s%d",p->num2,p->name2,p->nelenum);
        

        for(a=0;p->nelenum[a]!=0&&a<14;a++)
            printf("%d",p->nelenum[a]);
        printf("\n");
        p=p->next;
    }
}
void intoc()                       //存储课程信息
{
    FILE * fp;
    struct course * p;
    char filepath[30];
    printf("输入路径:");
    getchar();
    gets(filepath);
    if((fp=fopen(filepath,"w"))==NULL)
    {
        printf("\无法储存!");
        exit(0);
    }
    p=head1;
    while(p!=NULL)
    {
        fprintf(fp,"%d%s%d\n",p->num1,p->name1,p->people);
        p=p->next;
    }
    fclose(fp);
    printf("已储存入%s文件!\n",filepath);
}
void intos()                            //存储学生信息
{
    FILE * fp;
    struct student * p;
    char filepath[30];
    printf("请输入路径:");
    getchar();
    gets(filepath);
    if((fp=fopen(filepath,"wt"))==NULL)
    {
        printf("\n 无法储存!");
        exit(0);
    }
    p=head2;
    while(p!=NULL)
    {
        fwrite(p,sizeof(struct student),1,fp);
        p=p->next;
    }
    fclose(fp);
    printf("已储存入 %s文件!\n",filepath);
}
void into()                      //信息存储函数
{
    int i;
    printf("\t\t\t信息存储\n");
    printf("1.课程信息存储\n");
    printf("2.学生信息存储t\n");
    printf("3.返回主菜单\n");
    printf("请输入1-3\n");
    scanf("%d",&i);
    switch(i)
    {
    case(1):intoc();break;
    case(2):intos();break;
    case(3):break;
    }
}
void store()                             //信息存储浏览函数
{
    int i;
    printf("\t\t信息存储和浏览\n");
    printf("1.课程信息浏览\n");
    printf("2.学生信息浏览\n");
    printf("3.信息存储\n");
    printf("4.返回主菜单\n");
    printf("请输入1-4:\n");
    scanf("%d",&i);
    switch(i)
    {
    case(1):listc();break;
    case(2):lists();break;
    case(3):into();break;
    case(4):break;
    }
}
void search1()                      //按学生编号查找学生信息
{
    int a,b;
    struct student * p;
    printf("请输入学生编号");
    scanf("%d",&a);
    p=head2;
    printf("学号       学生姓名    所选课程编号\n");
    while(p!=NULL)
    {
        if(p->num2==a)
        {
            printf("%d%s%d",p->num2,p->name2,p->nelenum);
            for(b=0;p->nelenum[b]!=0&&b<14;b++)
                printf("%d",p->nelenum[b]);
        }
        p=p->next;
    }
}
void search2()                         //按学生姓名查找学生信息
{
    char name[20];
    struct student * p;
    printf("请输入要查找的学生姓名:");
    scanf("%s",name);
    p=head2;
    printf("学号       学生姓名     所选课程编号\n");
    while(p!=NULL)
    {
        if(strcmp(name,p->name2)==0)
        {
            printf("%d%s%d",p->num2,p->name2,p->nelenum);
            
        }
        p=p->next;
    }
}
void search()                      //学生信息查找主函数
{
    int i;
    printf("\t\t\t学生信息查找");
    printf("\n1.按学号查找");
    printf("\n2.按姓名查找");
    printf("\n3.返回主菜单");
    printf("\n请输入1-3:");
    scanf("%d",&i);
    switch(i)
    {
    case 1:search1();break;
    case 2:search2();break;
    case 3:break;}}
void main()                     //主函数
{
    int i;
start:
    printf("\t\t\t*****************************\n");
    printf("\n\t\t\t\t欢迎使用此系统!\n");
    printf("\t\t\t*****************************\n");
    printf("\n");
    printf("\t\t菜单:\n");   
    printf("\t\t\t1.课程信息管理\n");
    printf("\t\t\t2.学生信息管理\n");
    printf("\t\t\t3.学生选课\n");
    printf("\t\t\t4.信息存储与浏览\n");
    printf("\t\t\t5.查找学生信息\n");
    printf("\t\t\t6.退出系统");
    printf("\t\t\t\n请输入1-6:\n");
    scanf("%d",&i);

      if(i<1||i>6)
      {
        printf("请重新输入:\n");
        goto start;
      }

    switch(i)
    {
    case 1:system("cls"); managementc();goto start;break;
    case 2:system("cls"); managements();goto start;break;
    case 3:system("cls"); elective();goto start;break;
    case 4:system("cls"); store();goto start;break;
    case 5:system("cls"); search();goto start;break;
    case 6:{system("cls");
           }
        printf("Thank you!\n\nBye-Bye!\n");
    }

}
搜索更多相关主题的帖子: include course people 结构体 
2014-05-10 22:06
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:20 
多半是由于指针使用上出现错误造成。
建议对各个环节分步调试,如录入后输出全部录入数据(或保存到文件),经对比检查确认这步正确无误,下一步选课后,也输出选课的输入信息进行检查。等等。
在编写之初,就应该分模块单独进行调试,最后再组装起来。
2014-05-11 00:06
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
你程序中有
    信息存储与浏览
    查找学生信息
两个功能,你又说“录入了课程和学生然后选好课之后,一旦查看学生的选课情况就会出现乱码,程序停止运行。。。”,那么在“录入了课程和学生”后,不用另行输出调试信息,也可直接通过
    信息存储与浏览
    查找学生信息
来检验数据的正确性,缩小错误的可能范围(即是否由选课的功能部分引起)。
2014-05-11 00:23
稳重的小蘑菇
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-5-10
收藏
得分:0 
回复 3 楼 top398
你好,可以麻烦你帮我修改一下嘛?我也不大会,学的也不是很好~
2014-05-11 10:31
稳重的小蘑菇
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-5-10
收藏
得分:0 
回复 3 楼 top398
确实是选课部分出现了问题,可是要怎么改?
2014-05-11 10:48
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
那你能指出具体是哪个函数的问题么?
或者说你最后能操作的界面是哪一个?你又选择了哪一项导致错误的?
2014-05-11 12:10
稳重的小蘑菇
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-5-10
收藏
得分:0 
回复 6 楼 top398
就是1和2 都没问题,用到4查询学生信息的时候比如要按学生学号或者是姓名查询的时候,出来的学生姓名和学号都对,但是所修课程编号就是一堆像是430811287907987079898709870980798789....不知道为什么,我看了一下应该是没有错误,我找不出
2014-05-11 22:02
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
    printf( "学生编号     学生姓名      所选课程编号\n" );
    while ( p != NULL ) {
        printf( "%d%s%d", p->num2, p->name2, p->nelenum );
        for ( a = 0; p->nelenum[a] != 0 && a < 14; a++ )
            printf( "%d", p->nelenum[a] );
        printf( "\n" );
        p = p->next;
    }
在这部分代码中,
1、你输出了 p->nelenum,它是一个数组,因此你输出的实际是该数组的内存地址。
2、后面试图循环输出所选课程号,但你在创建学生信息时有初始化过这个数组么?未初始化时内容将是随机的。
2014-05-11 22:48
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
以上稍微接触了一下代码,感觉有一些细节问题。但你已经写成这样了,只好修修补补算了。其实如果从实用角度考虑,应该采用数据库——我是说小型的 sqlite。如果作为练习就那样吧。
2014-05-11 22:59
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
还有,注意一下 "%d%s%d" 这样的输出格式,各部分之间什么也没留,挤成一团,后面循环中的 "%d" 也一样。这与其它地方的风格又不太统一,为何呢?
2014-05-11 23:10
快速回复:请好心人帮我看一下这个程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027859 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved