《C语言程序设计基础》上机实验报告模版.docx

上传人:b****5 文档编号:7657768 上传时间:2023-01-25 格式:DOCX 页数:34 大小:189.73KB
下载 相关 举报
《C语言程序设计基础》上机实验报告模版.docx_第1页
第1页 / 共34页
《C语言程序设计基础》上机实验报告模版.docx_第2页
第2页 / 共34页
《C语言程序设计基础》上机实验报告模版.docx_第3页
第3页 / 共34页
《C语言程序设计基础》上机实验报告模版.docx_第4页
第4页 / 共34页
《C语言程序设计基础》上机实验报告模版.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

《C语言程序设计基础》上机实验报告模版.docx

《《C语言程序设计基础》上机实验报告模版.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计基础》上机实验报告模版.docx(34页珍藏版)》请在冰豆网上搜索。

《C语言程序设计基础》上机实验报告模版.docx

《C语言程序设计基础》上机实验报告模版

(此文档为word格式,下载后您可任意编辑修改!

成都信息工程学院计算机系

 

实验课程:

C语言程序设计2

实验项目:

职工管理系统

指导教师:

李莉丽

学生姓名:

桂柯

学生学号:

班级:

计科3班

实验地点:

5201

实验时间:

2011年5月11日点~点

实验成绩:

评阅老师:

李莉丽

(说明:

实验报告必须包含下面的每项内容,根据实验情况认真填写,封面必须打印或复印(A4纸),书写上机实验报告内容的纸张也用A4纸,最后从侧面装订)

一【上机实验目的】

通过亲自设计程序,可以令我们熟悉c语言操作,更熟练的掌握c语句。

初步体会编程的过程,为将来的程序深入学习打下基础和培养兴趣。

二【实验环境】

TC2.0

三【上机实验内容】

职工信息管理系统

要求:

职工信息包括职工号,姓名,性别,年龄,学历,工资,住址,电话等(职工号不相等)。

试设计一职工信息管理系统,使之能够提供下列功能:

(1)系统以菜单方式工作

(2)职工信息录入功能(职工信息用文件保存)

(3)职工信息浏览功能

(4)职工信息查询功能,查询方式:

1)按学历查询

2)按职工号查询

(5)职工信息删除,修改功能(可选项)。

思路:

(1)录入并向文件里保存数据的实现思路:

C语言并没有提供由键盘输入数据直接录入文件的功能,只有内存变量向文件写入数据的功能,而由键盘输入数据可以到内存变量,因此实现此部分功能时,应当由键盘将数据放入变量,再由变量写入文件。

这里录入要求不采用书上例子,它是用结构体数组,我们要求只用一个结构体实现。

先将一个人的信息放入结构体,将这个结构体数据写入文件后,再将下一个人的信息继续放在这个结构体中,再将这个结构体写入文件。

这样节省内存空间。

计算并修改文件里数据的实现思路:

这部分的功能的实现应当先将文件的数据读到变量当中,在变量当中完成计算,再将数据写入文件。

如果只是修改文件的数据,并不计算,则可以直接定位到文件中相应的位置,写入数据,则把原来的数据覆盖以完成修改。

(2)向文件里追加数据的实现思路:

文件本身提供了这项功能,只要以“a”的方式打开就行。

然后向文件写入的数据,直接放在文件末尾。

(3)查找文件里是否有某项数据的实现思路:

C语言并没有提供判断文件内容的功能,必须将文件内容读到变量里再进行判断。

实际的查找可能是在大量的数据里的查找,高效的查找是折半查找(下学期的数据结构专门讲这一内容),折半的前提是排序,因此需先对排序后的文件读出,以折半方式查找。

(这要要求,是希望巩固折半查找与排序两个重要算法,至于它的时空效率是否高,可以学完《数据结构》知识后自己再判断)。

(4)根据要求显示文件里的某些数据或全部数据的实现思路:

C语言没有提供将文件内容显示的功能,所以需要将文件内容读到变量里,再显示变量。

(5)在文件里插入或删除某项数据的实现思路:

C语言同样没有直接提供该项功能,因此必须借由内存变量完成。

