C语言实训报告

实习(实训)报告

 名称      程序逻辑设计与编程规范实训      

20##年 6月 8日至    20##年6月14日共1 周

学院(部)   计算机工程学院        

班   级   计算机网络技术  

姓   名        xxxxx           

         学院(部)负责人      xxxx    

           系  主  任     xxxx     

         指导教师   xxxx xxxx

目    录

一、实训目的与要求... 3

二、题目说明... 3

三、总体设计... 4

3.1.软件模块结构图... 4

3.2.程序流程图:... 4

四、详细设计和实施... 5

4.1.函数详解与代码... 5

4.2运行结果,图片显示:... 15

五、遇到的问题和解决方法... 17

六、实训总结... 18

七、参考文献... 18

附录(源程序代码)... 18

一、实训目的与要求

1、实训目的:

    利用《程序逻辑设计与编程规范》课程中所学到的编程知识和编程技能,完成达到规定难度和工作量的程序设计题目,帮助掌握编程、调试的基本技能。

通过亲自设计程序,熟悉c语言操作,更熟练的掌握c语句。初步体会编程的过程,为将来的程序深入学习打下基础和培养兴趣。

2、实训要求:

在实训过程中要求态度认真、重视实训环节,用严谨、科学和踏实的工作态度对待实训的每一项任务;按照实训的题目要求,独立地完成各项任务,不允许相互抄袭;按时到机房上机,并接受教师的检查。认真编写实训报告。

编辑c语言需要细心、耐心,还必须有钻研精神。在调试程序时需要反复的修改代码,以确保运行结果正确。

二、题目说明

职工信息管理系统设计

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

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

1、系统以菜单方式工作

2、职工信息录入功能--输入

3、职工信息浏览功能--输出

4、职工信息查询功能--算法

查询方式 : 按学历查询等;  按职工号查询等;

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

三、总体设计

3.1.软件模块结构图

组织结构图

3.2.程序流程图:

四、详细设计和实施

4.1.函数详解与代码

1、定义头文件、主函数:main( )

先声明所有将会调用到的函数名。再运用选择函数switch即可根据使用者所输入的功能代号进入对应的功能程序。定义一个全局指针变量*p和全局变量a。a表示当前系统中职工人数,p指向a的地址,追踪人数变化,这样在添加或者删除导致人数变化后,浏览函数display()能够正确显示出当前人数的职工信息。宏定义define  N指定首次输入的职工人数,可根据需要更改,变化。

#include<stdio.h>

#include <string.h>

#include<conio.h>

#define N 3

struct employee

{

int number,age,wage;

char name[20],sex[10],address[30],xueli[20];

long int telephone;

}em[N];                        

int a=N;                      

int *p=&a;                      

main(  )

{  

void search();

    void search_name();

    void search_xueli();

    void search_number();

    void load();

    void display();

void del();

void input();

void add();

void save();             

    int n;

    printf("\n");

    printf("        ******************职工信息管理****************\n");

    printf("\n");

printf("                        1.录入职工信息\n");

    printf("                        2.浏览职工信息\n");

    printf("                        3.查询职工信息\n");

    printf("                        4.删除职工信息\n");

    printf("                        5.添加职工信息\n");

    printf("                        6.退出\n");

    printf("\n");

    scanf("%d",&n);

     switch(n)

     {

        case 1:printf("      输入职工信息\n");

printf("\n");input( );main( );break;

       case 2:printf("      浏览职工信息\n");

printf("\n");display(*p);main( );break;

       case 3:printf("        查询职工信息\n");

printf("\n");search();break;

       case 4:printf("       删除职工信息\n");

printf("\n");del(p);break;

       case 5:printf("       添加职工信息\n");

printf("\n");add(p);break;

       case 6:exit(0);break;

            default :break;

  }

}

2.输入函数void input()

   用for语句来循环输入职工的信息,printf语句提示需要输入的内容,scanf语句输入相应的信息。输入结束再用保存函数save(N)将输入的信息放入指定的文件d:\\abc.txt

   void input()      

