C语言程序设计实验指导书.docx
《C语言程序设计实验指导书.docx》由会员分享,可在线阅读,更多相关《C语言程序设计实验指导书.docx(20页珍藏版)》请在冰豆网上搜索。
C语言程序设计实验指导书
实验一C程序环境认识
――掌握在集成环境中编辑、编译、连接和运行C语言程序的方法
(蓝色笔体内容可以不写在实验报告里,理解并掌握即可。
)
一,实验目的:
1,掌握TC的使用.
2,理解C程序的结构.
3,掌握C程序设计,调试,运行的步骤,方法.
4,理解最简单的C程序设计方法.
二,实验准备:
1,计算机基本操作练习.
2,TC软件使用预习.
3,设计出习题1.5、习题1.6的程序.
三,实验内容:
1.VC6.0或TC程序运行环境;
2.程序调试的全部过程;
3.菜单的用法;
4.常用功能键的用法。
四,实验要求:
1.认真阅读和掌握和本实验相关的教材内容;
2.认真阅读和掌握本章相关内容的程序,例1.1、例1.2、例1.3;
3.上机运行程序;
4.保存和打印出程序的运行结果,并结合程序进行分析;
5.按照你对运行环境的操作需要,编写一简单C程序并运行,打印出文件清单和运行结果。
五,实验步骤:
1,开机,启动TC.
(1)开机.
(2)进入TC目录.
(3)启动TC.
命令格式:
TC[文件名[.扩展名]]
说明:
若缺省文件名,则直接启动.进入TC界面,并显示版本信息.此时按ESC键进入编辑状态.
若给定文件名,(缺省扩展名则默认为.C)则打开该文件(若不存在则新建该文件)进行编辑.
2,TC的使用
(1)启动TC后,进入TC的界面.该界面分为四部分:
菜单区,编辑区,信息区,提示行.
A,菜单区:
TC界面的最上面一行,是TC的主菜单.包括8项:
File文件操作
Edit编辑操作
Run运行
Compile编译
Project工程(项目)
Option选项
Debug调试
Break/Watch中断/监视
每个菜单项下都包含有各项具体功能,用户可以通过选择,执行相应的功能.
B,编辑区.TC界面的主要部分,由标题Edit,状态行和文本编辑区域组成.状态行中指示光标所在行,列.现在是否处于插入状态(若有Insert标志表示处于插入状态,没有则处于改写状态)以及正在编辑的文件名.
C,信息区.由标题message和信息显示区域组成,用来显示编译文件后的错误.单步执行时要监测变量的值等信息.
D,提示行.TC界面的最下面一行,用于提示用户一些最常用的操作:
F1――帮助,F5――窗口的缩放,F6――窗口的切换,F8――单步执行程序,F9――编译连接,F10――激活主菜单.
(2)菜单的操作
A,激活菜单F10或Alt
B,移动光条方向键
C,选择某项回车
D,放弃选择ESC
E,主菜单项的直接选中Alt―高亮度的字符
如:
要选中File按Alt―F
F,子菜单的直接选中选中主菜单项后,直接按高亮度的字母
如:
选中File后,要选中Save按"s"Ⅶ.部分快捷键(直接按该键就会击活菜单项具体的功能)
除前面提示行中列出的以外,常用的还有:
F2――保存
F3――装入文件
F4――从坐标所在位置单步执行
F7――单步跟踪
Alt-F1:
查看最近一次的帮助信息
Alt-F3:
选择文件装入
Alt-F5:
查看运行结果
Alt-X:
退出TC
Ctrl-F1:
查看与光标所在位置内容相关的帮助信息
Ctrl-F2:
取消单步执行
Ctrl-F8:
设置断点
Ctrl-F9:
编译,连接并运行
(3)文件操作
A,新建文件可采用以下方法:
(a)在启动TC时不带文件名,则系统默认为NONAME.C,存盘时再输入文件名.
(b)启动TC时带新文件名.
(c)在TC环境下选择File下的New.
B,打开文件可采用以下方法:
(a)启动TC时带文件名.
(b)在TC环境下选择File下的Load,再输入文件名.
(c)以通过Load打开过的文件再次打开,可选择File下的Pick,进行选择.
C,保存文件可采用以下方法:
(a)选择File下的Save,存盘.若原文件名是NONAME.C,则存盘时还要输入文件名.
(b)选择File下的Writeto,输入文件名,则将文件换名存盘.
(4)编辑操作
TC采用的是全屏幕编辑器,即凡输入过内容的地方都可将光标移到该处直接修改.
A,移动光标:
左移一个字符→
右移一个字符←
上移一行↑
下移一行↓
移动到行首Home
移动到行末End
向下翻页PageDown
向上翻页PageUp
移动到窗口左上角Ctrl-Home
移动到窗口右上角Ctrl-End
移动到文件头Ctrl-PageUp
移动到文件尾Ctrl-PageDown
B,删除内容:
删除光标前的字符Backspace(退格)
删除光标位置上的字符Delete(del)
删除一行Ctrl-Y
C,块操作:
定义块首Ctrl-KB定义块尾Ctrl-KK
块复制Ctrl-KC块移动Ctrl-KV
块删除Ctrl-KY块取消Ctrl-KH
(5)C程序的调试,运行
A,输入程序
B,编译,运行形成可执行文件
选择Compile下的
CompiletoOBJ编译生成目标文件
Compile/linkEXEfile将目标文件连接成可执行文件
Compile/makeEXEfile编译直接生成可执行文件
(程序输入后,用快捷键F9即表示makeexefile,完成编译和连接).
C,执行
选择Run下的Run(Ctrl-F9).
D,查看结果
运行按Alt-F5,查看后按任意键返回.
(6)退出TC
选择File下的Quit或直接按Alt-X.
3.简单的C程序设计,调试,运行.
六,实验报告:
1,源程序.
2,调试过程中出现的错误及修改情况.
3,实验结果.
4,实验的感受及体会.
实验三选择结构程序设计
(蓝色笔体内容可以不写在实验报告里,理解并掌握即可。
)
一,实验目的:
1,了解C语言表示逻辑量的方法(以0代表"假",以1代表"真").
2,学会正确使用逻辑运算符和逻辑表达式.
3,熟练掌握if语句和switch语句.
二,实验准备:
1,复习关系,逻辑,条件运算符和表达式.
2,复习if语句的三种形式.
3,复习if语句的嵌套并能够正确分析.
4,复习多分支选择switch语句.
5,源程序.
三,实验步骤及内容:
1,运行程序并回答问题
main()
{inta,b,max,min;
scanf("%d%d",&a,&b);
if(a>b)
{max=a;min=b;}
else
{min=a;max=b;}
printf("max=%d,min=%d\n",max,min);
}
问题:
a,此程序的功能是什么
b,请用条件表达式语句(?
:
)修改程序使之完成相同的功能.
2,输入一个不大于4位的正整数,判断它是几位数,然后输出各位之积.
main()
{intx,a,b,c,d,n;
printf("请输入个不大于4位的正整数X:
");
scanf("%d",&x);
if(x>______________)
n=4;
elseif(x>______________)
n=3;
elseif(x>______________)
n=2;
else
n=1;
a=x/1000;/*x的个,十,百,千位分别用d,c,b,a表示*/
b=______________________;
c=______________________;
d=______________________;
swith(___)
{
case4:
printf("%d*%d*%d*%d=%d\n",a,b,c,d,a*b*d*c);
_____________________________;
case3:
_____________________________;
_____________________________;
case2:
_____________________________;
_____________________________;
case1:
_____________________________;
_____________________________;
}
}
3,编程
(1)
解答P111习题5.4
(2)
解答P111习题5.5
(3)
解答P111习题5.6
(4)
解答P112习题5.7
(5)
解答P112习题5.8
(6)
解答P112习题5.9
(7)
解答P112习题5.10
四,实验报告:
1,源程序.
2,调试过程中出现的错误及修改情况.
3,实验结果.
4,实验的感受及体会.
实验四循环控制
(蓝色笔体内容可以不写在实验报告里,理解并掌握即可。
)
(实验课后的下一周的周三,请班长分别收好预习报告和实验报告,交电气学院403室。
)
一,实验目的:
1.熟悉用while语句,do―while语句和for语句实现循环的方法.
2.掌握在程序设计中用循环的方法实现各种算法(如穷举,迭代,递推等).
二,实验准备:
1,复习while语句,do―while语句和for语句的特点和适用条件.
2,复习continue语句和break语句的区别.
3,源程序.
三,实验步骤及内容:
1,以下程序是用来计算S=1+2+3+…+10,请更正下列程序的错误,并上机调试.
(1)main()
{inti=1;
while(i<10)
sum+=i;
++i;
printf("sum=%d\n",sum);
}
(2)main()
{inti=sum=0;
do{sum+=i;
++i;
}while(i<10)
printf("sum=%d\n",sum);
}
(3)main()
{inti,sum=0;
for(i=1;i<10;++i)
{sum=sum+i;
printf("sum=%d\n",sum);
}
}
2,完善程序并回答问题
下列程序用来计算S=1+1/1!
+1/2!
+1/3!
+…+1/N!
main()
{intt,n,i;
floats;
s=__________;t=___________;
scanf("%d",&n);
for(i=1;i<=___________;++i)
{
t=______________;
s=s+_________________;}
printf("s=%f\n",s);
}
问题:
1)此程序用双循环怎么实现请写出程序上机调试(提示:
内循环计算阶乘,外循环实现累加).
(2)若要计算S=1/2!
+1/4!
+1/6!
+…+1/10!
用哪种算法比较合适请编程上机调试.
3,编写下列问题的源程序并上机调试.
(1)输入两个正整数,求其中最大公约数和最小公倍数.(习题6.1)
(2)输入一行字符,分别统计出其中的英文字母,空格,数字和其它字符的个数.(习题6.2)
(3)用牛顿迭代法求方程2x^3-4x^2+3x-6=0在1.5附近的根.(习题6.12)
(4)猴子吃桃问题.猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前天剩下的一半零一个.到第10天早上想再吃时,见只剩下一个桃子了.求第一天共摘了多少桃子.(习题6.10)
三,实验报告:
1,源程序.
2,错误原因及其修改记录.
3,实验结果记录.
4,实验体会.
实验五数组
一,实验目的:
1,掌握一维数组和二维数组的定义,赋值和输入输出的方法.
2,掌握字符数组和字符串函数的使用.
3,掌握与数组有关的算法(特别是排序算法).
二,实验准备:
1,复习数组的基本知识.
2,复习字符串数组的特点和常用的字符串处理函数.
3,源程序.
三,实验步骤及内容:
1,编程求两个3*3二维数组的和:
2,编程计算3*3矩阵两条对角线元素之和:
3,编写下列问题的源程序并上机调试运行.
(1)用选择法对10个整数排序(10个整数用scanf函数输入).(习题7.2)
(2)找出一个二维数组的"鞍点",即该位置上的元素在该行上最大,在该列上最小.也可能没有鞍点.(习题7.8)
此二维数组可以设定如下:
98020540
90-60961
210-310189
数组元素的值用赋初值方法在程序中指定.
(3)将两个字符串连接起来,不要用strcat函数.(习题7.13)
四,实验报告:
1,源程序.
2,错误原因及其修改记录.
3,实验结果记录.
4,实验体会.
实验六函数
一,实验目的:
1,掌握定义函数的方法.
2,掌握函数实参与形参的对应关系,以及"值传递"的方式.
3,掌握函数的嵌套调用和递归调用的方法.
4,掌握全局变量和局部变量动态变量,静态变量的概念和使用方法.
二,实验准备:
1,复习函数调用的基本理论知识.
2,复习函数的嵌套调用和递归调用的方法.
3,复习全局变量,局部变量;静态变量,动态变量;外部变量等概念和具体使用.
4,源程序.
三,实验步骤及内容:
1,运行程序并回答问题
(1)程序
main()
{play(3);
}
voidprint_star()
{printf("**********\n")
}
voidprint_message()
{printf("GoodFriend!
\n");
}
voidplay(n)
intn;
{inti;
for(i=1;i<=n;++i)
{print_star();
print_message();
}
}
问题:
运行后出现什么错误为什么应如何修改请上机调试.
(2)以下程序用于计算1+2+3+4+5.
main()
{inti,sum;
for(i=1;i<=5;++i)
sum=add(i);
printf("sum=%d\n",sum);
}
add(a)
inta;
{ints=0;
s=s+a;
return(s);
}
问题:
此程序能否得到正确结果为什么请在不增加语句的条件下,修改程序并上机调试.
(3)程序
intx=567;
main()
{printf("x=%d,y=%d\n",x,y);
}
inty=890
问题:
运行程序后出现什么错误为什么如何修改
2,程序填空
本程序的作用是在三位正整数中寻找符合下列条件的整数,它既是完全平方数,又有两位数字相同,例如144,676等,下列程序要找出所有满足上述条件的三位数并输出.
main()
{intn,k,a,b,c;
for(k=10;;k++)
{
___________;
if(n>999)
__________;
a=n/100;
b=___________;
c=n%10;
if(flag(a,b,c))
printf("N=%d=%d*%d\n",n,k,k);
}
}
flag(x,y,z)
____________;
{return!
((x-y)*(____)*(y-z));
}
3,编写下列问题的源程序并上机调试运行.
(1)用一个函数来实现将一行字符串中最长的单词输出.此行字符串从主函数传递给该函数.(习题8.10)
(2)写一个函数,输入一个十六进制数,输出相应的十进制数.(习题8.16)
四,实验报告:
1,源程序.
2,错误原因及其修改记录.
3,实验结果记录.
4,实验体会.
实验七编译预处理
一,实验目的要求:
1,掌握宏定义的方法.
2,掌握文件包含处理方法;.
3,掌握条件编译的方法.
二,实验准备:
1,复习宏定义,文件包含,条件编译的概念.
2,复习宏定义,文件包含,条件编译的使用方法.
3,源程序.
三,实验步骤及内容:
程序填空:
(1)#include__________
main()
{printf("%d\n",2);
}
(2)#include_________
#include_________
main()
{inta=4;
printf("%d\n",sqrt(a));
}
(3)#include______
#include______
main()
{charstr[12]={'s','t','r','i','n','g'};
printf("%d\n",strlen(str));
}
2,编写下列问题的源程序并上机调试运行.
(1)定义一个带参数的宏,使两个参数的值互换.在主函数中输入两个数作为使用宏的实参,输出已交换后的两个值.
说明:
在程序主函数使用宏时只能用两个实参,如SWAP(A,B),不能用三个实参.
(2)设计输出实数的格式,包括:
1>一行输出一个实数;
2>一行内输出两个实数;
3>一行内输出三个实数.实数用"%6.2f"格式输出.
用一个文件"print-format.h"包含以上用#define命令定义的格式.在自己的文件(自己命名)中用#define命令将"print-format.h"文件包含进来.在程序中用scanf函数读入三个实数给f1,f2,f3.然后用上面定义的三种格式分别输出
(1)f1;
(2)f1,f2;
(3)f1,f2,f3.
(3)用条件编译方法实现以下功能:
输入一行电报文字,可以任选两中输出,一为原文输出;一为将字母变成其下一字母(如'a'变成'b',...,'z'变成'a'.其它字符不变).用#define命令来控制是否要译成密码.例如:
#defineCHANGE1
则输出密码.若
#defineCHANGE0
则不译成密码,按原码输出.
用条件编译方法来处理.
四,实验报告:
1,源程序.
2,错误原因及其修改记录.
3,实验结果记录.
4,实验体会.
实验八指针
一,实验目的:
1,掌握指针的概念,会定义和使用指针变量.
2,学会使用数组的指针和指向数组的指针变量.
3,学会使用字符串的指针和指向字符串的指针变量.
4,学会使用指向函数的指针变量.
5,了解指向指针的指针的概念及其使用方法.
二,实验准备:
1,复习变量,变量的地址,指针变量的概念并且明确的区分这三个不同概念.
2,复习指针和数组的结合运用.
3,复习指针的其他理论知识.
4,源程序.
三,实验步骤及内容:
程序填空
(1)以下程序调用findmax函数求数组中最大元素在数组中的下标.
#include
findmax(int*s,intt,int*k)
{intp;
for(p=0,*k=p;ps[*k])__________;
}
main()
{inta[10],i,k;
for(i=0;i<10;i++)scanf("%d",&a[i]);
findmax(a,10,&k);
printf("%d,%d\n",k,a[k]);
}
(2)以下程序统计从终端输入的字符中每个大写字母的个数.用#作为输入结束标志.
#include__________
#include__________
main()
{intnum[26],i;
charc;
for(i=0;i<26;i++)num[i]=0;
while(_________!
='#')/*统计从终端输入的大写字母个数*/
if(isupper(c))num[c-65]+=1;
for(i=0;i<26;i++)/*输出大写字母和该字母的个数*/
if(num[i])printf("%c:
%d\n",______,num[i]);
}
(3)下面程序调用getone函数开辟一个动态存储单元,调用assone函数把数据输入此动态存储单元,调用outone函数输出此动态存储单元中的数据.
#include_________
getone(s)
int**s;
{*s=(int*)malloc(sizeof(int));}
assone(a)
int*a;
{scanf("%d",__________);}
outone(b)
int*b;
{printf("%d\n",________);}
main()
{int*p;
getone(&p);
assone(p);
outone(p);
}
2,编写下列问题的源程序并上机调试运行(要求用指针处理问题).
(1)输入三个整数,按由小到大的顺序输出,然后将程序改为:
输入三个字符串,按由小到大顺序输出.(习题10.1)
(2)将一个3*3的矩阵转置(将矩阵的行和列转换),用一函数实现.在主函数中用scanf函数输入以下矩阵元素:
135
7911
131519
将数组名作为函数实参.函数调用后在主函数中输出已转置的矩阵.(习题10.9)
(3)用一个函数实现两个字符串的比较,即自己写一个strcmp函数:
strcmp(s1,s2).
如果s1=s2,则函数返回值为0;如果s1≠s2,返回他们二者第一个不同字符的ASCII码差值(如"BOY"与"BAD",第二个字母不同,"O"与"A"之差为79-65=14);如果s1>s2,则输出正值;如果s1两个字符串s1,s2由main函数输入,strcmp函数的返回值也在main函数输出.(习题10.17)
四,实验报告:
1,回答变量,变量的地址,指针变量的区别.
2,源程序.
3,错误原因及其修改记录.
4,实验结果记录.
5,实验体会.
实验九结构体和共用体
一,实验目的:
1,掌握结构体类型变量的定义和使用.
2,掌握结构体类型数组的概念和应用.
3,掌握共用体的概念和使用.
4,了解链表的概念,初步学会对链表进行操作.
二,实验准备:
1,复习结构体的概念和定义方法.
2,复习共用体的概念和定义方法.
3,源程序.
三,实验步骤及内容:
程序改错
typedefunion{longx[2];
inty[4];
charz[8];
}MYTYPE;
typedefunionthem;
main()
{printf("%d",sizeof(them));
}
程序填空
以下程序建立了一个带有头结点的单向链表,结点中的数据可由键盘输入,当输入数据为-1时,表示输入结束(链表头结点的data与不放数据,表空的条件是ph―>next==NULL).
#include_______
structlist{intdata;structlist*next;};
_______crea