| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 844 人关注过本帖
标题:c语言难题
只看楼主 加入收藏
樱花雾海
Rank: 2
来 自:广西桂林
等 级:论坛游民
帖 子:39
专家分:28
注 册:2011-6-17
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
c语言难题
一个班学生,数据包括学号,姓名,五门课(英语,高数,马哲,计算机,电子技术)的成绩。要求按总分高到低排存到cj.dat中。并按学号小到大顺序打印出  
以上是题目
#include<stdio.h>
struct Student
 {
  int num;  //姓名
        char name[20];            //名的最大长度为2
  float score[5];           //5们课的成绩
 }student[30];         //假设全班有30个人
int main()
{    float grade[30];               //30个同学的总成绩
 printf("please input the students'num,name and score:\n");
 for(int i=0;i<30;i++)
 {   
  scanf("%d,%s",&student.num,&student.name );
  for(int j=0;j<5;j++)
  {
   scanf("%f",&student.score[j]);
  }
  grade=student.score[0]+student.score[1]+student.score[2]+student.score[3]+student.score[4];
 }
  //总分由高到低存放到cj.dat中就不懂了
  //冒泡法排序学号
  for(i=0;i<29;i++)
   for(int b=29;b>i;b--)
   {
    if(student.num<student[b-1].num)
    {
     int x;
     float y;
     x=student.num;
     student.num=student[b-1].num;
     student[b-1].num=x;
     //学号改变了,其他的也要改变
     y=grade;
     grade=grade[b-1];
     grade[b-1]=y;
    }
   }
   //按顺序输出学生的信息
   for(i=0;i<30;i++)
   {
    scanf("%d,%d",&student.num,&grade);
   }
   return 0;
}
编译时没有错误,但是运行时得不到想要的效果,调试也不知道问题出在哪,大家帮一下,谢啦
搜索更多相关主题的帖子: 姓名 电子技术 include please 总成绩 
2012-01-03 23:19
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:8 
程序代码:
#include<stdio.h>

struct Student
{
    int num;  //姓名
    char name[20];            //名的最大长度为2
    float score[6];           //5门课的成绩和总分
}student[30];         //假设全班有30个人

int n=0; //打算输入学生个数(<=30)


void sort_sum() //按总分降序选择排序
{
    int i, j;
    struct Student temp;
    for(i=1; i<n; i++)
    {
        temp = student[i];
        j = i - 1;
        while(j>=0 && student[j].score[5]<temp.score[5])
        {
            student[j+1] = student[j];
            j--;
        }
        student[j+1] = temp;
    }     
}

void sort_num() //按学号升序选择排序
{
    int i, j;
    struct Student temp;
    for(i=1; i<n; i++)
    {
        temp = student[i];
        j = i - 1;
        while(j>=0 && student[j].num<temp.num)
        {
            student[j+1] = student[j];
            j--;
        }
        student[j+1] = temp;
    }     
}

int save() //按总分降序存入文件
{
    sort_sum();
    FILE *fp;
    int i;
    fp=fopen("D:\\cj.txt","w"); //要么不要路径直接写文件名(最后文件和代码源文件在一个目录中);要么改为"D:\\people.txt"(\转义字符)
    {
        fprintf(fp,"%d\n",n);
        for(i=0;i<n;i++)
        {
            fprintf(fp,"%-8d%8s%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n",student[i].num,student[i].name,student[i].score[0],
                student[i].score[1],student[i].score[2],student[i].score[3],student[i].score[4],student[i].score[5]);
        }
    }
    fclose(fp);
    return 0;
}


int read() //从文件中读取数据
{
    FILE *fp;
    int i;
    if(!(fp=fopen("D:\\cj.txt","r")))//同上
    {
        return -1;
    }
    else
    {
        fscanf(fp,"%d\n",&n);
        for(i=0;i<n;i++)
        {
            fscanf(fp,"%d%s%f%f%f%f%f%f\n",&student[i].num,student[i].name,&student[i].score[0],
                &student[i].score[1],&student[i].score[2],&student[i].score[3],&student[i].score[4],&student[i].score[5]);
        }
    }
    fclose(fp);
    return 0;  
}

void print() //打印
{
    printf("学号     姓名         课程一   课程二   课程三   课程四    课程五    总分\n");
    for(int i=0;i<n;i++)
    {
        printf("%-8d%8s%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n",student[i].num,student[i].name,student[i].score[0],
                student[i].score[1],student[i].score[2],student[i].score[3],student[i].score[4],student[i].score[5]);
    }
}


int main()
{   
    printf("请输入学生个数:\n");
    scanf("%d", &n);
    for(int i=0;i<n;i++)
    {  
        printf("请输入%d个学生学号和姓名(例如:1234,xiaohong 回车):\n",i+1);
        scanf("%d,%s",&student[i].num, student[i].name );
        student[i].score[5] = 0; //初始化
        for(int j=0;j<5;j++)
        {
            printf("请输入%d个学生第%d科成绩:\n",i+1,j+1);
            scanf("%f",&student[i].score[j]);
            student[i].score[5] += student[i].score[j]; //该学生各科成绩总和
        }
    }
    printf("你输入的学生信息:\n");
    print();
    save();
    printf("你读取的学生信息:\n");
    read();
    sort_num();
    print();
    return 0;
}

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2012-01-04 00:36
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:2 
我也不知道我的说法是不是对的,你看看再说,应该把grade放在结构体里面,例如:student[i].grade=student[i].score[0]+student[i].score[1]+student[i].score[2]+student[i].score[3]+student[i].score[4];这样无论是按单独按总分排还是,按学号排都可以。第二个问题,你是第一个student不变,然后从最后面的一个一个和他比较, if(student.num<student[b-1].num)这里是不是该改成 if(student[i].num<student[b-1].num),还有就是循环条件for(i=0;i<29;i++),你在定义一个结构体数组student的时候,   说明的是30个元素,你这里循环条件是小于29,元素下表最大是不是只到28噢?你自己看下,是不是这么一回事。不知道我说的对不对,你自己看下嘛

