晓庄-C语言程序设计实验报告[1]

 

C语言程序设计实验报告

学院                      

班级                      

学号                      

姓名                      

指导教师                    


实验1 简单程序设计

1. 实验目的

(1) 熟悉C语言开发环境并掌握在该环境下如何编辑、编译、连接和运行一个C程序。

(2) 通过运行一个简单的C程序过程,初步了解C程序的基本结构及特点。

2.实验要求

将主菜单输出在屏幕上。

运行程序后,其结果如下:

图1-1 成绩管理系统主菜单

3.实验步骤

(1)      编写头文件sgms1.h,对menu函数进行声明。

(2)      将sgms1.c源文件补充完整

4.实验重点和难点

(1)      C程序是由一个个函数构成,当一个函数调用另一个函数时,需要对被调函数作声明。

(2)      用户自定以的函数最好写在一个头文件中,在需要的地方用文件包含命令即可。

(3)      system(“cls”)函数的作用是清屏,它的声明在头文件stdlib.h中。如果是在Linux操作系统的gcc环境下,清屏用system(”clear”)。

5.常见错误

(1) 数据声明或语句后面缺少分号。

(2) 对被调函数没有声明。

(3) 没有main函数或者有多个main函数。

6.程序代码

7.实验结果

8.心得体会


实验2 顺序结构程序设计

1. 实验目的

(1)  掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量。

(2)  掌握数据的输入输出的方法,能正确使用各种格式控制符。

(3)  掌握算术运算符和赋值运算符。

2.实验要求

(1)      当用户选择0后,在屏幕上输出“You will quit, thank you for using the system!”信息,然后结束程序运行。

(2)      当用户选择1后,进入输入记录,输入完后,显示输入结果。

运行程序后,其结果如下:

首先出现主菜单界面

图2-1 主菜单界面

当用户输入0回车后,出现退出系统界面

当用户在主菜单界面上输入1回车后,出现输入记录界面

图2-3 输入记录界面

3.实验步骤

(1)      将quit和addRecord函数的声明添加到实验提供的头文件sgms2.h中。

(2)      将实验提供的sgms2.c文件的main函数和addRecord函数补充完整。

(3)      运行由sgms2.h和sgms2.c构成的程序。

4.实验重点和难点

(1) 用scanf和printf对数据进行输入输出时,不同的数据类型用不同的格式控制符。

(2) scanf函数中的格式控制后面应当是变量地址,而不是变量名。

5.常见错误

(1)      变量没有定义,直接使用。

(2)      企图利用整数除以整数得到精确结果。例如1/4结果不是0.25而是0,1/4.0结果才是0.25。

(3)      printf和scanf函数中格式控制符的个数与变量或变量地址的个数不一致。

(4)      scanf函数的地址表列因该是变量地址,而不是变量名。

(5)      scanf函数在格式控制字符串中除了格式说明以外还有其他字符时,在输入数据

(6)      没有在对应的位置输入与这些字符相同的字符。

6.程序代码

7.实验结果

8.心得体会


实验3 选择结构程序设计

1. 实验目的

(1)  了解C语言表示逻辑变量的方法

(2)  学会正确使用关系运算符和逻辑运算符。

(3)  熟练掌握if语句和switch语句。

2.实验要求

(1)      将sgms3.c文件中main函数中的用于功能选择的if语句改为switch语句。

(2)      在输入分数时,如果输入的分数在0到100之外,则输出提示信息,并等待重新输入。

输入记录界面如下:

图3-1 输入记录界面

3.实验步骤

(1)      将sgms3.c文件中main函数中的用于功能选择的if语句改为switch语句。

(2)      将sgms3.c文件中的addRecord函数补充完整。

(3)      运行由sgms3.h和sgms3.c构成的程序。

4.实验重点和难点

(1) 注意关系运算符==和复制运算符=的区别。

(2) if和else的匹配原则。

(3) 在switch语句中正确使用break。

5.常见错误

