回 帖 发 新 帖 刷新版面

主题:[原创]小女是初学,还请各位高手近来指点

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MAXSIZE 100

struct studen
{
  char name[20];
  int  math;
  int english;
  int chinese;
  int sum;


};

 

typedef struct
{
    struct studen stu[MAXSIZE];
    int last;

}   Seqlist;


Seqlist *Init_Seqlist()
{
     Seqlist *l;
  l=(Seqlist *)malloc(sizeof(Seqlist));
     l->last=-1;
 return l;
}
 

Seqlist *input(Seqlist *q)                     /*输入*/
{
 
      int i,num;
      printf("请输入要输入的学生个数:");
      scanf("%d",&num);

      for(i=q->last+1;i<num;i++)
                                                    /*当我想再次执行这个函数时我要输入的学生数却不能执行那么多输入,比如
                                                    在第一次执行这个函数时我要输入3个学生的信息,可再次执行时我还想输入3个学生
                                                    的信息,出现了实际输入的比要输入的少
                                                    */
       {

    
           printf("\n\t请输入姓名:");
           scanf("%s",(q->stu[i].name));

           printf("\n\t请输入数学成绩:");
           scanf("%d",&(q->stu[i].math));

           printf("\n\t请输入英语成绩:");
           scanf("%d",&(q->stu[i].english));

           printf("\n\t请输入语文成绩:");
           scanf("%d",&(q->stu[i].chinese));

           q->stu[i].sum=q->stu[i].math+q->stu[i].english+q->stu[i].chinese;

           q->last++;
           if(q->last==MAXSIZE-1)
                     printf("表满\n");

       }
        return q;
}

Seqlist *voi(Seqlist *q)                        /*排序*/
{
    int i,j;
 struct  studen stu;

    
    for(i=0;i<=q->last;i++)
        for(j=i+1;j<=q->last;j++)                     
    
         if( q->stu[i].sum<q->stu[j].sum)
         {
         stu = q->stu[i];
         q->stu[i]=q->stu[j];
          q->stu[j]=stu;
         }
    
    

return q;

}

int location_Seqlist(Seqlist *q,char name[])            /*查找*/
{
     int i;
     i=0;

     while((i<=q->last)&&strcmp(q->stu[i].name,name)==0)         /*感觉这个循环体不执行*/
     { i=i+1;}

     if(i>q->last)
         return (-1);
      else
          return(i);


}           
void output(Seqlist *l)                               /*输出*/
{
       int i=0;
       for(i=0;i<=l->last;i++)
       {
          printf("姓名:%-15s",l->stu[i].name);
          printf("数学成绩:%-6d",l->stu[i].math);
          printf("英语成绩:%-6d",l->stu[i].english);
          printf("语文成绩:%-6d",l->stu[i].chinese);
          printf("总成绩:%-6d",l->stu[i].sum);
          printf("\n");
       }
}


void main()
{      int i,j;
     char name[20];
            Seqlist *l;
            l=Init_Seqlist();
         while(i!=4)
         {
         printf("\n\n\n\n1.进入学生系统\n");
      
         printf("2.按成绩排名输出\n");
         printf("3.按姓名查找学生\n");
         printf("4.退出系统\n");

             printf("\n\t请选择(1-4):");
         scanf("%d",&i);
         switch(i)
         {
         case 1:  input(l);break;
        
         case 2: voi(l);
                printf("\n===============================排名是===============================\n");
                 output(l);break;
         case 3:
             {printf("请输入要查找的同学姓名:");
                 scanf("%s",name);
                 j=location_Seqlist(l,name);
                 if(j==-1)
                          printf("没有查到你输入的同学\n");    
                 else
                      printf("\n\n%s同学的排名是第%d位",name,j);   }    break;

         case 4:printf("谢谢使用\n");break;
         default:printf("输入有误,请重新输入\n");
         }
         }
            free(l);
         
}

回复列表 (共15个回复)

沙发

我是初学的``第一次写这么长的程序```请各位高手看一下```这个程序有两处不足``

我已经注释在两个函数的后面了```希望各位高手能指教指教```谢谢了啊~`

板凳

很佩服啊,,

女生学数据结构。。。。   很有理性思维能力。

3 楼


不光是女孩子[em12]我还是学文的呢~`

4 楼

确实很有思想。我也刚开始学数据结构。感觉很难。
164297562.
有空交流交流。

5 楼

其实问题很简单,只要在你的输入函数,即Seqlist *input(Seqlist *q)函数的For循环前加一句
num += q->last+1;就OK了,原因自己想想吧(提示:是跟循环中q->last++;有关)。
还有就是给你一点建议:说实在的你的程序对输入这一块的处理很差,而且碰到输入异常的时候会发生死循环,本来想帮你彻底的改一下,不过我们室友说happy hour到了,叫我打游戏,所以,你还是自己来吧!

6 楼

本来想帮你看看的,既然是学文学的,那就算了——反正你也学不出什么名堂来,不要浪费时间了!

7 楼


真是太感谢你了 ```~现在可以正常运行了~`

可是我不是很明白为什么加个那个语句就可以了呢~?


能不能给我仔细讲下啊~```

8 楼


这位大哥未免太看不起小女了吧~?偶是一外语大学软件学院哒~

偶虽然刚刚才学思维也不是很清楚`~但我非常喜欢编程```因为我感觉它是一种乐趣`~

呵呵 ``~不喜欢教就算了`~


9 楼

To LZ:

You don't need to emphasize your gender or major...

The reasons are:

1) Too many fake females here.
2) People look down on females.
3) You might be suspicious on sexual harrasment.

Focus on your technical question.

Thanks!

10 楼


原因就是你的输入函数中有q->last++;而且是让p指向last,当你每一次调用这个函数的时候,last的值都回改变,而第一次回正常显示是因为他的初始值为-1。

比如说:你第一次要输入3个学生的信息,会正常显示,而当此时for循环执行了3次,last的值变为了3。而当你再次要调用这个输入函数,要输入要5个学生信息的时候,last的初始值就不是-1,而是3,他会在输入2个学生以后就达到了跳出循环的条件,
即i比小于num(i此时为6,而num为5)。

你可以试一下你以前的代码,看看是不是这样的,其实没有告诉你加那一行代码的原因,是想让你自己思考一下,这样可以提高的更快,可是~~~~,唉!

我来回复

您尚未登录,请登录后再回复。点此登录或注册