| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1026 人关注过本帖, 1 人收藏
标题:100分找个小错.
只看楼主 加入收藏
安普留香
Rank: 2
等 级:论坛游民
帖 子:77
专家分:62
注 册:2010-5-17
收藏
得分:0 
建议在循环后观察i的值
2010-11-21 17:57
xiaomarn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:348
专家分:2026
注 册:2009-3-18
收藏
得分:8 
程序代码:
#include<stdio.h>
#include<malloc.h>

#define null 0
#define xian "---------------------------------------------------------------------------\n"

struct student
{
    int num;
    char name[20];
    char sex[10];
    int addr;
    float yuweng;
    float shuxue;
    float yingyu;
    struct student *next;
};

#define changdu sizeof(struct student)
int n;

struct student*
scan()
{
    struct student *p;

    p=(struct student *)malloc(changdu);
    printf("请输入学生信息:\n");
    printf("学号:\n");
    scanf("%d",&p->num);
    printf("姓名:\n");
    scanf("%s",p->name);
    printf("性别:\n");
    scanf("%s",p->sex);
    printf("年龄:\n");
    scanf("%s",&p->addr);
    printf("语文成绩:\n");
    scanf("%f",&p->yuweng);
    printf("数学成绩:\n");
    scanf("%f",&p->shuxue);
    printf("英语成绩:\n");
    scanf("%f",&p->yingyu);

    return p;
}                               

//输入学生信息




struct student*
chuangjian()
{
    struct student *head,*p1,*p2;

    p1=p2=(struct student *)malloc(changdu);
    p1=scan();
    head=null;

    while(p1->num!=0)
    {
        n++;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;  

        p1=(struct student *)malloc(changdu);
        p1=scan();
    }
    p2->next=null;

    return head;
}                   

//创建链表




void

print(struct student *head)
{
    struct student *p;

    printf(xian);
    printf("|\t\t\t学\t生\t信\t息\t\t\t  |\n");
    printf(xian);
    printf("|  学 号  |   姓 名\t|   性 别   |  年 龄  |  语 文  | 数 学  | 英 语  |\n");
    p=head;

    while(head!=null)
    {  

            printf(xian);
            printf("|  %d   |   %s\t|     %s    |    %d   |  %5.2f  | %5.2f  | %5.2f  |\n",p->num,p->name,p->sex,p->addr,p->yuweng,p->shuxue,p->yingyu);
            p=p->next;
    }
    printf(xian);
}                       

//输出学生信息


struct student*
del(struct student *head,int num)
{
    struct student *p1,*p2;

    if(head==null)
        printf("暂时没有学生信息.\n");
    p1=head;
    while(num!=p1->num&&p1->next!=null)
    {
        p2=p1;
        p1=p1->next;
    }

    if(num==p1->num)
    {
        if(p1==head)
            head=p1->next;
        else
            p2->next=p1->next;
        printf("删除学号为%d的学生信息\n",num);
    }
    else
        printf("没有这个学生的信息\n");

    return head;
}                   

//删除学生信息


struct student*

insert(struct student *head)
{
    char x;
    struct student *p0,*p1,*p2;
    p1=head;
    printf("请问是否要插入学生信息?y或N\n");
    scanf("%c",&x);
    if(x=='n')
        return head;
    else
        if(x=='y')
        {
            printf("请输入要插入的学生信息:\n");
            p0=(struct student *)malloc(changdu);
            printf("学号:\n");
            scanf("%d",&p0->num);
            printf("姓名:\n");
            scanf("%s",p0->name);
            printf("性别:\n");
            scanf("%s",p0->sex);
            printf("年龄:\n");
            scanf("%s",&p0->addr);
            printf("语文成绩:\n");
            scanf("%f",&p0->yuweng);
            printf("数学成绩:\n");
            scanf("%f",&p0->shuxue);
            printf("英语成绩:\n");
            scanf("%f",&p0->yingyu);
        }
        else
        {
            printf("输入错误,系统会当作您输入的是No\n");
        }

    if(p0->num>p1->num&&p1->next!=null)
    {
        p2=p1;
        p1=p1->next;
    }

    if(p0->num<=p1->num)
    {
        if(head==p1)
            head=p0;
        else
            p2->next=p0;
        p0->next=p1;
    }
    else
    {
        p1->next=p0;
        p0->next=null;
    }

    return head;
}
//插入学生信息


                                   

