首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

学生成绩管理系统,该怎么处理

2013-09-12 
学生成绩管理系统现有学生成绩信息文件1(1.txt),内容如下姓名学号语文数学英语张明明01677882李成友027891

学生成绩管理系统
现有学生成绩信息文件1(1.txt),内容如下
姓名    学号   语文  数学   英语    
张明明  01     67    78      82
李成友  02     78    91      88
张辉灿  03     68    82      56
王露    04     56    45      77
陈东明  05     67    38      47
….      ..      ..     ..       …
学生成绩信息文件2(2.txt),内容如下:
姓名    学号   语文  数学   英语    
陈果    31     57    68      82
李华明  32     88    90      68
张明东  33     48    42      56
李明国  34     50    45      87
陈道亮  35     47    58      77
….      ..      ..     ..       …
试编写一管理系统,要求如下:
①实现对两个文件数据进行合并,生成新文件3.txt;
②抽取出三科成绩中有补考的学生并保存在一个新文件4.tx;
③对合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现);
④输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现);
⑤要求使用结构体,链或数组等实现上述要求;
⑥采用多种方法且算法正确者,可适当加分。
实现功能:输入、输出、插入、删除、查找、追加、读入、显示、保存、拷贝、排序、索引、分类合计、退出。
数据 结构 合并 管理 算法
[解决办法]
打断点,调试,跟踪,这些你得自己多调调。

乱码一般是未初始化或者指针指向错误。


[解决办法]

#include "stdafx.h"

#include <iostream.h>



struct stu 
{
char name[20];
int  xuehao;
int yuwen;
int shuxue;
int yingyu;
}st1[5],st2[5],st3[10],*sst1,*sst2,*sst3;

int main(int argc, char* argv[])
{

sst1=st1;
sst2=st2;
sst3=st3;
FILE *fp3;
if ((fp3=fopen("E:\\3.txt","wb+"))==NULL)
{
printf("cannot open file3!\n");
}

FILE *fp1;
if ((fp1=fopen("E:\\1.txt","rb"))==NULL)
{
printf("cannot open file1!!!\n");
}

fread(sst3,sizeof(struct stu),6,fp1);

printf("%s%2d%3d%4d%5d%6d\n",sst3->name,sst3->xuehao,sst3->yuwen,sst3->shuxue,sst3->yingyu);
fwrite(sst3,sizeof(struct stu),6,fp3);
fclose(fp1);
FILE *fp2;
if ((fp2=fopen("E:\\2.txt","rb+"))==NULL)
{
printf("cannot open file2!\n");
}

fread(sst3,sizeof(struct stu),6,fp2);

printf("%s%2d%3d%4d%5d%6d\n",sst3->name,sst3->xuehao,sst3->yuwen,sst3->shuxue,sst3->yingyu);
fclose(fp2);

fseek(fp3,sizeof(struct stu),2);
fwrite(sst3,sizeof(struct stu),6,fp3);


fclose(fp3);
//cout<<"haha\rxi"<<endl;
return 0;
}