{

int i;

for(i=0;i<N;i++)

{

printf("请输入职工号: ");

    scanf("%d",&em[i].number);

    printf("请输入姓名:  ");

    scanf("%s",em[i].name);

    printf("请输入性别:  ");

    scanf("%s",&em[i].sex);

    printf("请输入年龄:  ");

    scanf("%d",&em[i].age);

    printf("请输入学历:  ");

    scanf("%s",em[i].xueli);

    printf("请输入工资:  ");

    scanf("%d",&em[i].wage);

    printf("请输入住址:  ");

    scanf("%s",em[i].address);

    printf("请输入电话:  ");

    scanf("%d",&em[i].telephone);

    printf("\n");

    }

printf("\n创建完毕!\n");

    save(N);

}

 3.保存函数void save(int m)

    定义整形变量i,文件指针,fopen打开指定的文件。先用if语句判断文件是否打开成功,若返回值为0,则继续操作。用for循环通过fprintf语句将数组em中的内容保存在文件中。

void save(int m)         

{

int i;

FILE*fp;

if(!(fp=fopen("d:\\abc.txt","w")))

{

printf("打开失败");

exit(0);

}

for(i=0;i<m;i++)

fprintf(fp," %d  %5s   %5s   %d  %s  %d  %s  %ld \n",em[i].number,

em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,

em[i].address,em[i].telephone);

fclose(fp);

}  

4.导出函数void load(int b)

     定义整形变量i和文件指针,先用if语句判断文件是否打开成功,若返回值为0,则继续操作。用for循环通过fscanf语句将文件中的信息取出放到数组em中。

 void load(int b)            

{

int i;

FILE*fp;

if(!(fp=fopen("d:\\abc.txt","r")))

{

printf("打开失败");

exit(0);

}

else

for(i=0;i<b;i++)

fscanf(fp," %d  %5s   %5s   %d  %s  %d  %s  %ld \n",&em[i].number,&em[i].name,&em[i].sex,&em[i].age,&em[i].xueli,&em[i].wage,&em[i].address,&em[i].telephone);

fclose(fp);

}

5.浏览函数void display(int a)

声明整形变量i和b,其中i记录输出的职工序数,b用来接收调用浏览函数时所传递过来的实参,接着将其值传递给导出函数load(b),使得导出的职工人数与浏览的职工人数保持一致。通过调用load函数,用for循环输出每个职工的各种信息。

void display(int a)          

{

    int i,b=a;               

load(b);                

printf("\n职工号  姓名 性别  年龄  学历  工资  住址  电话\n");

for(i=0;i<a;i++)

printf("%d  %5s   %5s   %d  %s  %d  %s  %ld\n",em[i].number,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].address,em[i].telephone);

printf("\n");

}

6 .查询函数void   search(  )

声明整形变量t,先用 printf语句显示查询菜单,用 scanf输入选择的查询方式代号,用switch(t)进入所选择的具体查询函数,包括按职工号查询、按姓名查询、按学历查询三种方式.

void search( )            

{

int t;

printf("\n按职工号查询按1\n按姓名查询请按2");

printf("\n按学历查询请按3\n返回主菜单请按4\n");

scanf("%d",&t);

    switch(t)

{

case 1:printf("\n按职工号查询\n");search_number(); break;

case 2:printf("\n按姓名查询\n");search_name();  break;

case 3:printf("\n按学历查询\n");search_xueli(); break;

case 4:main();break;               

default :printf("输入错误,请重新输入!\n");

    search(  );                        

break;

}

}

7.三种方式查询职工信息:按职工号查询;按姓名查询;按学历查询。

按职工号查询void search_number()

     声明整形变量i,number,调用导出函数load(*p)。用scanf语句输入要查询的职工号,用for循环判断em.number中是否有输入的职工号,若有,则输出相应信息,跳出循环。若没有,则输出“查无此人”,返回查询菜单。

void search_number()           

{

int i,number;

load(*p);                

printf("\n请输入要查询的职工号:");

scanf("%d",&number);

for(i=0;i<*p;i++)

if(number==em[i].number)

{

printf("\n该职工信息如下:\n");

printf("\n职工号  姓名  性别  年龄  学历  工资  住址 电话\n");

printf("%d  %5s   %5s   %d  %s  %d  %s  %ld\n",em[i].number,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].address,em[i].telephone);

        printf("\n");

break;

}

if(i==*p)

printf("\n查无此人\n");

 search();

}

按姓名查询void search_name( )

    声明整形变量i和字符型数组name[20],调用导出函数load(*p)。用scanf语句输入要查询的职工名字,用for循环,if语句判断em.name中是否有输入的职工信息,若有,则 输出相应信息;若无,则输出“查无此人”,返回查询菜单。