int

to()
{
    int m;

    printf("\t1-输入学生信息:\n");
    printf("\t2-插入学生信息:\n");
    printf("\t3-删除学生信息:\n");
    printf("\t4-输出学生信息:\n");
    printf("注意:在选2,3,4选项时,先选1进行创建,否则系统错误!!!!\n\n\n\n");
    printf("请选择\n");
    scanf("%d",&m);

    return m;
}  

//菜单


void

main()
{
    struct student *head;
    char b;
    int num,m,i=0;
    int c;

    printf("\t\t************************************************\n");
    printf("\t\t*                                              *\n");
    printf("\t\t*                                              *\n");
    printf("\t\t*        学   生   管   理   系   统           *\n");
    printf("\t\t*                                              *\n");
    printf("\t\t*                                              *\n");
    printf("\t\t*  本系统乃小五制作,版权所有,不可侵犯!!!!!!!   *\n");
    printf("\t\t************************************************\n\n\n\n\n\n");
    for(i=0;i<10;i++)
    {
        printf("是否进入主菜单?Y或N.\n");
        printf("请选择:");
        if(i!=0)                            //add a if
            while((c=getchar())!='\n')        //add a while

                ;
        scanf("%c",&b);        //%s change to %c

        while((c=getchar())!='\n')        //add a while

            ;
        //printf("%d\n",b);
        if(b=='Y'||b=='y')
        {
            m=to();
            switch(m)
            {
                case 1:   

                    head=chuangjian();
                    break;
                case 2:

                    head=insert(head);
                    break;
                case 3:

                    printf("请输入要删除的学生学号:\n");
                    scanf("%d",&num);
                    head=del(head,num);
                    break;
                case 4:

                    print(head);
                    break;
                default:
                    printf("输入错误\n");
                    break;
            }
        }
        else
        {
            printf("\n\n\n\n\t\t******     *       *     ******       *******\n");
            printf("\t\t*     *     *     *      *     *      *\n");
            printf("\t\t*      *     *   *       *      *     *\n");
            printf("\t\t*     *       * *        *     *      *\n");
            printf("\t\t*****          *         *****        *******\n");
            printf("\t\t*     *        *         *     *      *\n");
            printf("\t\t*      *       *         *      *     *\n");
            printf("\t\t*     *        *         *     *      *\n");
            printf("\t\t******         *         ******       *******\n\n\n\n\n\n\n\n\n\n");
            printf("谢谢使用!!!\n\n\n\n");
            i=10;
        }
    }
}
没有多做测试,不过能解决楼主只能选择一次的问题
2010-11-21 18:36
落拓
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:58
专家分:173
注 册:2010-9-29
收藏
得分:8 
你是用 // 做注释的。我帮你改正的地方用 /*   */ 做注释。你看看就知道了。还有,你在需要输入的时候,做得不是很好,提示语太少了。用户根本就不知道该如何结束输入,除非他看过源代码。


#include<stdio.h>
#include<malloc.h>
#define null 0
#define xian "---------------------------------------------------------------------------\n"
struct student
{
    int num;
    char name[20];
    char sex[10];
    int addr;
    float yuweng;
    float shuxue;
    float yingyu;
    struct student *next;
};

#define changdu sizeof(struct student)

int n;