[解决办法]
是不是要文件字节对齐?
引用:
学生成绩管理系统源代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
typedef struct LNode
{
char name[6];
int no;
int yw;
int sx;
int yy;
struct LNode *next;
}LinkList;
struct NameNo
{
int no;
int yw;
int sx;
int total;
char name[6];
}st[10];
FILE *fp,*fp1;
char ch,sname[6];
int x,i,j;
NameNo tmp;
LinkList *p,*s;
printf("\n");
printf("-------------------------------");
printf("学生成绩管理系统");
printf("--------------------------------");
printf("\n\n");
printf("在您的C盘根目录下是否有cj1.txt和cj2.txt文件?如果有请输入,1");
printf("否则输入0;如果没有,那么程序将终止! 1 or 0?");
scanf("%d",&i);
if(i==0) return 0;
printf("\n\n");
printf("对cj1.txt和cj2.txt进行合成请按‘1’");
scanf("%d",&i);
if(i!=1) return 0;
printf("正在把cj1.txt和cj2.txt中的数据进行合并\n");
printf("......\n.....\n....\n...\n..\n.\n");
if((fp=fopen("c:\\cj1.txt","rt"))==NULL) 
{
printf("无cj1.txt文本文件,程序结束。\n");
return 0;
}
fp1=fopen("c:\\cj3.txt","wt");
ch=fgetc(fp);
while(ch!=EOF)
{
fputc(ch,fp1);


ch=fgetc(fp);
}
fclose(fp1);
fclose(fp);
if((fp=fopen("c:\\cj2.txt","rt"))==NULL) 
{
printf("无cj12.txt文本文件,程序结束。\n");
return 0;
}
fp1=fopen("c:\\cj3.txt","a");
for(i=0;i<37;i++)
fgetc(fp);
ch=fgetc(fp);
while(ch!=EOF)
{
fputc(ch,fp1);
ch=fgetc(fp);
}
fclose(fp1);
fclose(fp);
printf("合并成功!现在你可以在C盘根目录下看到一个cj3.txt文件\n");
printf("\n\n");
p=(LinkList *)malloc(sizeof(LinkList));
p->next=NULL;
fp=fopen("c:\\cj3.txt","rt");
for(i=0;i<36;i++)
fgetc(fp);
ch=fgetc(fp);
while(ch!=EOF)
{
s=(LinkList *)malloc(sizeof(LinkList));
fgets(s->name,7,fp);
for(i=0;i<5;i++)
fgetc(fp);
x=fgetc(fp)-48;
x=x*10+fgetc(fp)-48;
s->no=x;
for(i=0;i<5;i++)
fgetc(fp);
x=fgetc(fp)-48;
        x=x*10+fgetc(fp)-48;
s->yw=x;
for(i=0;i<5;i++)
fgetc(fp);
x=fgetc(fp)-48;
x=x*10+fgetc(fp)-48;
s->sx=x;
for(i=0;i<5;i++)
fgetc(fp);
x=fgetc(fp)-48;
x=x*10+fgetc(fp)-48;
s->yy=x;
s->next=p->next;
p->next=s;
ch=fgetc(fp);
}
fclose(fp);
printf("对cj3.txt中有不及格的学生信息生成cj4.txt请按‘1’");
scanf("%d",&i);
if(i!=1) return 0;
printf("正在生成cj4.txt\n");
printf("......\n.....\n....\n...\n..\n.\n");
if(i==1)
fp=fopen("c:\\cj4.txt","wt");
fputs("姓 名   学号  语文   数学  英语",fp);
fclose(fp);
fp=fopen("c:\\cj4.txt","a");
s=p->next;
while(s!=NULL)
{
if(s->yw<60
[解决办法]
s->sx<60
[解决办法]
s->yy<60)
{
ch='\n';
fputc(ch,fp);
fputs(s->name,fp);
for(i=0;i<5;i++)
{
ch=' ';
fputc(ch,fp);
}
ch=s->no/10+48;
fputc(ch,fp);
ch=s->no-(s->no/10)*10+48;
fputc(ch,fp);
for(i=0;i<5;i++)
{
ch=' ';
fputc(ch,fp);
}
ch=s->yw/10+48;
fputc(ch,fp);
ch=s->yw-(s->yw/10)*10+48;
fputc(ch,fp);
for(i=0;i<5;i++)
{
ch=' ';
fputc(ch,fp);
}
ch=s->sx/10+48;
fputc(ch,fp);
ch=s->sx-(s->sx/10)*10+48;
fputc(ch,fp);
for(i=0;i<5;i++)
{
ch=' ';
fputc(ch,fp);
}
ch=s->yy/10+48;
fputc(ch,fp);
ch=s->yy-(s->yy/10)*10+48;
fputc(ch,fp);


s=s->next;
}
else
s=s->next;
}
fclose(fp);
printf("生成成功!现在你可以在C盘根目录下看到一个cj4.txt文件");
printf("\n\n");
s=p->next;
for(i=0;i<10;i++)
{
st[i].no=s->no;
st[i].yw=s->yw;
st[i].sx=s->sx;
st[i].total=s->yw+s->sx+s->yy;
for(j=0;j<7;j++)
st[i].name[j]=s->name[j];
s=s->next;
}
printf("用直接插入法排序请按‘1’:");
scanf("%d",&i);
printf("\n\n");
if(i==1)
{
for(i=1;i<10;i++)
{
tmp=st[i];
j=i-1;
while(j>=0&&tmp.total>st[j].total)
{
st[j+1]=st[j];
j--;
}
st[j+1]=tmp;
}
printf("              直接插入法排序后总分从大到小排序为\n");
printf("\n\n");
printf("姓 名   学号  语文   数学  英语  总分\n");
for(i=0;i<10;i++)
{
if(st[i].no<10)
{
printf("%s     ",st[i].name);
printf("%d",0);
printf("%d     ",st[i].no);
printf("%d     ",st[i].yw);
printf("%d     ",st[i].sx);
printf("%d     ",st[i].total-st[i].yw-st[i].sx);
printf("%d\n",st[i].total);
printf("\n");
}
else
{
    printf("%s     ",st[i].name);
    printf("%d     ",st[i].no);
    printf("%d     ",st[i].yw);
    printf("%d     ",st[i].sx);
    printf("%d     ",st[i].total-st[i].yw-st[i].sx);
printf("%d\n",st[i].total);
    printf("\n");
}
}
}
printf("将排好序的数组打乱\n");
printf("\n");
s=p->next;
for(i=0;i<10;i++)
{
st[i].no=s->no;
st[i].yw=s->yw;
st[i].sx=s->sx;
st[i].total=s->yw+s->sx+s->yy;
for(j=0;j<7;j++)
st[i].name[j]=s->name[j];
s=s->next;
}
printf("用冒泡法排序请按‘1’:");
scanf("%d",&i);
printf("\n\n");
if(i==1)
{
for(i=0;i<9;i++)
{
for(j=9;j>i;j--)
if(st[j].total>st[j-1].total)
{
tmp=st[j];
    st[j]=st[j-1];
    st[j-1]=tmp;
}
}
printf("              冒泡法排序后总分从大到小排序为\n");
printf("\n\n");
printf("姓 名   学号  语文   数学  英语  总分\n");


for(i=0;i<10;i++)
{
if(st[i].no<10)
{
printf("%s     ",st[i].name);
printf("%d",0);
printf("%d     ",st[i].no);
printf("%d     ",st[i].yw);
printf("%d     ",st[i].sx);
printf("%d     ",st[i].total-st[i].yw-st[i].sx);
printf("%d\n",st[i].total);
printf("\n");
}
else
{
    printf("%s     ",st[i].name);
    printf("%d     ",st[i].no);
    printf("%d     ",st[i].yw);
    printf("%d     ",st[i].sx);
    printf("%d     ",st[i].total-st[i].yw-st[i].sx);
printf("%d\n",st[i].total);
    printf("\n");
}
}
}
printf("\n");
printf("请输入你要查找的学生姓名:(注意:如果名字为两个字,则中间用两个空格!)\n");
do{
x=1;
if(i==1)
printf("输入姓名:");
getchar();
for(i=0;i<7;i++)
sname[i]=getchar();
for(i=0;i<10;i++)
{
for(j=0;st[i].name[j]==sname[j];j++){}
if(j==6)
{  
printf("                      数组中查找结果");
printf("\n\n");
printf("姓 名   学号  语文   数学  英语  总分\n");
printf("%s",st[i].name);
    printf("     %d",st[i].no);
        printf("     %d",st[i].yw);
    printf("     %d",st[i].sx);
        printf("     %d",st[i].total-st[i].yw-st[i].sx);
    printf("     %d\n\n",st[i].total);
x=0;
}
}
if(x!=0)
printf("                 查无此人!\n");
s=p->next;
while(s!=NULL)
{
for(i=0;s->name[i]==sname[i];i++){}
if(i==6)
{
printf("                      链表中查找结果");
printf("\n\n");
printf("姓 名   学号  语文   数学  英语  总分\n");
    printf("%s",s->name);
    printf("     %d",s->no);
        printf("     %d",s->yw);


    printf("     %d",s->sx);
        printf("     %d",s->yy);
printf("     %d\n\n",s->yw+s->sx+s->yy);
x=0;
}
s=s->next;
}
if(x!=0)
printf("                 查无此人!\n");
i=0;
printf("继续查找请按‘1’");
scanf("%d",&i);
}
while(i==1);
printf("\n\n");
printf("-----------------------------谢谢使用!--------------------------------\n\n");
}
求大神帮忙改改这程序怎么运行的时候老是出乱码?


[解决办法]
引用:
Quote: 引用:

Quote: 引用:

用c实现,确实有难度!不过都能实现的,能不能用容器?

C语言完全可以解决这个问题,只是写不写的问题。不要小看C语言哦。

方便的话能不能帮忙把前两个问题的代码写一下????

可以,不过现在没时间呢!很抱歉~

热点排行