C语言程序设计课程实践指导31.docx
《C语言程序设计课程实践指导31.docx》由会员分享,可在线阅读,更多相关《C语言程序设计课程实践指导31.docx(126页珍藏版)》请在冰豆网上搜索。
C语言程序设计课程实践指导31
第一章绪论
上机实习:
WiN-TC系统的基本操作方法
一、目的要求
1、掌握C程序的基本结构。
2、熟悉WiN-TC系统的操作界面。
3、能熟练地启动WiN-TC和退出WiN-TC。
4、掌握在WiN-TC中建立、运行、修改、保存和装入程序的方法。
5、掌握插删字符和插删行等基本的编辑操作。
二、上机内容
下面是三个从最简单到稍复杂的C程序,仔细阅读程序并领会各程序的运行结果,以熟悉C程序的基本结构和WiN-TC的基本操作流程。
1、main()
{
printf("HelloChina!
");
}
(1)调试该程序。
(2)在函数体中插入一行语句,使上面的程序变成:
main()
{
clrscr();/*清屏*/
printf("HelloChina!
");
}
再次运行程序并仔细观察运行结果,这次是先清屏,再从屏幕的左上角开始显示“HelloChina!
”。
说明:
清屏函数clrscr(),先清屏再显示出运行结果
2、main()
{
inta,b,sum;
a=1;
b=2;
sum=a+b;
clrscr();
printf("sum=%d",sum);
}
(1)运行该程序,对比自己的判断与屏幕上的结果是否一致。
(2)删除函数体第一行中的变量定义语句“inta,b,sum;”,或将该语句注释起来。
再运行程序,看看会有什么结果。
3、main()
{
inta,b;
a=2;
b=pf(a);
printf("a=%d,b=%d",a,b);
}
pf(num)
intnum;
{
intt;
t=num*num;
return(t);
}
(1)运行程序后分析该程序执行的功能。
(2)将程序中的main()函数改写如下:
main()
{
inta,b;
clrscr();
scanf("%d",&a);
b=pf(a);
printf("a=%d,b=%d",a,b);
}
再运行程序,当从键盘输入2时,输出:
a=2,b=4
从键盘输入5时,输出:
a=5,b=25
如果是第二种情况会有什么好处?
使用scanf函数的好处是,可以在程序的运行过程中灵活地输入我们想求平方的一个数,并根据该数输出其平方值。
第二章基本数据类型和简单程序设计
第一节 学习指导
一、学习目标
本章重点介绍了C语言的三种基本数据类型,即整型、浮点型和字符型,以及这三种数据类型的简单程序设计。
每个程序都有自己特定的数据处理对象,例如,求1+2+3+……+100之和的程序,它的数据对象是整数;求一元二次方程的根的程序,它的数据对象是小数。
可以说,任何程序设计都会涉及到对数据的处理,因此,如何在程序中表示数据是一个最基本的问题。
学习本章的目的,就是要了解各种基本数据类型的特点,知道如何在程序中使用这些类型的数据,在定义变量时如何根据实际需要随机应变。
本章学习目标如下:
1、了解三种基本数据类型的特点。
2、掌握三种基本数据类型常量的表示方法。
3、熟练掌握三种基本数据类型变量的定义方法。
4、了解混合运算中的类型转换。
二、几个需要注意的问题
1、常量与变量。
要记住常量和变量的定义很容易,前者是在程序运行过程中其值不能改变的量,后者是在程序运行过程中其值允许改变的量。
但是,对第一次学习程序设计的初学者来说,往往弄不明白编程时什么时候使用常量,什么时候使用变量。
举一个简单的例子,如果你仅仅是想求13与25之和,那么可以在程序中写出下面的语句:
printf("%d",13+25);
这里,13和25就是常量,这个语句中没有出现任何一个变量。
但是,如果你是想求两个数之和,而这两个数又是根据不同的需要而改变的,那么就可以在程序中利用定义变量的方法解决,如下面的语句:
printf("%d",a+b);
或:
sum=a+b;
printf("%d",sum);
这里,a、b、sum就是变量,在执行a+b之前,可以通过输入语句给它们赋值,也可以通过赋值语句,把常量或表达式的值分别赋给它们。
总之,a和b的值是可变的。
2、变量名的命名规则。
程序中的每个变量都有一个名字,变量名在定义该变量时就确定了。
并非任何一个字符序列都可以作为一个变量名,只有符合一定规则的名字才是有效的。
(1)变量名只能由字母(A~Z,a~z)、数字(0~9)和下划线(_)三种符号组成,第一个字符必须是字母或下划线。
下面是合法的变量名:
Y,student2,student_name,_page10
下面是不合法的变量名:
2student,sum$3,dr.a,#num
(2)大写字母与小写字母代表含义不同的字符,即两者不等价。
如,sum、Sum和SUM代表三个完全不同的变量。
(3)TurboC规定,变量名的前32个字符在程序中是有效的。
尽管语法允许给变量取一个如此长的名字,但根据一般的编程经验,变量名的长度通常在8个字符以内就行了,没有必要取太长的名字自找麻烦。
(4)不允许使用关键字作变量名。
关键字是C语言的编译程序定义的有固定用法的名字,如,关键字int的作用是定义一个整型变量,因此,用户就不能再用int来作为某个变量的名字。
除了变量名必须遵守上述命名规则,在后面章节中介绍的数组名、函数名和数据类型名等也必须遵守这些命名规则。
另外,为了提高程序的可读性,给变量命名时最好能做到“见名知意”。
3、变量的定义。
C语言规定,程序中的变量必须是“先定义,后使用”。
初学者往往容易忽略在使用变量之前先定义变量,这一点一定要注意。
(1)一个变量就是一个存储区域,它能存储相同类型的不同数据,使用变量名就是使用变量存储区域中存储的数据。
(2)把某个变量定义为哪一种基本类型,关键是看打算用该变量存储什么数据。
例如,想用一个变量存放单个字符,则可把该变量定义为char型;若想存放1~100之间的整数,则可把该变量定义为int型;若想存放小数,则可把该变量定义为float型。
定义变量时还应考虑数据的大小范围。
试分析下面的程序:
main()
{
inta,b,c;
a=20000;
b=30000;
c=a+b;
printf("c=%d",c);
}
不要以为这个程序的运行结果会是c=50000,事实上,它的运行结果是c=-15536。
因为变量c的类型是int型,它所能存放的最大整数是32767,而a与b之和50000超出了这个范围,运行结果自然就出错了。
要想得出正确的运行结果,上面的程序应改为:
main()
{
inta,b;
unsignedc;
a=20000;
b=30000;
c=a+b;
printf("c=%u",c);/*%u表示以unsigned型整数的形式输出变量的值*/
}
(3)定义一个变量时应尽可能地考虑节省存储空间。
例如,某个程序中的变量a用来存放100以内的自然数,那么,变量a可以定义为int类型,也可以定义为long类型。
选哪一种呢?
当然是int型!
因为,一个int型变量只占2个字节,而long型变量却要占4个字节。
三、易出现的语法错误及出错信息
上机操作时,有语法错误的程序不能顺利通过编译过程,这时,出错信息会出现在Massage窗口中,每条出错信息前有一个用来报告错误所在行的行号,可以按这个行号查找程序中出错的地方,修改之后再重新对程序进行编译。
下面列出了在定义变量时易出现的语法错误及相应出错信息。
1、变量没有定义。
出错信息:
Undefinedsymbol‘XXXX’
分析:
C语言规定,变量使用之前必须先定义。
这条出错信息产生的原因是使用了一个没有定义过的变量。
程序示例:
main()
{
a=2;
b=3;
printf("%d",a+b);
}
这个程序在编译时,Massage窗口中将显示出第3行的变量a和第4行的变量b没有定义的出错信息。
又如:
main()
{
inta;b;
a=2;
b=3;
printf("%d",a+b);
}
这个程序好象没有什么错误,但编译时Massage窗口中将显示出:
Undefinedsymbol‘b’infunctionmain
为什么呢?
仔细观察,你会发现程序的第三行定义变量a和b时,a与b之间是分号而不是逗号。
分号代表一个语句的结束,因此,分号后面的b就没有定义了。
这好象是一个很好笑的错误,但是,对粗心的初学者来说,上机时往往会因忽略细节而导致程序的失败。
2、定义变量时的语法错误。
出错信息:
Declarationsyntaxerror
分析:
通常这条信息的出错之处在变量定义或函数定义中,而定义中具体的语法错误又可能是多种多样的,所以,这是一条较难查找的错误。
下面的程序示例给出了两种导致这条信息的变量定义错误。
程序示例:
main()
{
intab;
a=2;
b=3;
printf("%d",a+b);
}
这个程序的错误之处是,第3行定义变量时,变量a和b之间用的是空格间隔,而不是用逗号间隔。
又如:
main()
{
float2s;
2s=26.8;
printf("%f",2s);
}
这个程序中使用了一个名字不合法的变量,即2s。
注意,变量名必须以字母或下划线开头。
第二节 上机实习:
基本数据类型的简单程序设计
一、目的要求
1、进一步熟悉TurboC集成环境下程序的建立、修改和运行。
2、熟悉定义各种基本数据类型变量的方法。
3、初步了解printf函数的使用方法。
4、熟悉有关变量定义的语法错误,并能够根据出错信息修改、调试程序。
二、上机内容
1、语法错误的检查与修改。
下面的程序均含有语法错误,在TurboC集成环境中建立源程序并使用Run命令后,仔细观察Massage窗口中的出错信息,并分析出错原因,找出程序中的错误所在之处。
改正错误之后再重新运行程序。
注意,出错信息显示在Massage窗口中时,可以按F6键在Massage窗口与Edit窗口之间切换。
(1)main()
{
intx1,x2;
x1=5;
x2=10;
y=x1*x2;
printf("y=%d",y);
}
(2)main()
{
FLOATa;
a=2.6;
printf("%f",a*3);
}
(3)main()
{
intnum#1;
num#1=50;
printf("%d",num#1/2);
}
(4)main()
{
charch;
ch=A;
printf("%c",ch);
}
2、分析程序的运行结果。
上机之前先写出下面程序的运行结果,上机时再比较实际运行结果与自己分析的结果是否一致。
(1)main()
{
intnum1,num2,num3;
clrscr();
num1=4;
num2=2;
num3=num1/num2;
printf("num3=%d\n",num3);
num1=12;
num2=3;
num3=(num1+num2)*2;
printf("num3=%d",num3);
}
(2)main()
{
intr;
floats;
clrscr();
r=2;
s=3.14159*r*r;
printf("r=%d\n",r);
printf("s=%f",s);
}
(3)main()
{
charc1,c2;
clrscr();
c1='a';
c2='b';
printf("字母a的ASCII码为:
%d\n字母b的ASCII码为:
%d",c1,c2);
}
(4)main()
{
charch;
clrscr();
ch='\02';
printf("%c\n",ch);
ch='\03';
printf("%c",ch);
}
提示:
这个程序中,'\02'和'\03'分别表示ASCII码为2和3的字符,前者是一个笑面符号,后者是一个心形符号。
通过这种形式,可以输出不能用键盘符号表示的字符。
上机操作时,你不妨将'\02'和'\03'分别改为'\04'和'\05',看看会有什么运行结果。
3、编写一个简单的程序。
已知三个整数分别为100、82、93,编一程序求这三个数的平均值。
要求使用变量。
第三章表达式与运算符
第一节 学习指导
三、学习目标
本章重点介绍了几类常用的运算符,以及由这些运算符构成的表达式。
在实际编程中,算术运算符和赋值运算符几乎是每个C程序都要用到的,这也是本章应重点掌握的内容。
对于关系表达式和逻辑表达式,可能你觉得一时还用不上它们,但在后面的选择结构和循环结构的程序设计中,条件判断均是以关系表达式或逻辑表达式的形式表示,因此,理解并掌握关系运算符和逻辑运算符及其相关表达式,是学好选择结构和循环结构的基础。
本章学习目标如下:
1、熟悉各种基本的算术运算符,能够把一个普通的数学公式改写成符合C程序语法规则的算术表达式。
2、理解各种关系运算符和逻辑运算符的意义,能准确判断关系表达式和逻辑表达式的值。
3、熟练掌握赋值运算符和各种复合赋值运算符的用法。
4、熟悉各类常用运算符的优先级。
四、需要注意的几个问题
1、关于除法运算符。
除法运算符“/”与一般的算术运算规则不同,当整型数据除以整型数据时,其商也是整数。
除法运算符“/”的这一特点有时会影响运算结果的精确性,看下面求两个数的平均值的程序:
main()
{
intnum1,num2,sum,n;
floataverage;
num1=13;
num2=28;
n=2;
sum=num1+num2;
average=sum/n;
printf("%.2f",average);/*%.2f表示输出的浮点数只保留两位小数*/
}
这个程序的运行结果是20.00,而不是20.50,因为变量sum和n都是是整型变量,相除的结果就是一个舍去了小数部分的整型数。
如果想得到精确的运算结果,则可将程序中的语句:
average=sum/n;
改为:
average=(float)sum/n;
2、关系表达式和逻辑表达式。
关系表达式和逻辑表达式的值只有两种:
1和0,即表达式为真时,其值为1,表达式为假时,其值为0。
而在判断真与假时,则是0为假,非0为真。
需要注意的是,数学上很常见的一种比较大小关系的写法,在C语言中却变成了另外的含义。
如,要表示x的值在3和10之间,数学上可以写为:
3而在C语言中,上面的式子等效于:
(3当x的值不在3和10之间时,这个关系表达式依然为真。
这里,我们假设x的值为100,关系表达式3因此,在C语言中要表示x的值在3和10之间,就应该写成下面的逻辑表达式:
33、赋值运算符与赋值表达式。
(1)赋值运算符“=”不同于数学中的等号。
在数学上,算式i=i+2显然不成立。
但在C语言中,表达式i=i+2的作用是把变量i的值加上2,并把得到的和赋值到变量i中。
(2)特别要注意的是,赋值运算符的左边只能是一个变量名,而不能是一个常量或其它的表达式。
下面都是错误的赋值表达式:
13=a
a+b=5
num*2=100
如果程序中出现了错误的赋值表达式,则编译时Massage窗口中会显示下面的出错信息:
Lvaluerequired
(3)给变量赋值时是“新来旧去”,即,把一个新的值赋给变量后,该变量中原来的值就被覆盖掉了。
4、运算符的优先级。
C语言对每一种运算符都规定了优先级,有时候,在同一表达式中需要同时使用多种运算符,这时就要考虑各个运算符的优先级问题。
第二节 上机实习一:
算术运算符及算术表达式
一、目的要求
1、熟悉各种算术运算符的使用规则。
2、能够编写程序,求简单的数学算式的值。
二、上机内容
1、运行下列程序,注意观察运行结果。
(1)main()
{
inta=11,b=3;
clrscr();
printf("a/b=%d\n",a/b);
printf("(float)a/b=%f\n",(float)a/b);
printf("a%%b=%d",a%b);/*“%%”的作用是打印出字符“%”*/
}
(2)main()
{
floatx=3.8;
clrscr();
printf("x=%.2f\n",x);
printf("(int)x=%d",(int)x);
}
(3)main()
{
inta=7,b=4;
floatx=2.5,y;
clrscr();
y=x+a%3*(int)(x+b)%2/4;
printf("y=%f",y);
}
2、编写程序。
已知:
其中,a=-10,b=30。
编一程序求y的值。
3、完善程序。
已知一元二次方程:
ax2+bx+c=0
其中,a=1,b=4,c=2。
下面的程序是求方程的两个实数根,请在横线处填写正确的语句或表达式,使程序完整。
程序的后面给出了该程序正确的运行结果,上机调试完善后的程序,看看你的程序运行结果是否与书中的结果一致。
#include
main()
{
int;/*定义变量a、b、c,并给变量赋初值*/
floatd,x1,x2;
clrscr();
d=sqrt();/*求b2-4ac的平方根*/
;/*求x1的值*/
;/*求x2的值*/
printf("x1=%.2f\n",x1);
printf("x2=%.2f",x2);
}
运行结果为:
x1=-0.59
x2=-3.41
提示:
求根公式为:
C语言中计算平方根的函数是sqrt()函数,例如,sqrt(a+b)即是求a+b的平方根。
第三节 上机实习二:
关系表达式和逻辑表达式
一、目的要求
1、掌握各种关系运算符和逻辑运算符的功能。
2、能正确理解“真”、“假”的概念,及其在C语言中的表示形式。
3、能够把一个命题写成符合C语言语法规则的关系表达式或逻辑表达式。
二、上机内容
1、运行下列程序,分析并观察运行结果。
(1)main()
{
inta,b,c;
a=1;
b=2;
c=3;
clrscr();
printf("a=%d,b=%d,c=%d\n",a,b,c);
printf("a
%d\n",a
printf("a<=b的值为:
%d\n",a<=b);
printf("a==c的值为:
%d\n",a==c);
printf("a!
=c的值为:
%d\n",a!
=c);
printf("c>b的值为:
%d\n",c>b);
}
(2)main()
{
intx=3,y=4,z=5;
intb;
clrscr();
printf("x=%d,y=%d,z=%d\n",x,y,z);
b=xprintf("x%d\n",b);
b=xz;
printf("xz的值为:
%d\n",b);
b=xz;
printf("xz的值为:
%d\n",b);
b=!
x;
printf("!
x的值为:
%d\n",b);
b=!
(x>y);
printf("!
(x>y)的值为:
%d\n",b);
b=(x>y||x>z)&&yprintf("(x>y||x>z)&&y%d\n",b);
}
(3)main()
{
intx=20,y;
clrscr();
y=2printf("x=%d\n",x);
printf("2%d\n",y);
y=2printf("2%d",y);
}
2、完善程序。
已知,闰年符合下面两个条件之一:
(1)能被4整除,但不能被100整除;
(2)能被400整除。
下面的程序验证2000年为闰年,请在横线处填写正确的运算符或表达式,使程序完整。
程序的后面给出了该程序正确的运行结果,上机调试完善后的程序,看看你的程序运行结果是否与书中的结果一致。
提示:
可以通过求余运算判断能否整除。
若a%b的值为0,则表明a能被b整除。
main()
{
intyear=2000,b;
b=(year%4==0year%1000)();
clrscr();
printf("%d",b);
}
运行结果:
1
第四节 上机实习三:
赋值运算
一、目的要求
1、理解赋值运算符的意义,了解赋值运算符与数学中的等号的区别。
2、熟悉常用的复合赋值运算符以及自增和自减运算符。
二、上机内容
1、下面的程序均有语法错误,上机调试程序,注意观察Message窗口中的出错信息,并根据出错信息改正程序中的错误之处。
(1)main()
{
inta;
0=a;
printf("a=%d",a)
}
(2)main()
{
inta;
b=1,c=2;
b+c=a;
printf("a=%d",a);
}
2、运行下列程序,分析并观察运行结果。
(1)main()
{
intx,y;
clrscr();
x=y=25;
printf("x=%d,y=%d",x,y);
}
(2)main()
{
intx=3,y=2;
clrscr();
x*=y+8;
printf("1:
x=%d\n",x);
x-=y;
printf("2:
x=%d\n",x);
}
(3)main()
{
inta=10,b;
clrscr();
b=a++;
printf("a=%d,b=%d\n",a,b);
b=++a;
printf("a=%d,b=%d\n",a,b);
}
3、完善程序。
下面程序的功能是交换变量a和b的值,请在横线处填写正确的表达式或语句,使程序完整。
程序的后面给出了该程序正确的运行结果,上机调试完善后的程序,看看你的程序运行结果是否与书中的结果一致。
提示:
交换两个变量的值,需要一个中间变量来暂时存放其中一个变量的值。
下面的程序段是错误的:
a=b;
b=a;
若变量a的初值为1,b的初值为2,那么执行了第一个语句之后,变量a的值就变成了2,而不再是原来的值1。
因此整