struct student *scan()
{
    struct student *p;
    p=(struct student *)malloc(changdu);
    printf("请输入学生信息:\n");
    printf("学号:\n");
    scanf("%d",&p->num);
    printf("姓名:\n");
    scanf("%s",p->name);
    printf("性别:\n");
    scanf("%s",p->sex);
    printf("年龄:\n");
    scanf("%s",&p->addr);  /*格式输入应该改为%d*/
    printf("语文成绩:\n");
    scanf("%f",&p->yuweng);
    printf("数学成绩:\n");
    scanf("%f",&p->shuxue);
    printf("英语成绩:\n");
    scanf("%f",&p->yingyu);
    return p;
}                                
//输入学生信息




struct student *chuangjian()
{
    struct student *head,*p1,*p2;
    p1=p2=(struct student *)malloc(changdu);
    p1=scan();
    head=null;
    while(p1->num!=0)
    {
        n++;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;   
        p1=(struct student *)malloc(changdu);
        p1=scan();
    }
    p2->next=null;
    return head;
}                    
//创建链表




void print(struct student *head)
{
    struct student *p;
        printf(xian);
        printf("|\t\t\t学\t生\t信\t息\t\t\t  |\n");
        printf(xian);
        printf("|  学 号  |   姓 名\t|   性 别   |  年 龄  |  语 文  | 数 学  | 英 语  |\n");
        p=head;
    while(head!=null)/*  有问题  head 是不会变的   应该改为while(p!=NULL)*/
    {   
            printf(xian);
            printf("|  %d   |   %s\t|     %s    |    %d   |  %5.2f  | %5.2f  | %5.2f  |\n",p->num,p->name,p->sex,p->addr,p->yuweng,p->shuxue,p->yingyu);
            p=p->next;
    }
    printf(xian);
}                        
//输出学生信息




struct student *del(struct student *head,int num)
{
    struct student *p1,*p2;
    if(head==null)
        printf("暂时没有学生信息.\n");/*  应该用 return 返回主函数 停止对该函数的执行  */

    p1=head;
    while(num!=p1->num&&p1->next!=null)
    {
        p2=p1;   
        p1=p1->next;
    }
    if(num==p1->num)
    {
        if(p1==head)
            head=p1->next;
        else
            p2->next=p1->next;
        printf("删除学号为%d的学生信息\n",num);
    }
    else
        printf("没有这个学生的信息\n");
    return head;
}                    
//删除学生信息




struct student * insert(struct student *head)
{
    char x;
    struct student *p0,*p1,*p2;
    p1=head;
    printf("请问是否要插入学生信息?y或N\n");

    getchar();/*当你选择2,插入学生信息时,要按回车键。而下面的scanf("%c",&x);会把回车键当做输入。故需用getchar();吸收回车键*/

    scanf("%c",&x);
    if(x=='n'||x=='X')  /* 大少写都应该允许*/
        return head;
    else
        if(x=='y'||x=='Y')  /* 大少写都应该允许*/
    {
        printf("请输入要插入的学生信息:\n");
        p0=(struct student *)malloc(changdu);
        printf("学号:\n");
        scanf("%d",&p0->num);
        printf("姓名:\n");
        scanf("%s",p0->name);
        printf("性别:\n");
        scanf("%s",p0->sex);
        printf("年龄:\n");
        scanf("%s",&p0->addr); /*格式输入时 应该用%d*/
        printf("语文成绩:\n");
        scanf("%f",&p0->yuweng);
        printf("数学成绩:\n");
        scanf("%f",&p0->shuxue);
        printf("英语成绩:\n");
        scanf("%f",&p0->yingyu);
    }
    else
    {
        printf("输入错误,系统会当作您输入的是No\n");

        printf("请输入任意键返回");  getchar();/*提示一下还是要的*/
        return head; /*既然系统默认为NO,就应该立即返回主函数。无需再执行下面的句子,而且执行了,还会出错,因为p0->num 不存在。*/
    }


