fmjp1 发表于 2006-10-26 13:05:18

第一次做的一道题目,觉不错,希望各位前辈指点一下。

/*    题目:有6个学生,每个学生有3门功课的成绩。要求输入(学号,姓名,3门功课的成绩),
            并计算出平均成绩,所有数据按照平均成绩排序后存放在磁盘文件“学生.txt"中.
*/

#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#defineNUM6
#defineFORMAT"%-8s%-8s%-8.2f%-8.2f%-8.2f%.2f\n"

int _tmain(int argc, _TCHAR* argv[])
{
   
    struct student                                                   /*定义一个结构体类型*/
    {
      char number;
      char name;
      float score;
      float average;
    };

    struct student stud;
    int i;

    for(i=0;i<NUM;i++)                                          
    {
      printf("\n请输入第%d位学生的学号、姓名及各门功课的成绩!\n",i+1);
      Loop1:
      printf("学号:");
      scanf("%s",stud.number);                                     /*输入学号,并判断学号必须为0~9的数字组成的四位的字符串*/
      if(strcmp("0000",stud.number)>0||strcmp("9999",stud.number)<0||strlen(stud.number)!=4)
      {
            printf("您输入的学号有误,请重新输入!\n");
            goto Loop1;
      }
      
      printf("姓名:");                                             /*输入姓名*/
      scanf("%s",stud.name);

      Loop2:
      printf("语文:");
      scanf("%f",&stud.score);                                 /*输入语文成绩*/
      if(stud.score<0||stud.score>100)
      {
            printf("您输入的成绩有误,请重新输入!\n");
            goto Loop2;
      }
      Loop3:
      printf("数学:");                                             /*输入数学成绩*/
      scanf("%f",&stud.score);
      if(stud.score<0||stud.score>100)
      {
            printf("您输入的成绩有误,请重新输入!\n");
            goto Loop3;
      }
      Loop4:
      printf("英语:");                                             /*输入英语成绩*/
      scanf("%f",&stud.score);
      if(stud.score<0||stud.score>100)
      {
            printf("您输入的成绩有误,请重新输入!\n");
            goto Loop4;
      }
      stud.average=(stud.score+stud.score+stud.score)/3.0; /*求出3门功课的平均成绩*/
      printf("平均成绩:%.2f\n",stud.average);
    }

    char temp1;
    char temp;
    float temp2;
    FILE *fp;
   
    for(i=0;i<NUM-1;i++)                                             /*根据平均成绩,按照冒泡法进行排序*/
      for(int j=0;j<NUM-1-i;j++)
      {
            if(stud.average>stud.average)
            {
                strcpy(temp1,stud.number);
                strcpy(stud.number,stud.number);
                strcpy(stud.number,temp1);

                strcpy(temp,stud.name);
                strcpy(stud.name,stud.name);
                strcpy(stud.name,temp);

                temp2=stud.score;
                stud.score=stud.score;
                stud.score=temp2;

                temp2=stud.score;
                stud.score=stud.score;
                stud.score=temp2;

                temp2=stud.score;
                stud.score=stud.score;
                stud.score=temp2;

                temp2=stud.average;
                stud.average=stud.average;
                stud.average=temp2;
            }
      }

    if((fp=fopen("F:\\学生.txt","w"))==NULL)                                 /*打开一个"学生.txt"的文本文件*/
      {
            printf("can not open this file!\n");
            exit(0);
      }

    fprintf(fp,"按平均成绩排序后的学生成绩管理文件:\n");
    fprintf(fp,"\n学号    姓名    语文    数学    英语    平均成绩\n");   /*从“学生.txt”中输出所有数据*/
    for(i=0;i<NUM;i++)
      fprintf(fp,FORMAT,stud.number,stud.name,stud.score,stud.score,stud.score,stud.average);

    fclose(fp);                                                             /*关闭"学生.txt"的文本文件*/
    return 0;
}

sudami 发表于 2006-10-28 09:50:07

怎么没人来啊?

pengpwn 发表于 2006-11-11 10:13:42

嗯,看上去写得挺不错的!

zyytzhxu 发表于 2006-11-27 09:30:36

好好看看,呵呵

sudami 发表于 2006-12-1 17:21:24

你的程序写的有些复杂,没有用到指针、函数iostream.

而且运行不出来!

下面是我写的程序:


#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
struct xinxi
{
        char number; //学号
        char name;//姓名
        int score;//成绩分数
        int average;//成绩平均分
};
xinxi s;
xinxi *paixu(xinxi *p,int n)
{
        xinxi temp;
        int i,j;
    for(i=0;i<n;i++)
      (p+i)->average=((p+i)->score+(p+i)->score+(p+i)->score)/3;
        for(i=0;i<n;i++)
                for(j=i;j<n;j++)
                        if((p+i)->average<(p+j)->average) //按平均分从高向低排序
                        {
                                temp=*(p+i);
                                *(p+i)=*(p+j);
                *(p+j)=temp;
                        }
        return p;
}
void main()
{
        xinxi s,*p;
        int n=6;
        fstream sudami;
        for(int i=0;i<n;i++)
{
cout<<"请输入第"<<i+1<<"个学生信息:"<<endl;
cout<<"学号:"<<endl;
cin>>s.number;
cout<<"姓名:"<<endl;
cin>>s.name;
cout<<"3门课的成绩,依次数学、英语、语文:"<<endl;
cin>>s.score;
cin>>s.score;
cin>>s.score;
}
        p=s;
        paixu(p,n);
sudami.open("d:\\学生.txt",ios::app|ios::in);
if(!sudami)
{
cout<<"打开文件失败!"<<endl;
abort();
}
sudami.seekp(0);
for(i=0;i<n;i++)
{
sudami<<"学号:"<<(p+i)->number<<endl;
sudami<<"姓名:"<<(p+i)->name<<endl;
sudami<<"数学成绩:"<<(p+i)->score<<endl;
sudami<<"英语成绩:"<<(p+i)->score<<endl;
sudami<<"语文成绩:"<<(p+i)->score<<endl;
sudami<<"平均成绩:"<<(p+i)->average<<endl;
sudami<<endl;
}
sudami.close();
}








做的过程的部分截图:
http://space.hackbase.com/attachments/2006/12/5488119_200612011705053.jpg
http://space.hackbase.com/attachments/2006/12/5488119_200612011705051.jpg
http://space.hackbase.com/attachments/2006/12/5488119_200612011705052.jpg

[ 本帖最后由 sudami 于 2007-4-21 09:25 编辑 ]
页: [1]
查看完整版本: 第一次做的一道题目,觉不错,希望各位前辈指点一下。