由以前的知识知道,在大量的数据里删除一个数,用数组表示不合适,因为涉及到大量的数据的移动,用链表是合适的,效率高(关于这一点,在《数据结构》这门课有详细的讲解)。

因此完成这部分操作要求用链表实现,先将文件里的数据读出组织成链表,在链表上完成插入与删除后,再将链表中的数据写入文件。

(6)按某个数据项进行排序生成排序文件的实现思路:

排序是在数组里实现。

因此先要将文件里的数据读到数组里,将数组排完序后,再将数据写入文件(一般写入一个新文件)。

四【上机调试程序流程图】

1.显示主菜单(以如下程序作为介绍)

2.添加职工信息

3.浏览职工信息。

4.查询职工信息。

4

(1)根据标号查询职工信息。

(2)根据姓名查询职工信息。

(3)根据年龄查询职工信息。

5.修改职工信息。

浏览修改后的职工信息。

6.删除职工信息。

浏览删除后的职工信息。

7.用链表添加职工信息。

浏览添加后的职工信息。

五【上机调试中出现的错误信息、错误原因及解决办法】

1.光条菜单的错误:

刚开始只能用键盘上的英文字母控制光条上下移动,想用上下箭头的ASCII代码,结果错误不能上下移动

解决方法:

使用键盘扫描码。

2、浏览函数scan()在调试和链接的时候都没有出现错误提示,但在运行的时候出现了问题。

写入指定位置的文件,打开后总会有乱码。

与c语言课本上的例题对照后发现,我写的fopen("wenjian","ab")没有指定文件的存储类型。

解决方法:

在文件名wenjian后面加上.txt后即可。

3.浏览函数scan()遇到的问题虽然不大,但解决起来很麻烦。

理想的运行结果是美观整齐。

即下面的职工信息分别与第一个printf输出的中文项目提示对齐。

解决方法:

不断修改空格个数,不断运行察看效果。

4.程序运行后菜单界面不消失

解决方法:

使用清屏函数,是每次运行后界面还原。

5.功能函数运行完后会跳出界面,直接退出。

解决方法:

在每个功能函数的后面加如返回值。

六【上机调试后的源程序及还存在的问题】

源程序:

#include

#include

#defineESC0x1b/*键盘扫描码*/

#defineENTER0x0d

#defineUP0x48

#defineDOWN0x50

#defineLEFT0x4b

#defineRIGHT0x4d

typedefstruct/*定义存放职工信息的类型*/

{

intNo;

intage;

charname[20];

}WORKERBASIC;

typedefstructworker

{

WORKERBASICworkerinfo;

structworker*next;

}WORKER;

voidcleanscreen()/*清屏*/

{

inti,j;

gotoxy(1,1);

textbackground(RED);

for(i=1;i<=25;i++)

for(j=1;j<=80;j++)

cprintf("");

clrscr();

}

voidInitial()/*定义初始化程序的函数*/