    if(p0->num>p1->num&&p1->next!=null)
    {
        p2=p1;
        p1=p1->next;
    }
    if(p0->num<=p1->num)
    {
        if(head==p1)
            head=p0;
        else
            p2->next=p0;
        p0->next=p1;
    }
    else
    {
        p1->next=p0;
        p0->next=null;
    }
    return head;
}
//插入学生信息


                                    
int to()
{
    int m;
    printf("\t1-输入学生信息:\n");
    printf("\t2-插入学生信息:\n");
    printf("\t3-删除学生信息:\n");
    printf("\t4-输出学生信息:\n");
    printf("注意:在选2,3,4选项时,先选1进行创建,否则系统错误!!!!\n\n\n\n");
    printf("请选择\n");
    scanf("%d",&m);
    return m;
}   
//菜单


void main()
{
    struct student *head;
    char b;
    int num,m,i=0;
    printf("\t\t************************************************\n");
    printf("\t\t*                                              *\n");
    printf("\t\t*                                              *\n");
    printf("\t\t*                                  *\n");
    printf("\t\t*                                              *\n");
    printf("\t\t*                                              *\n");
    printf("\t\t*  本系统乃小五制作,版权所有,不可侵犯!!!!!!!   *\n");
    printf("\t\t************************************************\n\n\n\n\n\n");
    for(i=0;i<10;i++)
    {
        printf("是否进入主菜单?Y或N.\n");
        printf("请选择:");
        scanf("%s",&b);
        if(b=='Y')
        {
            m=to();
            switch(m)
            {
                case 1:    head=chuangjian();break;
                case 2: head=insert(head);break;
                case 3: printf("请输入要删除的学生学号:\n");
                    scanf("%d",&num);head=del(head,num);break;
                case 4: print(head);break;
                default :printf("输入错误\n");break;
            }
        }
        else
        {
            printf("\n\n\n\n\t\t******     *       *     ******       *******\n");
            printf("\t\t*     *     *     *      *     *      *\n");
            printf("\t\t*      *     *   *       *      *     *\n");
            printf("\t\t*     *       * *        *     *      *\n");
            printf("\t\t*****          *         *****        *******\n");
            printf("\t\t*     *        *         *     *      *\n");
            printf("\t\t*      *       *         *      *     *\n");
            printf("\t\t*     *        *         *     *      *\n");
            printf("\t\t******         *         ******       *******\n\n\n\n\n\n\n\n\n\n");
            printf("谢谢使用!!!\n\n\n\n");
            i=10;
        }
    }
}

2010-11-21 19:18
shafeilong
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:236
专家分:1434
注 册:2009-3-21
收藏
得分:8 
我不能不说你非常粗心

1,结构体上定义年龄用的是整形,但是在接下来输入数据的时候用的却是字符串 所以在输出的时候会出现运行错误
2,在选择判断条件的第二部,insert这个函数里面 虽然x定义为char类型  但是scanf("%c",&x);之前的选择判断Y或者N中用的是scanf("%s",...)的赋值语句
  这就好比是
        char x;char ss;
        scanf("%s",&ss);
        scanf("%c",&x);
会出现x无法输入的问题
所以 scanf("%c",&x);改成scanf("%s",&x);
2010-11-21 20:15
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
收藏
得分:8 
回复 3楼 wujieru
就想骗别人给你钱,小样。

悲剧源于生活。
2010-11-21 22:21
五当家
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:2
帖 子:1112
专家分:3674
注 册:2010-10-20
收藏
得分:0 
回复 13楼 落拓
在输出的时候还是有问题,能不能帮我看看呢?
总之谢谢各位啦!!

经验积累中............
2010-11-21 22:47
a657195029
Rank: 2
等 级:论坛游民
帖 子:7
专家分:28
注 册:2010-10-31
收藏
得分:8 
问题的关键在 if(b=='y'|b=='Y')c语言区分大小写
2010-11-22 16:42
a657195029
Rank: 2
等 级:论坛游民
帖 子:7
专家分:28
注 册:2010-10-31
收藏
得分:0 
问题解决了 ,我要分 - -   呵呵
2010-11-22 16:44
快速回复:100分找个小错.
数据加载中...
 
   



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

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