void search_name()          

{

int i;

char name[20];

load(*p);                 

printf("\n请输入要查询的姓名:");

scanf("%s",name);

for(i=0;i<*p;i++)

if(!strcmp(em[i].name,name))

{

printf("\n该职工信息如下:\n");

printf("\n职工号  姓名  性别  年龄  学历  工资  住址  电话\n");

printf("%d  %5s   %5s   %d  %s  %d  %s  %ld\n",em[i].number,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].address,em[i].telephone);

        printf("\n");

break;

}

if(i==*p)

printf("\n查无此人\n");

    search();

}

按学历查询void search_xueli( )

     声明整形变量i,k,字符型数组xueli[20]。调用导出函数,用scanf输入要查询的职工学历,查询时可能有多个职工有相同的学历,采用另一种方法,判断并执行一次后继续循环,找出所有相同学历的职工;解决输入错误提示“查无此人”,还得需要一段for循环,通过k记录循环的次数,若最后仍无结果,则输出“查无此人”,返回查询菜单。

void search_xueli()             

{

int i,k=0;

char xueli[20];

load(*p);                

printf("\n请输入要查询的学历:");

scanf("%s",xueli);

for(i=0;i<*p;i++)

if(!strcmp(em[i].xueli,xueli))

{

printf("职工号  姓名  性别  年龄  学历  工资  住址   电话\n");

printf("%d  %5s   %5s   %d  %s  %d  %s  %ld\n",em[i].number,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].address,em[i].telephone);

}

for(i=0;i<*p;i++)                

{

if(!strcmp(em[i].xueli,xueli))

break;

else k++;

}

if(k==*p)

printf("\n查无此人\n");

    search();

}

8.删除函数void del(int *b)

声明整形变量i,j,t,m,a和char形数组name[20]。调用浏览函数display(a),显示所有职工信息。用printf语句提示“输入要删除的职工名字”,用scanf语句输入删除对象名字。用for循环,先判断em.name中是否存在所输入的名字。若存在,printf语句提示是否确认删除,用scanf语句输入确认指令,再用for循环从要删除的这个职工开始,依次用后一个职工的信息覆盖前一个的。循环结束后当前职工人数a自减1,并保存,跳出大循环;若不存在,输出“输入错误,无此人”。再将a的新值附给*b,实参p所指的人数地址中的人数也随即改变删除后的人数。printf提示下一步操作“继续删除请按1\n浏览信息请按2\n返回主菜单请按3”。switch根据键盘输入的指令代号选择下一步连接的函数。

void del(int *b)

{

int i,t,j,m;

int a=*b;

char name[20];

printf("\n所有职工信息:\n");

    display(a);                                 

printf("\n请输入要删除职工的名字:");

scanf("%s",name);

for(i=0;i<a;i++)

{

if(!strcmp(em[i].name,name))

{

printf("\n确认删除请按1\n取消请按2\n");

scanf("%d",&t);

if(t==1)

{                                

for(j=i;j<a-1;j++)

{

em[j].age=em[j+1].age;

em[j].wage=em[j+1].wage;

em[j].number=em[j+1].number;

em[j].telephone=em[j+1].telephone;

strcpy(em[j].xueli,em[j+1].xueli);

strcpy(em[j].name,em[j+1].name);

strcpy(em[j].address,em[j+1].address);

strcpy(em[j].sex,em[j+1].sex); 

}

a--;

save(j);            

break;

}

            if(t==2)

break;

}

}

if(i==a)

     printf("\n输入错误,无此人\n");

*b=a;

printf("\n继续删除请按1\n浏览信息请按2\n返回主菜单请按3\n");

scanf("%d",&m);

switch(m)

{

        case 1:del(p);break;         

        case 2:display(*b);main();break;     

case 3:main();break;

        default:break;

}

}

9.添加函数void add(int *a)

     声明整形变量i,n,m,定义指针文件fp,追加打开文件,若打开失败,则退出;若成功,则继续操作,用for循环输入要添加的信息,再用另外一个for循环将输入的信息写入文件中,关闭文件。再调用switch语句选择下一步操作,并连接到相应函数。

void add(int *a)              