(1) 赋值运算符=和关系运算符等号=搞混。

(2) 在if语句为复合语句时,忘记写{}。

(3) if语句出现嵌套时,没正确配对。

(4) switch语句中,没正确使用break。

6.程序代码

7.实验结果

8.心得体会


实验4 循环结构程序设计

1. 实验目的

(1)      熟练掌握循环语句中的for语句、while语句和do while语句的使用方法,以及这三种循环语句之间的转换方法。

(2)      掌握编写循环结构程序的方法。

2.实验要求

(1)       实现在一次程序运行中用户能多次进行功能选择。也就是当用户完成添加或者后面实验.中的显示、删除等等功能后,系统又会回到主菜单,等待用户的下一次功能选择。

(2)       在输入分数时,如果输入的分数在0到100之外,则等待用户重新输入,直到输入的分数在0到100之间才结束。

运行程序后,首先出现主菜单界面:

图4-1 系统主菜单

用户输入1回车后,进入输入,在输入分数时,分数必须在0-100之间,否则需要重新输入,直到分数满足要求:

图4-2输入记录界面

输入记录完后,按任意键又回到主菜单界面,见图4-1。

3.实验步骤

(1)      完善sgms4.c中的main的函数,以达到实验要求1。

(2)      将sgms4.c中addRecord函数的while循环改为do while循环,以达到实验要求。

(3)      运行由sgms4.h和sgms4.c构成的程序。

4.实验重点和难点

(1)      循环结构程序的设计方法。

(2)      while和do while循环之间的转换方法。

(3)      getch函数从键盘接收一个字符,该函数被调用后程序会暂停,等待按任意键,再继续执行后续的语句,以便我们观察中间结果。在VC++下需要包含conio.h头文件,在Linux下需要包含头文件curses.h。由于在Linux下getch函数还需要与其它函数配合使用才能达到上面所说的功能并且在编译时还要指定链接所使用的库文件,所以在Linux环境建议使用两次调用getchar函数来替换getch函数。

5.常见错误

(1) 循环体为复合语句时,没用{}括起来。

(2) 在while()和for()后面添加分号,使得循环体为空语句。

(3) for括号里的分号和逗号用错。

(4) 循环嵌套时,内循环的初始条件和循环体没正确设计好。

6.程序代码

7.实验结果

8.心得体会


实验5 数组的应用

1.      实验目的

(1) 掌握一维数组和二维数组的定义和引用。

(2) 掌握字符数组和字符串函数的使用。

(3) 掌握与数组有关的算法(特别是排序算法)。

2.实验要求

(1)  将学生信息用二维数组存放。

(2)  增加显示功能。

(3)  增加排序功能,排序时按照平均成绩有小到大。

运行程序后,首先添加学生记录。设添加三个学生信息,他们的各科成绩分别为:1号30、40、80,2号80、60、60,3号60、70、70。

回到主菜单界面,如果输入2,则进入显示记录:

图5-1 显示记录界面

在主菜单界面,如果输入3,则进行排序,结果如下:

图5-2 排序界面

3.实验步骤

(1)      在sgms5.c中将main函数补充完整,完成数组定义。

(2)      在sgms5.c中的addRecord函数添加代码,将学生数目加1。

(3)      在sgms5.c中的dispRecord和sortRecord函数中添加代码,将所有学生成绩一一显示出来。

(4)      将sgms5.c中sortRecord函数的选择排序法改为起泡排序法。

运行由sgms5.h和sgms5.c构成的程序。

4.实验重点和难点

(1) 在循环中,数组元素的引用。

(2) 起泡排序法、选择排序法和插入排序法。

5.常见错误

(1) 数组定义时,没规定数组长度或者长度为一变量。

(2) 循环中数组元素的下标没正确表示。

(3) 起泡排序、选择排序和插入排序算法没理解透。

(4) 起泡排序、选择排序和插入排序中,循环的初始条件和终止条件出现错误。