[ 本帖最后由 a271885843 于 2012-1-4 01:03 编辑 ]

认为事物非黑即白是缺智慧的表现……
2012-01-04 00:45
樱花雾海
Rank: 2
来 自:广西桂林
等 级:论坛游民
帖 子:39
专家分:28
注 册:2011-6-17
收藏
得分:0 
回三楼,for(i=0;i<29;i++),这里我想用冒泡法来排序,好像没错吧
2012-01-04 13:36
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:0 
以下是引用樱花雾海在2012-1-4 13:36:03的发言:

回三楼,for(i=0;i<29;i++),这里我想用冒泡法来排序,好像没错吧
没错,我看走眼了

认为事物非黑即白是缺智慧的表现……
2012-01-04 19:27
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:10 
我按你的要求写了个,你参考下。
#include  <stdio.h>
#include  <stdlib.h>
#include  <math.h>
#define   IS   INFO   stu[N]
#define   N  8   // 最大的人数
int       n = 0;     // 实际输入的人数,做全局变量

typedef  struct  XS
{
    int     ID;
    char    name[8];
    float   score[5];
    float   total;
}INFO;

INFO  stu[N];

void   input();
void   save();
void   load();
void   total_sort();
void  ID_sort();

int  main()
{
    input(stu);
    total_sort(stu);
    save(stu);
    load(stu);
    ID_sort(stu);
    save(stu);
    load(stu);
    return  0;
}


void   input(IS)
{
   int    i = 0, j, flag = 1;
   char   ch;
   float  sum = 0;

   while (flag)
   {
       scanf("%d%s", &stu[i].ID, stu[i].name);
       for (j = 0; j < 5; j++)
       {
           scanf("%f", &stu[i].score[j]);
           if (stu[i].score[j] < 0 || stu[i].score[j] > 100)
           {
               printf("输入不正确,请重新输入:");
               scanf("%f", &stu[i].score[j]);
           }
           sum += stu[i].score[j];
       }
       stu[i].total = sum;
       sum = 0;
       n++;
       i++;
       if (n == N)  break;
       printf("你是否要继?(Y / N):");
       scanf(" %c", &ch);
         if (ch == 'n' || ch == 'N')  
             flag  = 0;
         else flag = 1;
   }
   system("cls");
}


void  total_sort(IS)     // 总分从高到低排序
{
    int i, j, k;
    INFO  temp;

    for (i = 0; i < n - 1; i++)
    {
        k = i;
        for (j = i; j < n; j++)
        {
            if (stu[k].total < stu[j].total)   
                k = j;
            if (k != i)
            {
                temp = stu[i];
                stu[i] = stu[k];
                stu[k] = temp;
            }
        }
    }
    printf("现在按总分排序:\n");
}


void  ID_sort(IS)     // 按学号从小到大排序
{
    int i, j, k;
    INFO  temp;

    for (i = 0; i < n - 1; i++)
    {
        k = i;
        for (j = i; j < n; j++)
        {
            if (stu[k].ID > stu[j].ID)   
                k = j;
            if (k != i)
            {
                temp = stu[i];
                stu[i] = stu[k];
                stu[k] = temp;
            }
        }
    }
    printf("现在按学号排序:\n");
}

void  save(IS)
{
    FILE  *fp;
    int  i;

    if ((fp = fopen("cj.dat", "wb")) == NULL)
    {
        printf("Can not open file!\n");
        return ;
    }
   
    for (i = 0; i < n; i++)
        if (fwrite(&stu[i], sizeof(struct XS), 1, fp) != 1)
            printf("File write error!\n");
    fclose(fp);
}

void  load(IS)
{
    FILE  *fp;
    int   i, j;

    if ((fp = fopen("cj.dat", "rb")) == NULL)
    {
        printf("Can not open file!\n");
        return ;
    }
    printf("学号    姓名    英语    高数    马哲    计算机    电子技  总成绩\n");
    printf("------------------------------------------------------------------\n");
    for (i = 0; i < n; i++)
    {
            fread(&stu[i], sizeof(struct XS), 1, fp);
            printf("%-3d\t%s", stu[i].ID, stu[i].name);
            for (j = 0; j < 5; j++)
                printf("\t%-3.1f", stu[i].score[j]);
            printf("  \t%-3.1f", stu[i].total);
        printf("\n");         
    }
fclose(fp);
}
图片附件: 游客没有浏览图片的权限,请 登录注册



[ 本帖最后由 有容就大 于 2012-1-4 21:06 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-01-04 20:56
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:0 
我艹,写的好全面

认为事物非黑即白是缺智慧的表现……
2012-01-05 20:19
wsj3000
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:78
专家分:161
注 册:2009-8-4
收藏
得分:0 
建议你还是调用qsort吧,这样比较方便些。
2012-01-05 21:40
uestchp
Rank: 1
等 级:新手上路
帖 子:3
专家分:5
注 册:2012-1-7
收藏
得分:0 
写的都不错
2012-01-07 14:56
快速回复:c语言难题
数据加载中...
 
   



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

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