C语言程序设计实验教案.docx

上传人:b****8 文档编号:11408802 上传时间:2023-02-28 格式:DOCX 页数:51 大小:82.18KB
下载 相关 举报
C语言程序设计实验教案.docx_第1页
第1页 / 共51页
C语言程序设计实验教案.docx_第2页
第2页 / 共51页
C语言程序设计实验教案.docx_第3页
第3页 / 共51页
C语言程序设计实验教案.docx_第4页
第4页 / 共51页
C语言程序设计实验教案.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

C语言程序设计实验教案.docx

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

C语言程序设计实验教案.docx

C语言程序设计实验教案

 

《高级语言程序设计》

实验指导书

 

实验一顺序结构程序设计

一、实验目的及要求

1.掌握C语言中使用最多的一种语句——赋值语句的使用方法。

2.掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符。

二、实验学时

4学时

三、实验任务

1.以下程序多处有错。

要按下面指定的形式输入数据和输出数据时,请对该程序做相应的修改。

#include

voidmain()

{doublea,b,c,s,v;

printf(inputa,b,c:

\n);

scanf("%d%d%d",a,b,c);

s=a*b;

v=a*b*c;

printf("%d%d%d",a,b,c);

printf("s=%f\n",s,"v=%d\n",v);

}

当程序执行时,屏幕的显示和要求输入形式如下:

inputa,b,c:

1.02.03.0此处的1.02.03.0是用户输入的数据

a=1.000000b=2.000000,c=3.000000此处是要求的输出格式

s=2.000000,v=6.000000

相关知识:

①检查程序错误时应注意几点:

a)有时程序中一个错误会引发一系列错误信息,工作中不应被这种情况所迷惑,改正了一些错误后应及时对源程序重新进行编译;

b)如果修改错误时增删了行,或是一个行里有多个错误,更正前面错误时增删了字符,就可能导致系统对错误定位不准,此时应该重新编译;

c)系统给出的警告信息一般都说明程序中有问题,因为系统发现了可疑情况。

对于警告信息同样要逐个仔细分析。

除非明确认定不是问题,否则绝不能简单地认为不是错误而不予理睬。

实际上,很多警告都是因为程序中确实有严重的隐含错误。

d)在连接中发现新错误也需要仔细检查和修改程序。

连接时发现的错误一般是由于函数名或外部变量名字写错,或者一些函数、外部变量没有定义引起的。

系统不能对连接错误给以自动定位,只能提供有关的名字信息等。

对于这类问题,可以借助编辑器的字符串查找命令进行定位。

②正确调用scanf函数和printf函数构成输入和输出语句。

2.有以下程序

#include

voidmain()

{charc1,c2;

intn1,n2;

c1=getchar();

c2=getchar();

n1=c1-'0';n2=n1*10+(c2-'0');

printf("%d\n",n2);

}

程序运行时输入:

12<回车>,执行后输出结果是什么?

相关知识:

①getchar()函数用来输入两个字符分别赋给变量c1和c2;

②n1=c1-'0'相当于n1='1'-'0',字符1的ASCII码值比0大一,所以n1中的值为1,c2-'0'相当于'2'-'0';

③把字符串转换为多位数的算法。

3.若有以下程序

#include

voidmain()

{inti,j;

intx,y;

scanf("i=%d,j=%d",&i,&j);

scanf("%d%d",&x,&y);

printf("i=%d,j=%d\n",i,j);

printf("%4d%4d\n",x,y);

}

要求给i赋值为10,j赋值为20,则应该怎样从键盘输入数字?

相关知识:

①在调用scanf()函数时在格式串中若包含有格式描述符之外的字符时,则要求在输入数据时在对应的位置上输入完全匹配的字符;

②scanf()函数只包含格式描述符时可用跳格键Tab、空格和回车分隔数据;

③在调用printf()函数时在格式串中若包含有格式描述符之外的字符时,则在输出数据时在对应的位置上输出完全匹配的字符,%d之类的格式符位置输出对应输出项的值;故输出时要注意插入适当的非格式符以便区分各个输出结果。

4.计算定期存款本利之和

设银行定期存款的年利率rate为2.25%,并已知存款期为n年,存款本金为capital元,试编程计算n年后的本利之和deposit。

要求定期存款的年利率rate、存款期n和存款本金capital均由键盘输入。

四、实验重点、难点

1.符数据输入输出函数

2.格式输入输出函数

五、操作要点

按Alt+R可进入Run菜单,其中Run:

运行由Project/Projectname项指定的文件名或当前编辑区的文件。

如果对上次编译后的源代码未做过修改,则直接运行到下一个断点(没有断点则运行到结束)。