(5) 字符串的复制和比较直接使用赋值运算符和关系运算符。

6.程序代码

7.实验结果

8.心得体会


实验6 函数的应用

1. 实验目的

(1)  掌握函数的定义和调用方法。

(2)  掌握函数实参与形参的对应关系,以及“值传递”的方式。

(3)  掌握函数的嵌套调用和递归调用的方法。

(4)  掌握全局变量和局部变量,动态变量以及静态变量的概念和使用方法。

2.实验要求

(1)      增加全局变量用以表示学生记录是否需要存盘。

(2)      在添加学生记录时,输入的学号不能和已有的重复,否则需要重新输入,直到不相同。

(3)      增加按学号查询功能。

(4)      增加按学号修改功能。

设已添加1号2号3号学生,则在增加学生记录时,出现下面界面:

图6-1 输入学生记录

在主菜单,如果输入4,则进入查询。

图6-2 查询记录界面1

在查询时,如果输入的学号不存在,则出现下面界面。

图6-3 查询记录界面2

在主菜单界面,如果输入5,则进行修改记录。

图6-4 修改记录界面

3.实验步骤

(1)      在sgms6.h头文件中增加3个函数的声明,它们的函数原型分别为int locationRecord(int stuArray[][5], int num),void findRecord(int stuArray[][5]),void modiRecord(int stuArray[][5])。

(2)      在sgms6.c中定义全局变量SAVEFLAG,初始值为0,并在addRecord和sortRecord函数中将其值修改为1,表示数据有修改,需要存盘。

(3)      将sgms6.c中main函数的case 4 和case 5 后面的内容补充完整。

(4)      将sgms6.c中addRecord函数的while循环体补充完整,以满足实验要求2。

(5)      在sgms6.c中编程完成locationRecord函数的定义。

(6)      在sgms6.c的findRecord函数中添加locationRecord函数的调用。

(7)      在sgms6.c中编程完成modiRecord函数的定义。

(8)      运行由sgms6.h和sgms6.c构成的程序。

4.实验重点和难点

(1) 函数的定义和调用方法。

(2) 函数的实参数为数组时,形参的形式以及实参和形参之间的数据传递方式。

(3) 函数的递归调用。

5.常见错误

(1) 函数没定义,就被调用。

(2) 函数定义了,又没被调用。

(3) 定义函数时,形参没规定类型。

(4) 函数调用时,实参前加类型。

(5) 被调函数没有声明

(6) 嵌套调用和递归调用没理解透,使用错误。

(7) 全局变量和局部变量有效范围没能正确区分。

6.程序代码

7.实验结果

8.心得体会


实验7 指针的应用

1. 实验目的

(1) 熟练掌握指针的定义、赋值和使用。

(2) 掌握用指针引用数组的元素、熟悉指向数组的指针的使用。

(3) 熟练掌握字符数组与字符串的使用,掌握指针数组。

(4) 掌握指针函数与函数指针的用法。

2.实验要求

(1)      将添加、显示、排序、定位、查找、修改等函数全部用指针方式处理。

(2)      增加统计各科不及格人数、平均成绩和最高成绩功能。

(3)      增加按学号删除记录功能。

设已添加三个学生信息,他们的各科成绩分别为:1号30、40、80,2号80、60、60,3号60、70、70。则在主菜单界面上,选择7,进行统计。

图7-1 统计记录界面

在主菜单界面上,如果选择6,则进入删除记录功能。

图7-2删除记录界面

3.实验步骤

(1)      在sgms7.h文件中增加删除和统计函数的声明,它们的函数原型分别为void deleRecord(int (*stuArray)[5])和void countRecord(int (*stuArray)[5])。

(2)      将sgms7.c文件中addRecord函数的错误进行改正。

(3)      完善sgms7.c文件中dispRecord和sortRecord函数。

(4)      编写sgms7.c文件中locationRecord函数体,要用指针方式处理