{

int i,n,m;

FILE*fp;

if(!(fp=fopen("d:\\abc.txt","a")))

{

printf("打开失败");

exit(0);

}

printf("\n请输入想添加的人数:\n");

scanf("%d",&n);

for(i=*a;i<n+(*a);i++)                   

{

printf("请输入职工号: ");

        scanf("%d",&em[i].number);

        printf("请输入姓名:  ");

        scanf("%s",em[i].name);

        printf("请输入性别:  ");

        scanf("%s",&em[i].sex);

        printf("请输入年龄:  ");

        scanf("%d",&em[i].age);

        printf("请输入学历:  ");

        scanf("%s",em[i].xueli);

        printf("请输入工资:  ");

        scanf("%d",&em[i].wage);

        printf("请输入住址:  ");

        scanf("%s",em[i].address);

        printf("请输入电话:  ");

        scanf("%d",&em[i].telephone);

printf("\n");

}

printf("\n添加完毕\n");

for(i=*a;i<n+(*a);i++)

fprintf(fp," %d  %5s   %5s   %d  %s  %d  %s  %ld \n",em[i].number,

em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,

em[i].address,em[i].telephone);

fclose(fp);

*a=*a+n;              

printf("\n浏览新信息请按1\n返回主菜单请按2\n");

scanf("%d",&m);

switch(m)

{

case 1:display(*a);main();break;

case 2:main();break;

default:break;

}

}

4.2运行结果,图片显示:




五、遇到的问题和解决方法

整个程序代码是分块书写的,每个函数都可以独立运行。只有输入函数查询菜单函数写得很顺利,一次性就能够成功运行,其他函数在调试过程中或多或少都出现了问题。

1、保存函数save()在调试和链接的时候都没有出现错误提示,但在运行的时候出现了问题。写入指定位置的文件,打开后总会有乱码。与c语言课本上的例题对照后发现,我写的fopen("d:\\bbb","w")没有指定文件的存储类型。解决方法:在文件名bbb后面加上.txt后即可。 

2、导出函数load()遇到两个问题。1是为图方便直接将保存函数复制过来进行修改时,忘了修改文件的打开方式,不能运行。经多次检查后终于发现了,解决:将只写"w"改为只读"r"。2是用fscanf语句时,漏写地址符。调试和链接都没问题,但点击运行后,总出现一个提示出错的蓝色小窗口。经老师提时候发现了错误所在。解决:在em[i].name等之前加上地址符。 

3、浏览函数display()遇到的问题虽然不大,但解决起来很麻烦。理想的运行结果是美观整齐。即下面的职工信息分别与第一个printf输出的中文项目提示对齐。解决方法:不断修改空格个数,不断运行察看效果。

4、按学历查询函数search_xueli(),要考虑输入一种学历,可能对应出很多职工,这就不能延用按姓名和职工号查询中判断是否输入错误的方法了。为了显示出所有具有该学历的职工,就需要让for循环一直运行到最后一个为止。这时计量数i始终会等于职工人数,不能再用i来判断是否不存在此人。这就需要再定一个整形变量k,用来计量单独的一个循环次数。 

5、添加函数add()遇到的问题是用printf输入新职工信息后,保存到文件里面,发现原有的信息不见了。解决:文件打开方式改用"a"追加写入。

六、实训总结

经过一学期的C语言学习,我掌握了C语言的基础知识,能够读懂别人用c语言设计的程序。平时的程序设计大多是以填空的形式出现,虽然有所接触,但都不完全。而这周的课程设计,却让我完完全全用自己学到的知识编写一个完整的体统程序。这是一个新的挑战,也是一种新的学习。

我选择的是题目中的第一个——职工信息管理系统。这需要自己设计一个系统,可以输入信息,保存到文件里,再从文件里调出来,使之显示在屏幕上,进行删除、添加等对信息的修改。初看到这个题目觉得很简单,但当我做到电脑前准备开始编写代码的时候才发现无从下手。通过去图书馆查找程序设计相关的书籍,和上网参考前人编写的类似程序,我脑中才有了一个大概方向。

但具体编写过程中,可谓困难重重。反复调试程序、修改代码,再运行。经过N次之后才成功。

七、参考文献

[1]  实用C语言程序设计教程

 主编:李金祥 顾小晶  副主编:陈静  陈小英  李爱军

附录(源程序代码)

相关推荐