否则先进行编译、连接后才运行,其热键为Ctrl+F9。

Userscreen:

显示程序运行时在屏幕上显示的结果。

其热键为Alt+F5。

六、注意事项

1.输入输出的数据类型与所用格式说明符不一致

2.输入变量时忘记使用地址符号

实验二逻辑结构程序设计

一、实验目的及要求

1.了解C语言表示逻辑量的方法(以0代表“假”,以非代表“真”)。

2.学会正确使用逻辑运算符和逻辑表达。

3.熟练掌握if语句和switch语句.

4.学习调试程序。

二、实验学时

6学时

三、实验任务

1源程序中包含有一些错误,调试下列程序,使之具有如下功能:

输入a、b、c三个整数,求最小值。

#include“stdio.h”

voidmain()

           { inta,b,c;

             scanf("%d%d%d",a,b,c);

             if((a>b)&&(a>c))

               if(b

                 printf("min=%d\n",b);

               else

                 printf("min=%d\n",c);

             if((a

               printf("min=%d\n",a);

            }

再次运行程序,输入为“2,1,3”,程序输出却是“min=2”。

用单步执行的方法,马上发现变量a、b、c的值是不对的,原因是程序要求输入数据的分隔符是空格(还允许使用回车或键)。

改正输入数据的分隔方式后,程序没有输出,还是用单步执行的方法,监视程序的执行过程,发现程序中条件设计有误,经过改正的程序如下:

   #include“stdio.h”

voidmain()

   {inta,b,c;

     scanf("%d%d%d",&a,&b,&c);

     if((a

        printf("min=%d\n",a)

     elseif((b

        printf("min=%d\n",b);

     elseif((c

        printf("min=%d\n",c);

     else

        printf("Nofindminimum\n");

    }

上述程序是按在三个数中仅有一个最小值时才称其为最小值进行设计的。

另外,注意程序的书写格式,一定要采用缩进格式,即不同层次(分支)的语句左起的空格不同,这样可以有效地提高程序的可读性。

相关知识:

①类似a

④求最值的简单算法。

2.参考上一题,编写一个C程序,求a、b、c、d四个数中的最大者。

编程点拨:

①多定义一个变量,并一开始令变量max=a;

②if(max

3.输入4个整数,要求按由小到大顺序输出。

得到正确结果后,修改程序使之按由大到小顺序输出。

相关知识:

①输入函数scanf()的使用;②简单的排序算法;③通过中间变量t交换a和b值的方法:

t=a;a=b;b=t;。

4.根据以下函数关系,对输入的每个x值,计算出相应的y值。

#include

#include

voidmain()

{floatx,y;

scanf("%f",&x);

if()

y=;

elseif()

y=;

else

printf("x=%f,y=%f",x,y);

}

相关知识点:

if语句的嵌套;数学函数的调用方式。

5模仿第4题,写程序实现以下函数:

用scanf函数输入x的值,求y值。

运行程序,输入x的值(分别为x<1、1≤x<10、x≥10三种情况),检查输出的y值是否正确。

相关知识:

①用if的嵌套实现分段函数;②比较运算符的正确使用;③算术运算符*的正确使用。

6.阅读分析以下程序的功能。

#include

voidmain()

{intchoice;

intvalue;

printf("Convert:

\n");/*显示菜单*/

printf("1:

decimaltohexadecimal\n");

printf("2:

hexadecimaltodecimal\n");

printf("3:

decimaltooctal\n");

printf("4:

octaltodecimal\n");

printf("enteryourchoice:

");

scanf("%d",&choice);

switch(choice)

{case1:

/*选中1时处理*/

printf("enterdecimalvalue:

");

scanf("%d",&value);

printf("%dinhexadecimalis:

%x\n",value,value);

break;

case2:

/*选中2时处理*/

printf("enterhexadecimalvalue:

");

scanf("%x",&value);

printf("%xindecimalis:

%d\n",value,value);

break;

case3:

/*选中3时处理*/

printf("enterdecimalvalue:

");

scanf("%d",&value);

printf("%dinoctalis:

%o\n",value,value);

break;

case4:

/*选中4时处理*/

printf("enteroctalvalue:

");

scanf("%o",&value);

printf("%oindecimalis:

%d\n",value,value);

break;

}

}

相关知识:

①用switch语句实现菜单的方法;②数制转换的方法。

7.模仿第6题,要求对输入的数字1~7转换成文字星期几,对其它数字不转换。

例如,输入5时,程序应该输出Friday。

编辑、调试和运行该程序,然后输入4。

其输出结果是什么?

为什么是这样的结果?

该程序有哪些错误?

如何修改?

相关知识:

①switch语句的正确使用;②break在switch语句中的作用。

四、实验重点、难点

1.表达式

2.选择型程序设计语句

3.逻辑表达式

五、操作要点

按Alt+C可进入Compile菜单,Buildall:

重新编译项目里的所有文件,并进行装配生成.EXE文件。

该命令不作过时检查 。

六、注意事项

1.误把“=”作为关系运算符“等于”

2.没有注意大写字母和小写字母代表不同的标识符

3.当一个复合语句中使用多层括号时,常出现大括号不配对的现象。

实验三循环控制

一、实验目的及要求

1.熟悉掌握用语句,语句和语句实现循环的方法。

2.掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。

二、实验学时

6学时

三、实验任务

1.下面程序求1+…+100,填空,实现该功能。

#include

voidmain()

{

ints,i;

s=0;/*第5行*/

for()

s=s+i;

printf("1+...+100=%d\n",s);

}

思考:

(1)第5行能不能去掉?

其作用是什么?

(2)不用for语句,用while语句改写该程序,实现同样的功能。

2.比较下列两个程序。

(验证)

#include

voidmain()

{inti,n,sum=0;

scanf("%d",&i);

n=i;

while(i<=10)

{sum+=i;

i++;

}

printf("%d+...+10=%d",n,sum);

}

#include

voidmain()

{inti,n,sum=0;

scanf("%d",&i);

n=i;

do

{sum+=i;

i++;

}while(i<=10);

printf("%d+...+10=%d",n,sum);

}

分别运行这两题,若输入7,这两个程序的结果分别是多少?

若输入12,这两个程序的结果又分别是多少?

比较为什么会有这样的区别?

3.预习下面程序,若输入12345,分析输出结果是多少?

上机验证。

#include

voidmain()

{longdata;

scanf("%ld",&data);

while(data)

{printf("%ld,",data%10);

data=data/10;

}

}

4.下面程序实现求Fibonacci数列的前n个数。

(验证、调试)

运行程序,写出运行结果;采用单步跟踪技术运行该程序,观察一下变量的变化。

#include

voidmain()

{longintf1,f2;

inti,n;

printf("Inputn:

");/*第5行*/

scanf("%d",&n);/*第6行*/

f1=f2=1;

for(i=1;i

{printf("%ld\t%ld\n",f1,f2);/*第9行*/

f1=f1+f2;

f2=f2+f1;

}

}

思考:

(1)f1、f2这两个变量为什么定义为longint型?

(2)第5行和第6行的相互作用,你会用这种方式来实现输入吗?

(3)注意第9行的输出“%ld”中的“1”是字母“L”的小写形式,不是数字1。

5.预习下面程序,写出预习结果并上机验证。

(验证)

#include

voidmain()

{inti,j,x;

for(i=0,x=0;i<2;i++)

{x++;

for(j=0;j<3;j++)

{if(j%2)continue;

x++;

}

x++;

}

printf("x=%d\n",x);

}

思考:

用一句话概括if(j%2)语句的作用。

相关知识:

嵌套for循环的执行过程及continue语句的作用。

6.下面程序输入一批考试分数,用1作为结束标志,若输入大于100分,则提示重新输入,然后计算最高分、最低分与平均分。

请调试、检查程序中的错误,并改正之。

#include

voidmain()

{intmark;

intn=0;sum=0;

intmax=100;min=0;

for(;;);

{scanf("%d",&mark);

if(mark>100)

{printf("Mark>100,Pleasereinput\n");

break;

}

if(mark=-1)

break;

n++;

sum=sum+mark;

if(mark>max)

max=mark;

if(mark

min=mark;

}

sum=sum/n;

printf("max=%d,min=%d,aver=%d\n",max,min,sum);

}

提示:

该程序有很多错误,下面给出某些错误的说明。

当求一批数中的最大值时,若已知一批数的最小值,则将这个最小值作为最大值的初始值;当求最小值时,情况相反,即若已知这批数的最大值,则将这个最大值作为最小值的初始值。

本例中求一批分数的最高分,则最高分的初始值应该设为0,然后在程序循环中逐渐地升高,直至求出最高分;本例中还要求这批分数的最低分,则最低分的初始值设为100,然后在程序循环中逐渐地降低,直至求出最小值。

实现“若输入大于100分,则提示重新输入”功能的语句有错;实现“用1作为结束标志”功能的语句有错。

思考:

(1)“一批数据”是几个数据?

输入的数据如何结束?

程序中哪一行是实现结束这个要求的,写出该语句。

(2)程序中哪个语句是实现”若输入大于100分,则提示重新输入”这个要求的,写出该语句。

(3)写出您的测试数据及运行结果,注意输入的数据序列中最后一个应是-1。

7.编程:

输入20个1~90的整数,分类统计1~30、31~60、61~90的数各有多少个?

编程点拨:

(1)count1计1~30的个数,count2计31~60的个数,count3计61~90的个数。

(2)用for循环20次实现该程序的功能:

输入一个整数x,判断该数所在的范围,若x是1~30,则count1加1;若x是31~60,则count2加1;若x是61~90,则count3加1。

(3)最后,输出统计的结果。

#include

voidmain()

{intcount1=0,count2=0,count3=0;

inti,x;

printf(“Pleaseinput20numbers:

”);

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

{scanf(“%d”,&x);

………/*补充完成程序*/

}

/*输出统计结果*/

……………

}

补充完成该程序。

8.编程:

素数是除了1和其本身以外,不能被其他自然数整除的自然数。

从键盘输入一个数,判断该数是不是素数?

编程点拨:

a)输入这个数x。

b)用for循环2~x-1,用2~x-1的每一个数去除x,若有一个数整除x,则说明x不是素数;否则,x就是素数。

c)最后,将判断结果输出。

#include

voidmain()

{inti,x;

printf("Enteronenaturalinteger:

");

scanf("%d",&x);

for(i=2;i

……………

}

思考:

其实,只需要判断2~

之间的整数能否整除x就可以判断x是否为素数,此时,如何修改程序?

9.编程:

显示所有的水仙花数。

谓水仙花数,是指一个3位数,其各位数字立方和等于该数字本身。

例,153是水仙花数,因为153=13+53+33。

有两种解题思路,选择其中之一编程实现:

(1)利用三重循环,将这三个数通过一定的运算符连接成一个3位数,然后判断是否是水仙花数。

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

for(j=0;j<=9;j++)

for(k=0;k<=9;k++)

注意,因水仙花是一个三位数,百位i是从1开始,不能从0开始,十位j和个数位k可以从0开始。

(2)利用一个循环,对100~999范围内的每个3位数逐位分离后进行判断。

for(i=100;i<999;i++)

{a=i/100;

b=(i-a*100)/10;

c=i%10;

………

}

10.编程:

输出下列图形。

 

分析:

这是由星号构成的5行5列的三角形图形。

每一行的星号数量为:

1、3、5、7、9。

考虑两点,一是每一行上星号的生成规则,二是每一行第一个星号字符的输出位置。

每一行的星号与行号有关,即2*i+1,其中i是行号;每一行的输出位置比上一行少一个空格,可以这样实现:

for(j=1;j<=40-i;j++)printf(“%c”,‘’),其中i是行号。

四、实验重点、难点

1.循环语句

2.循环的嵌套

3.break和continue语句

五、操作要点

Run菜单中Gotocursor:

:

调试程序时使用,选择该项可使程序运行到光标所在行。

光标所在行必须为一条可执行语句,否则提示错误。

其热键为F4。

Traceinto:

在执行一条调用其它用户定义的子函数时,若用Traceinto项,则执行长条将跟踪到该子函数内部去执行,其热键为F7。

六、注意事项

1.对应该有花括号的复合语句,忘记加花括号

2.在不该加分号的地方加了分号

3.引用数组元素时误用圆括号

4.引用数组元素超界

5.对二维或多维数组定义和引用的方式不对

6.误以为数组名代表整个数组

7.混淆字符数组与字符指针的区别

实验四数组

一、实验目的及要求

1.掌握一维数组和二维数组的定义、赋值和输入输出的方法;

2.掌握字符数组和字符串函数的使用;

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

二、实验学时

6学时

三、实验任务

1.调试下列程序,使之具有如下功能:

输入10个整数,按每行3个数输出这些整数,最后输出10个整数的平均值。

写出调试过程。

#inclue

#defineN10

voidmain()

{inti,a[N],av;

for(i=0;i

     scanf("%d",a[i]);

     for(i=0;i

        {printf("%d",a[i]);

          if(i%3==0)

            printf("\n");

         }

      for(i=0;i!

=N;i++)

         av+=a[i];

      printf("av=%f\n",av);

  }

上面给出的程序是完全可以运行的,但是运行结果是完全错误的。

调试时请注意数组元素的输入问题、输出格式问题等。

请使用前面实验所掌握的调试工具,判断程序中的错误并改正。

相关知识:

①数组元素值的输入;②求和求平均值的相关变量初始化问题;③输出格式符的正确使用。

④数组元素的格式化输出。

2.下面程序是输入5个数据,然后求它们的和并输出结果。

#include

voidmain()

{inti,a[5],sum=0;

scanf("%d,%d,%d,%d,%d",a);

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

sum+=a[i];

printf("sum=%d\n"

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

当前位置:首页 > 高等教育 > 院校资料

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

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