(5)      在sgms7.c文件中findRecord和modiRecord函数定义指向locationRecord函数的指针变量,并利用它调用locationRecord函数。

(6)      在sgms7.c文件中编程完成deleRecord函数定义。

(7)      在sgms7.c文件中编程完成countRecord函数定义。

(8)      运行由sgms7.h和sgms7.c构成的程序。

4.实验重点和难点

(1) 列指针变量的定义、赋值以及利用它引用数组元素。

(2) 行指针变量的定义、赋值以及它在二维数组中的使用。

(3) 函数指针变量的定义、赋值和利用它进行函数调用。

5.常见错误

(1) 混淆变量值和变量地址。

(2) 指针变量没有初始化,就利用该指针变量引用变量。

(3) 利用指针变量引用一维数组元素和二维数组元素或地址时,引用的方法不对。

(4) 函数指针概念清楚。

(5) 混淆行指针变量和指针数组。

6.程序代码

7.实验结果

8.心得体会


实验8 结构体的应用

1. 实验目的

(1) 掌握结构体变量、结构体数组以及结构体指针的定义和使用。

(2) 掌握动态存储分配函数的用法和单向链表的创建、输出等操作。

(3) 掌握用typedef定义类型。

2.实验要求

用单向链表来存储学生信息,并实现添加记录和输出记录等功能。

3.实验步骤

(1)      完善sgms8.h文件中的结构体类型的定义。

(2)      将sgms8.c文件中main函数补充完整。

(3)      将sgms8.c文件中addRecord函数进行改错和完善。

(4)      编程实现sgms8.c文件中dispRecord函数。

(5)      运行由sgms8.h和sgms8.c构成的程序。

4.实验重点和难点

(1)      结构成员引用的三种方法。

(2)      链表节点数据类型的定义。

(3)      malloc函数用于动态分配存储空间,它的返回值类型是void *,在实际使用中一般需要强类型转换成多需要的类型。该函数的声明在stdlib.h头文件中。

(4)      链表操作中,节点指针域的使用。

5.常见错误

(1) 引用结构体成员时,成员运算符.和指向运算符->的使用混淆。

(2) 链表操作过程中不能正确利用指针域进行操作。

(3) 不能正确使用typedef声明新类型名。

6.程序代码

7.实验结果

8.心得体会


实验9 文件的应用

1. 实验目的

(1) 掌握文件、缓冲文件系统以及文件指针等概念。

(2) 学会使用文件打开、关闭、读、写等函数对文件进行简单的操作。

2.实验要求

(1)      增加将学生信息保存到文件功能。

(2)      程序运行后,首先判断保存学生信息的文件(student.dat)是否存在,如存在,则将该文件存储的学生信息读出,添加到学生数组中。然后进入主循环,显示主菜单和判断用户按键。

(3)      如果学生数组中的内容相对文件中的有变化(也就是进行过添加、排序、修改、删除等操作),而又没有保存,则在退出系统时,将进行是否保存的提示。

假设学生数组中有4条学生记录,则在主菜单界面上输入8,进入保存。

图9-1 保存记录界面

退出系统时,如果数据有变化,则进行是否保存的提示。

图9-2 退出系统界面

3.实验步骤

(1)      将sgms8.c文件中save函数补充完整。

(2)      将sgms8.c文件中saveRecord函数补充完整。

(3)      将sgms8.c文件中main函数补充完整。

(4)      将sgms8.c文件中quit函数补充完整

(5)      运行由sgms9.h和sgms9.c构成的程序。

4.实验重点和难点

(1) access函数可以用来判断某一文件是否存在。调用该函数时,在VC++下需包含头文件io.h,在Linux下需包含unistd.h头文件。

(2) fopen、fclose函数的使用。

(3) fread和fwrite函数的使用。

5.常见错误

(1) 文件打开方式使用错误。

(2) 文件使用完毕没有关闭。

(3) 不能正确使用文件读写函数对文件进行操作。

6.程序代码

7.实验结果

8.心得体会

相关推荐