{

inti,j;

charlist[7][20]={"1.Add",/*菜单名*/

"2.Scan",

"3.Edit",

"4.Modify",

"5.Delete",

"6.Into",

"7.Exit"};

cleanscreen();

textbackground(YELLOW);

for(i=1;i<=14;i++)/*画窗口*/

{

for(j=1;j<=80;j++)

{

if(i==1||i==14||j<=2||(j>=79))

cprintf("");

elseif(i>=3&&i<=12&&j>=5&&j<=76)

cprintf("");

else

printf("");

}

}

gotoxy(32,4);

textcolor(BLACK);

cprintf("WELCOME!

");

gotoxy(31,14);

cprintf("WorkerSystem--BYGK");

for(i=0;i<7;i++)/*显示菜单*/

{

gotoxy(34,i+6);

cprintf("%s",list[i]);

}

}

voidPrintPause()/*暂停*/

{

printf("Pressanykeytogoon...");

getch();

}

voidGuangtiao(intflag)/*定义画光条的函数*/

{

charlist[7][20]={"1.Add",

"2.Scan",

"3.Edit",

"4.Modify",

"5.Delete",

"6.Into",

"7.Exit"};

gotoxy(34,flag+5);

textcolor(WHITE);

textbackground(BLACK);

cprintf("%s",list[flag-1]);

textcolor(LIGHTGRAY);

}

intAdd()/*添加信息*/

{

WORKERBASICnew;

FILE*fp=NULL;

charch='y';

while(ch=='y')

{

cleanscreen();

printf("Pleaseinputtheworker'sNo.");

scanf("%d",&new.No);

getchar();

printf("Pleaseinputtheworker'sage:

");

scanf("%d",&new.age);

getchar();

printf("Pleaseinputtheworker'sname:

");

scanf("%s",new.name);

getchar();

if((fp=fopen("wenjian.txt","ab"))==NULL)

{

fp=fopen("wenjian.txt","wb");

}

if(fwrite(&new,sizeof(WORKERBASIC),1,fp)!

=1)

{

printf("addfailed!

\n");

PrintPause();

}

fclose(fp);

printf("whethergoon(yorn):

");

scanf("%c",&ch);

}

return0;

}

intScan()/*查看信息*/

{

WORKERBASICload;

FILE*fp=NULL;

intn=0;

cleanscreen();

if((fp=fopen("wenjian.txt","rb"))==NULL)

{

printf("cannotfindwenjian!

\n");

PrintPause();

return0;

}

printf("---\n");

printf("No.\tworker'sage\tworker'name\n");

while(!

feof(fp))

{

if(fread(&load,sizeof(WORKERBASIC),1,fp)==1)

n++;

else

break;

printf("%d\t%d\t\t%s\n",load.No,load.age,load.name);

}

printf("---\n");

printf("total:

%d\n",n);

fclose(fp);

PrintPause();

return0;

}

voidexchange(WORKERBASIC*max,WORKERBASIC*min)/*调换两个职工在数组中的位置*/

{

WORKERBASICt;

strcpy(t.name,max->name);

t.No=max->No;

strcpy(max->name,min->name);

max->No=min->No;

strcpy(min->name,t.name);

min->No=t.No;

}

intEditByNo(WORKERBASIC*F1,intn)/*按编号查找*/

{

inti,j,k,num,high,low,mid,flag=0;

for(i=0;i

{

k=i;

for(j=i+1;j

{

if(((F1+k*sizeof(WORKERBASIC))->No)>((F1+j*sizeof(WORKERBASIC))->No))

{

k=j;

}

}

if(k!

=i)

exchange((F1+i*sizeof(WORKERBASIC)),(F1+k*sizeof(WORKERBASIC)));

}

/*此显示信息只为说明职工已按编号排序,该部分可删除*/

printf("---\n");

printf("No.\tworker'age\t\tworker'name\n");

for(i=0;i

printf("%d\t%d\t\t\t%s\n",(F1+i*sizeof(WORKERBASIC))->No,(F1+i*sizeof(WORKERBASIC))->age,

(F1+i*sizeof(WORKERBASIC))->name);

printf("---\n");

printf("\nPleaseinputanumberyouwanttosearch:

");

scanf("%d",&num);

getchar();

low=0;/*折半法*/

high=n-1;

while((low<=high)&&(flag==0))

{

mid=(low+high)/2;

if(num>((F1+mid*sizeof(WORKERBASIC))->No))

low=mid+1;

elseif(num<((F1+mid*sizeof(WORKERBASIC))->No))

high=mid-1;

elseif(num==((F1+mid*sizeof(WORKERBASIC))->No))

flag=1;

}

if(flag==0)

{

printf("cannotfindtheworker!

\n");

}

else

{

printf("---\n");

printf("No.\tworker'age\t\tworker'name\n");

printf("%d\t%d\t\t\t%s\n",(F1+mid*sizeof(WORKERBASIC))->No,(F1+mid*sizeof(WORKERBASIC))->age,

(F1+mid*sizeof(WORKERBASIC))->name);

printf("---\n");

}

PrintPause();

return0;

}

intEditByName(WORKERBASIC*F1,intn)/*按姓名查找*/

{

charstr[20];

inti,j,k,flag=0,low,high,mid;

for(i=0;i

{

k=i;

for(j=i+1;j

{

if(strcmp((F1+k*sizeof(WORKERBASIC))->name,(F1+j*sizeof(WORKERBASIC))->name)>0)

{

k=j;

}

}

if(k!

=i)

exchange((F1+i*sizeof(WORKERBASIC)),(F1+k*sizeof(WORKERBASIC)));

}

/*此显示信息只为说明职工已按名字排序,该部分可删除*/

printf("---\n");

printf("No.\tworker'age\t\tworker'name\n");

for(i=0;i

{

printf("%d\t%d\t\t\t%s\n",(F1+i*sizeof(WORKERBASIC))->No,(F1+i*sizeof(WORKERBASIC))->age,

(F1+i*sizeof(WORKERBASIC))->name);

}

printf("---\n");

printf("\nPleaseinputaworkeryouwanttoexactlysearch:

");

scanf("%s",str);

getchar();

low=0;/*折半法*/

high=n-1;

while((low<=high)&&(flag==0))

{

mid=(low+high)/2;

if(strcmp(str,(F1+mid*sizeof(WORKERBASIC))->name)>0)

low=mid+1;

elseif(strcmp(str,(F1+mid*sizeof(WORKERBASIC))->name)<0)

high=mid-1;

elseif(strcmp(str,(F1+mid*sizeof(WORKERBASIC))->name)==0)

flag=1;

}

if(flag==0)

{

printf("cannotfindtheworker!

\n");

}

else

{

printf("---\n");

printf("No.\tworker'age\t\tworker'name\n");

printf("%d\t%d\t\t\t%s\n",(F1+mid*sizeof(WORKERBASIC))->No,

(F1+mid*sizeof(WORKERBASIC))->age,(F1+mid*sizeof(WORKERBASIC))->name);

printf("---\n");

}

PrintPause();

return0;

}

intEditByage(WORKERBASIC*F1,intn)/*按年龄查找*/

{

inta,flag=0,i;

printf("---\n");

printf("No.\tworker'age\t\tworker'name\n");

for(i=0;i

printf("%d\t%d\t\t\t%s\n",(F1+i*sizeof(WORKERBASIC))->No,(F1+i*sizeof(WORKERBASIC))->age,

(F1+i*sizeof(WORKERBASIC))->name);

printf("---\n");

printf("\nPleaseinputworker'age:

");

scanf("%d",&a);

getchar();

for(i=0;i

{

if(a==((F1+i*sizeof(WORKERBASIC))->age))

{

if(flag==0)

{

printf("---\n");

printf("No.\tworker'age\t\tworker'name\n");

flag=1;

}

printf("%d\t%d\t\t\t%s\n",(F1+i*sizeof(WORKERBASIC))->No,

(F1+i*sizeof(WORKERBASIC))->age,

(F1+i*sizeof(WORKERBASIC))->name);

}

}

if(flag==0)

{

printf("cannotfindtheworker!

\n");

}

else

printf("---\n");

PrintPause();

return0;

}

intEdit()/*查找*/

{

WORKERBASICload,*F1;

intn=0,key=0,i;

FILE*fp=NULL;

cleanscreen();

if((fp=fopen("wenjian.txt","rb"))==NULL)

{

printf("cannotfindwenjian!

\n");

PrintPause();

return0;

}

while(!

feof(fp))/*统计职工的数量*/

{

if(fread(&load,sizeof(WORKERBASIC),1,fp)==1)

n++;

}

fclose(fp);

if(n==0)

{

printf("Noinformationofworker!

\n");

PrintPause();

return0;

}

F1=(WORKERBASIC*)malloc(n*sizeof(WORKERBASIC));/*按职工的人数申请内存空间*/

fp=fopen("wenjian.txt","rb");

for(i=0;i

{

if(fread(F1+i*sizeof(WORKERBASIC),sizeof(WORKERBASIC),1,fp)!

=1)

{

printf("readfailed!

\n");

PrintPause();

return0;

}

}

fclose(fp);

while(key!

=ESC)

{

clrscr();

printf("Pleaseselectsearchmethod:

\n");

printf("\n");

printf("1\t=ByNo.\n");

printf("2\t=ByName.\n");

printf("3\t=Byage.\n");

printf("Esc\t=Exit\n");

printf("\n");

printf("Press123orEsc?

\n");

key=getch();

switch(key)

{

case'1':

key=EditByNo(F1,n);

break;

case'2':

key=EditByName(F1,n);

break;

case'3':

key=EditByage(F1,n);

break;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1