作者:陈家俊、卢清平、杨洋
出版社:人民邮电出版社有限公司
格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT
C语言程序设计实验指导教程试读:
前言
程序设计技术和程序设计语言是大学计算机基础系列课程中的重要组成部分, C语言程序设计课程是一门重要的计算机基础必修课程。程序设计课程的主要任务是培养学生使用计算机的逻辑思维能力和基本的程序设计能力。通过C语言程序设计课程的学习,学生能为今后进一步学习计算机有关课程及用计算机解决实际应用问题打下一个良好的基础。
参加本次教材编写的老师,近年来一直在任担“C语言程序设计”课程的教学工作。大家有一个共识:“C语言程序设计”课程的教学重点应是C语言基本知识及程序设计的基本原理、结构化程序设计方法,其内容主要包括程序设计基本概念、C语言基本数据类型、运算符和表达式,格式化数据输入/输出,控制结构语句、结构化程序开发方法,函数及程序模块化开发,数组、字符串、指针及其应用,结构体应用基础,数据文件的应用基础。
考虑到各类高校大学生的计算机基础知识层次不同及高校各专业对C语言课程人才培养要求的不同,本书以程序设计为主线,以人才层次化培养为导向,以层次化的知识结构组织实验。实验内容包括基础实验或提高实验。题型设计由简到难,供不同知识层次学生选做。由于C语言程序设计课程教学课时有限,同时为了强化学生的逻辑思维及自主学习的能力,在教学过程中,教师特别要把学生在学习过程中经常碰到的难点问题讲解清楚,但应避免例题讲解中对比较复杂的数学问题花费较多的教学时间。
在上述共识的基础上,作者经过多次的商讨,反复修改制订了本《C语言程序设计实验指导教程》的编写大纲,以更好地适应教学,本教程由皖西学院电子与信息工程学院陈家俊、卢清平、杨洋主编。其中,第1部分和第2部分由陈家俊、卢清平编写,第3部分由杨洋和马艳编写,皖西学院电子与信息工程学院部分老师参与了整理和校对工作。编者2017年6月第1部分 C语言程序设计课程实验总体要求
C语言程序设计课程是一门实践性很强的课程,为了培养计算机应用能力,除了课堂理论教学外,读者必须加强程序设计课程实验环节的学习。1.1 课程实验教学目的
通过C语言程序设计的课程实验教学,学生应具有使用计算机解决相关应用问题的能力,同时为今后学习其他计算机应用课程打下良好的程序设计基础。
1.分析问题和解决问题能力的训练
课程实验教学将课本上的理论知识和实际应用有机地结合起来,达到训练学生分析问题和解决实际问题的能力,提高学生应用计算机知识开发应用系统的综合能力。
2.逻辑思维能力的训练
通过课程实验教学,学生能正确地掌握C语言的基本知识,较好掌握基本的程序算法及描述方法。实验教学培养了学生在程序设计解题思路、算法的描述、编程构思等各方面的计算机逻辑思维能力。
3.程序设计技能的训练
通过C语言环境下的应用实例,学生能训练编写程序的能力,掌握编程的思路和方法,掌握结构化程序设计的基本概念和基本技能。
通过课程实验教学,学生掌握C程序设计语言的语法规则、数据结构的应用,掌握算法描述及相应代码描述,掌握结构化程序设计的基本方法,能熟练编写一般的应用程序。1.2 课程实验教学要求
1.要求通过解题、程序设计和上机实践,加深对所学概念的理解,提倡理论与实践相结合的学习方法。
2.要求学生认真进行解题分析,掌握算法描述方法,掌握编程基本技能。通过布置具有一定数量程序设计题目,帮助学生逐步熟悉编写程序的方法,并适当布置一些有难度的程序设计题目,提高程序设计能力。
3.要求学生在课程实验中,努力培养发现程序错误、纠正程序错误的能力,独立完成每一次课程实验,提高编程的效率和成功率。
4.要求学生在完成课程实验规定的任务外,利用课余的时间多编程,多上机实践。反对抄袭或复制他人的源程序。
5.要求学生培养科学、严谨的学习作风,认真写好实验报告。学生在上机实践前,应事先编写好相应的源程序,准备好有关的调试数据,了解上机操作的步骤和过程,较好地完成每一次上机实验课。为了使学生能真正做到每一次课程实验有收获,做完一个实验后,要求学生必须写出完整的实验报告。C语言课程实验报告内容应包括以下几项。(1)实验名称、时间、地点。(2)实验目的要求。(3)实验内容包括本次课程实验的题目,算法描述,源程序清单,上机调试、运行的操作步骤。(4)程序运行结果(将源程序保存到软盘上)、课程实验分析和实验小结、心得体会。1.3 课程实验教学安排
C语言程序设计课程实验,实验1~实验13一般可以安排32~50机时,可以在课内实验之外安排综合性的实验,一般综合性实验12~20学时,进行程序编辑、调试和运行。C语言课程实验教学安排如表1-1所示。表1-1 课程实验安排表第2部分 C语言程序设计实验指导实验1 C语言程序开发环境
1.1 实验目的
1.熟悉C语言程序开发环境。
2.掌握C语言建立、保存、调试运行的基本方法和步骤。
1.2 实验指导
[范例] 下面程序实现在Visual C++ 6.0 IDE环境下输出:This is my first C program!。
/* syfl1-1.c */
# include "stdio.h"
void main( )
{printf("This is my first C program!");
}
实验步骤:(1)启动Visual C++ 6.0,单击“文件(F)”菜单中的“新建(N)…”子菜单项,系统将弹出“新建”对话框,如图2-1所示。图2-1(2)选择新建对话框中的“工程”选项卡,再选中“Win32 Console Application”项,在“工程名(N)”文本框中输入欲建工程名,如SYFL;然后在“位置(C)”文本框中输入欲保存该工程的路径(Visual C++ 6.0 IDE自动将用户输入的工程名作为文件夹名),或是通过单击其右边的按钮,在弹出的“选择目录”对话框中选择保存源文件的路径。(3)单击“确定”按钮,系统将弹出一个对话框让用户选择建立何种工程。选中“一个空工程(An empty project)”的单选项后并单击“完成”按钮,如图2-2所示。图2-2(4)向工程中添加源文件并编辑保存源文件。在下拉菜单——项目(Project)|加到项目(Add to project)中选择新(new)标签,再选择文件(File)标签,选择文件类型为C++Source File,输入源文件名如SYFL1_1.c,选择保存源文件的位置,按确定按钮后将生成一个新的空文件SYFL1_1.c,并出现源文件编辑窗口,在编辑窗口中输入与修改程序代码,完成后可保存源文件,如图2-3和图2-4所示。图2-3图2-4(5)运行项目程序。选择下拉菜单—编译(Build)|开始调试(Start Debug)|运行(Go),对应的快捷方式为F5,将运行项目程序。
1.3 实验内容【基础实验】
在VC++环境下分别建立以下两个程序文件并调试运行,记录下调试过程和运行结果,由此熟悉VC++环境的使用方法和实验基本步骤。
/* 程序e101.c */
#include"stdio.h"
main()
{printf("Hello!\n");printf("Hello,vc++!");printf("Hello,everyone!\n");
}
/* 程序e102.c */
#include "stdio.h"
main()
{int a,b;a=8;b=2000; printf("%d\n",a+b);
}【提高实验】
1.运行以下程序,查看运行结果。
/* 程序e103.c */
#include"stdio.h"
main()
{int a,b;printf("Input a,b:");scanf("%d%d",&a,&b);printf("a+b=%d\n",a+b);
}
2.编写程序实现:从键盘输入3个整数,求这3个整数的平均值。
1.4 实验小结
1.学生在输入编辑程序的过程中难免出现一些差错,可能影响到编译时不能通过。如果出现ERROR或者WARNING,教师可以教学生阅读相关的错误提示语句,提高学生的纠错能力。
2.教师可根据学生的层次水平,从【基础实验】和【提高实验】中有选择的要求学生写出实验报告,实验报告要求如下。(1)记录C程序在上机调试运行时出现的各种问题及其解决方法。(2)简明扼要地写出在调试运行一个C程序时的完整步骤。(3)总结本次实验的经验与教训。实验2 基本数据类型与表达式
2.1 实验目的
1.熟悉C语言基本语法结构。
2.掌握C语言基本数据类型及其数据类型变量的定义和使用。
3.掌握不同数据类型运算时,数据类型的转换。
4.掌握赋值语句。
2.2 实验指导
[范例1] 输入、编辑并运行以下程序。
main ( )
{char c1, c2;c1=97; c2=98;printf("%c,%c \n",c1 ,c2);
}(1)在程序中加入以下printf语句:
printf("%d,%d\n",c1,c2);(2)将程序第3行改为如下语句并运行。
int c1, c2;(3)将程序第4行改为:
c1=300; c2=400;
运行程序,分别写出3次的运行结果。
[范例2] 运行下列程序,观察其执行结果,并思考为什么?若把最后一个语句(++x,y++)外的括号去掉,程序还要做何修改?
#include
main( )
{int y=4,x=6,z=2;printf("%d %d %d\n",++y,--x,z++);printf("%d %d\n",(++x,y++),z+2);
}
2.3 实验内容【基础实验】
1.在VC++集成环境下调试运行以下源文件,注意程序中实型数据和赋值语句的使用。
/* 程序e201.c */
#define PI 3.14159 /* 定义符号常量PI */
main()
{float r=16.7; /* 定义变量r并赋初值 */float l,s; /* 定义圆周长和圆面积的变量 */l=2*PI*r; /* 计算圆周长 */s=PI*r*r; /* 计算圆面积 */printf("L=%f S=%f\n",l,s); /* 输出圆周长、面积的计算结果 */
}
输出结果为:______
/* 程序e202.c */
main()
{float r,s; /* 定义浮点型变量r,s */r=2.769; /* 为r赋实数值 */s=3.1416*r*r; /* 计算实数表达式的值,然后赋值给s */printf("s=%f\n",s); /* 输出浮点型变量s的值 */
}
输出结果为:______
2.在VC++集成环境下建立e203.c、e204.c源文件,调试运行并写出运行结果,注意程序中字符型数据使用以及字符型变量与整数的关系。
/* 程序e203.c */
main()
{ char ch1='A';char ch2;ch2='a';printf("%c,%c\n",ch1,ch2); }
输出结果为:______
/* 程序e204.c */
main()
{ char ch;int i;ch='A';ch=ch+32;i=ch;printf("%d is %c\n",ch, i );printf("%c is %d\n",ch,ch);}
输出结果为:______
3.运行程序,分析并写出结果,注意运算符的使用。
/* 程序e205.c */
main()
{
int a,b;
a=15,b=8;
printf("%d\n", a=a+1,b+a,b+3 );
}
输出结果为:______
/* 程序e205.c */
main()
{ int a=100;
printf("%d\n", ++a);
printf("%d\n", a++);
printf("%d\n", a);
}
输出结果为:______
4.分析并写出下列程序的运行结果。
/* 程序e206.c */
#include
main()
{int a,b;a=3;b=a++;printf("a=%d b=%d\n",a,b);a=3;b=++a;printf("a=%d b=%d\n",a,b);a=3;b=++a*++a; printf("a=%d b=%d\n",a,b);a=3;b=++a*a++; printf("a=%d b=%d\n",a,b);a=3;b=a++*++a; printf("a=%d b=%d\n",a,b);a=3;b=a++*a++; printf("a=%d b=%d\n",a,b);a=3;printf("++a=%d a++=%d\n",++a,a++);
}
输出结果为:______
/* 程序e207.c */
#include
main()
{int x,y,z;x=y=z=0;++x|| ++y|| ++z;printf("x=%d y=%d z=%d\n",x,y,z);x=y=z=0;++x&&++y|| ++z;printf("x=%d y=%d z=%d\n",x,y,z);x=y=z=0;++x&&++y&&++z;printf("x=%d y=%d z=%d\n",x,y,z);x=y=z=0;++x|| ++y&&++z;printf("x=%d y=%d z=%d\n",x,y,z);
}
输出结果为:______
/* 程序e208.c */
#include
main()
{int a=5,b=3,c,d;d=(c=a++,c++,b*=a*c,b/=a*c);printf("%d\n",d);printf("a=%d b=%d c=%d\n",a,b,c);
}
输出结果为:______【提高实验】
1.编写程序,输入一个数字字符('0'~'9'),并将其转换为相应的整数后显示出来。写出源程序,上机编辑、调试、运行程序。
2.根据分析提示,试着完成下面的程序,并上机调试成功。
编程:编写一个程序从键盘输入圆柱体的半径r和高度h,计算其底面积和体积。
分析:已知半径r和高度h,依据圆面积的计算公式S =π×r×r和圆柱体体积计算公式V=π× r×r×h,可计算其底面积S和体积V。
不完整程序如下,应先在下画线位置填写正确的参数或表达式,再运行该程序。
/*e209.c */
#include
main( )
{float pi=3.1415926;float r,h,S,V;printf("Please input r,h:");scanf("%f,_____",&r,______ ); /*键盘输入圆半径r和高度h*/S=_________; /*计算圆面积S的值*/V=_____________; /*计算圆柱体体积V的值*/printf("底面积= \t圆柱体积= \n",S,V );
}
2.4 实验小结
1.根据学生实验过程中遇到的问题,教师向学生总结本次实验的重点和难点,要求学生重点关注。
2.教师可根据学生的层次水平,从【基础实验】和【提高实验】中有选择地要求学生写出实验报告,实验报告要求如下。(1)记录源程序在上机调试时出现的各种问题及其解决办法。(2)按要求编写程序,并要保证其正确性。(3)总结本次实验的经验与教训。实验3 输入/输出操作
3.1 实验目的
1.掌握C表达式类型(赋值表达式、算术表达式、关系表达式、逻辑表达式、条件表达式和逗号表达式)和求值规则。
2.掌握基本的输入/输出函数scanf()、getchar()、printf()和putchar()函数。
3.掌握编写顺序结构程序的基本方法。
3.2 实验指导
[范例1] 运行下列程序,观察其执行结果,并思考为什么?
/*e301.c */
#include
main( )
{char c1='a',c2='b',c3='c',c4='\102',c5='\x61';printf("a%cb%c\tc%c\tabc\n",c1,c2,c3);printf ("\t\b%c %c\n",c4,c5);printf ("\\\t\'\t\"");printf ("\n%c\t%d",c1,c1);
}
输出结果为:______
[范例2] 运行下列程序,输入数据流:12345678267.92,观察其执行结果,并思考为什么?
/* 程序e302.c */
main()
{int i;float r;scanf("%3d%*4d%f",&i,&r);printf("i=%d,r=%f\n",i,r);
}
输出结果为:______
[范例3] 编写程序,要求实现从键盘输入一个大写英文字母,在屏幕上输出它的小写形式。
思路:(1)小写字母ASCII码值=大写字母ASCII码值+32。(2)字符字母的输入函数getchar()。(3)字符字母的输出函数putchar()。
参考程序:
#include"stdio.h"
main()
{char ch;printf("Input a char:");ch=getchar();putchar(ch+32);
}
程序执行结果如下。
输入:Input a char:T
输出:t
3.3 实验内容【基础实验】
1.运行程序,分析一下结果,注意printf的格式。
#include
void main(){ int a=1234;float f1=12.34567,f2=678.9;printf("1)%d,%6d,%-6d,%2d;\n",a,a,a,a);printf("2)%f,%10.4f,%3.2f;\n",f1,f1,f1);printf("3)%e,%e;\n",f1,f2);
printf("4)%8e,%14e;\n",f1,f1);
printf("5)%10.7e,%10.3e;\n",f1,f1); }
输出结果为:______
2.在VC++环境下调试运行,记录下调试过程和运行结果,注意scanf()语句输入方法。
main( ){ int a; float b ; char c ;① printf("按格式%%d%%f%%c送数:");② scanf("%d%f%c", &a, &b, &c);③ printf("a=%d, b=%f, c=%c,\n",a, b, c);④ printf("按格式%%d,%%f,%%c送数:");⑤ scanf("%d,%f,%c", &a, &b, &c);⑥ printf("a=%d, b=%f, c=%c,\n",a, b, c);⑦ printf("按格式%%6d%%6f%%6c送数:");⑧ scanf("%6d%6f%6c", &a, &b, &c);⑨ printf("a=%d, b=%f, c=%c,\n",a, b, c); }
调试过程:
①输出:______
②输入:______
③输出:______
④输出:______
⑤输入:______
⑥输出:______
⑦输出:______
⑧输入:______
⑨输出:______
3.运行下面程序,注意字符输入/输出函数putchar函数和getchar函数的使用。并比较与scanf()、printf()的区别。
void main( ){ char a ;int b ;a='b';b = 111;putchar( a );putchar( b );putchar('y');putchar('\n'); }
分析并写出输出结果。
4.编程计算下列表达式的值,并思考各运算符的运算优先级。(1)−2/(0.2+1.8)−15%9×2。(2)若x=5,y=8,求表达式 x+6 !=y 5.运行以下程序,给出程序运行结果。 #include main( ) {char c1, c2;scanf("%c,%c", &c1,&c2);+ +c1;− −c2;printf("c1=%c,c2=%c \n ", c1, c2); } 运行结果: 输入:______ 输出:______ 6.编写程序,输入两个整数,输出它们的积。写出源程序,上机编辑、调试、运行程序。【提高实验】 1.阅读程序,完成如下工作。(1)上机编辑、调试程序。(2)运行以下程序,在键盘上如何输入数据,才能使得变量a=10,b=20,cl="A",c2="a", x=1.5,y=-3.75,z=67.8。 程序如下: #include main( ) { int a, b;float x, y, z;char c1, c2;scanf("%5d%5d%c%c ", &a, &b, &c1, &c2);scanf("%f%f%*f,%f", &x, &y, &z); } 2.设三角形边长为a、b、c,编程计算任意三角形的面积。面积area的算法是: 3.4 实验小结 1.根据学生实验过程中遇到的问题,教师向学生总结本次实验的重点和难点,要求学生重点关注。 2.教师可根据学生的层次水平,从【基础实验】和【提高实验】中有选择地要求学生写出实验报告,实验报告要求如下。(1)记录源程序在上机调试时出现的各种问题及其解决办法。(2)按要求编写程序,并要保证其正确性。(3)总结本次实验的经验与教训。实验4 选择结构程序设计 4.1 实验目的 1.掌握C语言逻辑量的表示方法(以0代表“假”,1代表“真”)。学会正确地使用关系表达式和逻辑表达式。 2.掌握用if语句实现选择结构。 3.掌握用switch语句实现多分支选择结构。 4.掌握选择结构的嵌套。 4.2 实验指导 [范例1] 有一函数: 写一程序,当输入x值时,计算输出y值。 说明:(1)根据输入x的不同求y的值,使用if语句。(2)分别输入三个分段中的三个数,判断输出结果是否正确,测试程序正确与否。 参考程序如下: /* 程序e401.c */ #include printf("input x:"); scanf("%f",&x); if( x<1 )y=x; if( x>=1 && x<10 )y=2*x-1; if( x>=10 )y=3*x-11; printf("y=%f\n",y);} [范例2] 从键盘输入一年份,判断年份是否为闰年。 说明:(1)判断闰年的条件:能够被4整除,但不能被100整除或者能被100整除,又能被400整除。(2)使用一个变量来代表是否是闰年。(3)如果是闰年则输出“* is a leap year!”,否则输出“* is not a leap year!”。*代表输入的年份。 参考程序如下: /* 程序e302.c */ #include main( ) {int year;scanf("%d", &year); /*键盘输入年份值*/if (year%4==0&&year%100!=0 || year%400==0)printf("This year is a leap year!\n"); /*如果是,则输出是闰年*/elseprintf("This year is not a leap year!"); /*否则输出不是闰年*/ } [范例3] 阅读程序,完成如下工作。(1)上机编辑、调试程序。(2)运行程序,当输入4时,给出程序运行结果。 main( ) {int x;scanf("%d", &x);switch(x){ case 1:case 2: printf("x<3 \n"); break;case 3: printf("x=3 \n"); break;case 4:case 5: printf("x>3 \n "); break;default: printf("x unknow \n");}} 4.3 实验内容【基础实验】 1.阅读程序,完成如下工作。(1)上机编辑、调试程序。(2)运行程序,当输入“+”时,给出程序运行结果。 #include main( ) {int x=5, y=3;char op;printf("Enter a operator:");scanf("%c", &op);if(op= = ' + ')printf("%d+%d=%d", x, y, x+y);elseif(op= =' − ')printf("%d−%d=%d", x, y, x−y); } 2.阅读程序,完成如下工作。(1)上机编辑、调试程序。(2)运行程序,当输入123时,给出程序运行结果。 #include main( ) {int magic=456;int guess;scanf("%d", &guess);if (guess= =magic)printf("RIGHT!");elseguess>magic ? printf("HIGH"): printf("LOW"); } 3.写出以下程序运行的结果。 #include main( ) {int a=0,b=1;switch(a){case 0: switch(b){case 0: a++; b++; break;case 1: a++; b++;default: a++;}case 1: a++; b++;}printf("a=%d,b=%d\n",a,b); } 4.编写程序,输入一个字母,若为小写,则把它变成大写输出。写出源程序,上机编辑、调试、运行程序。 5.编写程序,从键盘上输入星期号,并显示该日期的英文星期名字。写出源程序,上机编辑、调试、运行程序。 6.编程实现:根据输入学生的成绩输出等级。成绩X≥90分时,等级为A;成绩70≤X<90分时,等级为B;成绩60≤X<70分时,等级为C;成绩X<60分时,等级为D。【提高实验】 1.编写程序,从键盘输入一个字符,判断它是字母、数字还是其他字符,并分别输出其个数。2 2.编写程序求解方程ax+bx+c=0的根。 提示:求方程的根,有多种不同的情形,应采用选择结构解决。 可能的情形如下: ① a=0,不是二次方程。2 ② b-4ac=0,有两个相等实根:−b/(2*a)。2 ③ b-4ac>0,有两个不等实根。 X1=−b/(2*a)+sqrt(b*b−4*a*c)/(2*a) X2=−b/(2*a)−sqrt(b*b−4*a*c)/(2*a)2 ④ b−4ac<0,有两个复根。 实部p:−b/(2*a) 虚部q:Sqrt(−(b*b-4*a*c))/(2*a) 3.编写程序计算运输公司对用户收取运费。 设路程为s,则运费折扣标准如下: s<250 没有折扣 250≤s<500 2%折扣 500≤s<1000 5%折扣 1000≤s<2000 8%折扣 2000≤s<3000 10%折扣 3000≤s 15%折扣 计算公式表示为:f = p×w×s×(1−d) 其中: p:每吨每千米货物基本运费。 w:货物重量。 s:距离。 d:折扣。 4.编写程序,给出一个不多于4位的正整数,要求如下。(1)求出它是几位数。(2)分别输出每一位数字。(3)按逆序输出每一位数字。 代码提示: main( ) {int num, indiv, ten, hundred, thousand,digit;printf("Input a integer number(0~9999):");scanf("%d",&num);thousand=num/1000;hundred=num/100%10;ten=num%100/10;indiv=num%10;if(num>999){}elseif(num>99){}elseif(num>9){}else{} } 4.4 实验小结 写出实验报告,实验报告要求如下。(1)问题分析:写出解决问题的算法思路,画出程序流程图。(2)源程序:根据算法思想或程序流程图编写源程序。(3)调试记录:记录源程序在上机调试时出现的各种问题及其解决办法。(4)总结:总结本次实验的经验与教训。实验5 循环结构程序设计 5.1 实验目的 1.理解循环结构的构成要素。 2.掌握for循环结构的灵活运用。 3.掌握while和do-while循环结构的灵活运用。 4.掌握循环的嵌套结构及continue和break语句的合理运用。 5.2 实验指导 [范例1] 输出下式的前20项之和:(1)编程思路 循环变量初值:i = 1。 循环条件:i≤20。 循环变量修改:i++。 循环体语句:s=s+当前分式值。 修改当前分式。(2)修改当前分式的方法 第一项分子:1。 第一项分母:2。 此后分子规律:后一项分子是前一项分母。 此后分母规律:后一项分母是前一项分子分母之和。(3)参考程序 main( ) { float s=0.0;int a=1, b=2, t, i;for ( i=1; i<=20; i++ ){ s = s + 1.0 * a / b;t = a;a = b;b = t + b;}printf("%f\n", s); } [范例2] 任意输入一个正整数,输出它的每一位之和。(1)编程思路 输入x的值。 循环变量初值:x。 循环条件:x > 0。 循环体语句:a = x % 10;s = s + a;。 循环变量修改:x = x / 10;。 循环结束后:输出s的值。(2)参考程序 main( ) { long x;int a, s = 0;scanf( "%d", &x );while( x>0 ){ a = x%10;s = s + a;x = x / 10;}printf( "%d\n", s); } [范例3] 编程实现图2-5所示的输出。图2-5(1)编程思路 行号 空格数 星号数 1 5 1 2 4 3 3 3 5 4 2 7 5 1 9 6 0 11 设行号为i,则: 第i行空格数为:6 - i。 第i行星号数为:2i -1。 外层循环:控制输出的行数,循环变量i从1循环到6。 内层循环1:循环变量j从1循环到6-i,每次循环,输出一个空格。 内层循环2:循环变量k从1循环到2i-1,每次循环,输出一个*。(2)程序结构 外循环变量初值:i = 1。 外循环条件:i≤6。 外循环体语句如下。 内循环1循环变量:j = 1。 内循环1循环条件:j≤6-i。 内循环1循环体语句:printf(“”);。 内循环1循环变量修改:j ++。 内循环2循环变量:k = 1。 内循环2循环条件:k≤2*i-1。 内循环2循环体语句:printf(“*”);。 内循环2循环变量修改:k ++。 输出换行符:printf(“\n”);。 外循环变量修改:i ++;(3)参考程序 main( ) { int i, j, k;for ( i=1; i<=6; i++ ){ for ( j=1; j<=6-i; j++ )printf (" ");for ( k=1; k<=2*i-1; k++ )printf ("*"); 5.3 实验内容【基础实验】 1.阅读程序,完成如下工作。(1)上机编辑、调试程序。(2)运行程序,给出程序运行结果。 #include } 运行结果:______ 2.程序填空。求出100以内的正整数中,最大的可被13整除的数是哪一个? #include main( ) {int n;for( _________; _________; n--)if(n%13==0) break;printf("%d\n",n); } 3.阅读程序,完成如下工作。(1)上机编辑、调试程序。(2)运行程序,给出程序运行结果。 #include main( ) { int num=0;while(num<=2){ num++;printf("%d \n ", num);} } 运行结果:______ 4.阅读程序,完成如下工作。(1)上机编辑、调试程序。(2)运行程序,给出程序运行结果。 #include main( ) { int i, j, k;char space=' ';for( i =0; i<=3; i++){ for(j=l; j<=i; j++)printf("%c", space);for(k=0; k<=5; k++)printf("%c", ' * ');printf(" \n "); } } 运行结果:______ 5.写出下列程序运行的结果。 #include main( ) {int a,b;for(a=1,b=1;a<=100;a++){if(b>=20) break;if(b%3==1){b=b+3;continue;}b=b-5;}printf("%d\n",a); } 运行结果:______ 6.求两个正整数的最大公因子。 提示:采用Euclid(欧几里德)算法来求最大公因子,其算法如下。(1)输入两个正整数m和n。(2)用m除以n,余数为r,如果r等于0,则n是最大公因子,算法结束,否则(3)。(3)把n赋给m,把r赋给n,转(2)。 参考代码如下,请将程序填写完整。 #include void main ( ) {int m, n, r;printf ("Please input two positive integer: ");scanf ("%d%d", &m, &n);r=m%n; while (______){m =______;n = r;r =______; //求余数 }printf ("Their greatest common divisor is %d\n", n); } 7.编写程序,求s=1+2+4+8+…+64的值,写出源程序,上机编辑、调试、运行程序。 8.编写程序,求m=1!+2!+3!+…+10!的值。写出源程序,上机编辑、调试、运行程序。 9.编写程序,输入一行字母,分别统计其中的英文宇母、空格、数字和其他字符的个数。写出源程序,上机编辑、调试、运行程序。【提高实验】 1.编写程序,以下面的格式输出九九乘法表。 2.编写程序,求出200~600的所有素数。写出源程序,上机编辑、调试、运行程序。 3.编程实现在屏幕上打印如下图形。 5.4 实验小结 写出实验报告,实验报告要求如下。(1)问题分析:写出解决问题的算法思路,画出程序流程图。(2)源程序:根据算法思想或程序流程图编写源程序。(3)调试记录:记录源程序在上机调试时出现的各种问题及其解决办法。(4)总结:总结本次实验的经验与教训。实验6 函数 6.1 实验目的 1.掌握函数的定义方法、函数的类型和返回值。 2.掌握库函数及自定义函数的正确调用。 3.掌握函数形参与实参的参数传递关系。 6.2 实验指导 [范例1] 跟踪调试以下程序,注意函数调用过程中形参和实参的关系。 /*e601.c*/ #include main( ) {int t,x=2,y=5;void swap(int ,int);printf("(1) in main:x=%d,y=%d\n",x,y);swap(x,y);printf("(4) in main:x=%d,y=%d\n",x,y); } void swap(int a, int b) {int t;printf("(2) in swap:a=%d,b=%d\n",a,b);t=a; a=b; b=t;printf("(3) in swap:a=%d,b=%d\n",a,b); } [范例2] 一个判别素数的函数:在主函数输入一个整数,输出是否素数的信息。 本程序应当准备以下测试数据:17、34、2、1、0。分别输入数据,运行程序并检查结果是否正确。 /*e602.c*/ #include #include { int i,k,flag=1;k=______;i=2; while(i<=k) { if______{flag=0;break;}i++; } return flag; } void main() { int m;printf("Input one integer:"); scanf("%d",______);if(ftss(m)) printf("%d is a prime number.\n",m); elseprintf("%d is not a prime number.\n",m); } 6.3 实验内容【基础实验】 1.写出下列两个程序的运行结果,并分析结果的区别。 /*e603.c*/ main() { int i=2,p;p=f(i,++i);printf("%d",p); } int f(int a, int b) { int c;if(a>b) c=1;else if(a==b) c=0;else c=-1;return(c); } 运行结果:______ /*e604.c*/ main() { int i=2,p;p=f(i, i++);printf("%d",p); } int f(int a, int b) { int c;if(a>b) c=1;else if(a==b) c=0;else c=-1;return(c); } 运行结果:______ 2.下面程序运行的结果是______。 int x=1,y=2; sub(int y) { x++; y++; } main() { int x=2; sub(x); printf(″x+y=%d″,x+y); } 运行结果:______ 3.本程序在主函数中,调用了5个函数,其中fu1(),fu2()两个函数为用户自定义函数。阅读程序,完成如下工作。(1)上机编辑、调试程序,运行程序。(2)写出程序中函数调用方式。(3)写出程序的功能。 程序如下:# include }int fu1(int x, int y ) { int z1 ;z1=x*x+y*y;printf(" x*x+y*y=%d\n ",z1); } int fu2(int x, int y ) { int z2 ;z2=(x+y)* (x+y);printf(" (x+y)* (x+y) =%d\n ",z2); } 4.阅读程序,完成如下工作。(1)上机编辑、调试程序,运行程序。(2)写出程序中函数调用方式,实参对形参的数据传递。(3)写出程序的功能及运行结果。 程序如下: void main(){ void s(int n);int x=12;s( x );printf("n_s=%d\n",x); } void s( int n ) { int i;printf("n_x=%d\n",n);for(i=n-8; i>=1; i− −)n=n+i;printf("n_x=%d\n",n) } 5.求三个数中最大数和最小数的差值。请阅读下列程序,将程序填充完整。 #include void main(){ int a,b,c,d;scanf("%d%d%d",&a,&b,&c);d=________;printf("Max-Min=%d\n",d);} int dif(int x,int y,int z) { return______; } int max(int x,int y,int z){ int r;______;return(r>z?r:z);} int min(int x,int y,int z){ int r;r=x 6.求两个整数的最大公约数和最小公倍数。用一个函数求最大公约数,用另一函数根据求出的最大公约数求最小公倍数。请完成zdgy(int x,int y)函数的编写。 #include int zdgy(int x,int y) { } int zxgb(int x,int y) { return(x*y/zdgy(x,y)); } void main() { int a,b,gy,gb; printf("Input two integer numbers:(>0)"); scanf("%d,%d",&a,&b); gy=zdgy(a,b); gb=zxgb(a,b); printf("%d and %d of zdgy is %d,zxgb is %d\n",a,b,gy,gb); }【提高实验】 1.从键盘输入两个字符串,编写程序实现两个字符串的比较。不用strcmp()函数比较大小。 提示:(1)输入两个字符串,存放数组中。(2)用循环依次比较两字符串中对应字符。(3)定义函数compstr比较字符串。 将程序补充完整,参考代码如下。 main() { int i,flag; int compstr(char,char); char str1[80],str2[80]; ______//输入字符串,用gets()函数 i=0; do{ flag=compstr(______); i++; }while((str1[i]!='\0')&&(str1[i]!='\0')&&(flag==0)); if (flag==0)______; else if(flag>0)______; else printf("s1 } int compstr(char c1,char c2) { int t; ______ } 2.用函数的方法编写一个求级数前n项和的程序:S=1+(1+3)+(1+3+5)+…+[1+3+5+…+(2n−1)]。 3.用函数实现将一个整数n转换成字符串。例如,输入483,应输出字符串“483”,n的位数不确定,可以是任意的整数。 4.编写一个求任意整数的阶乘的函数,并利用阶乘函数实现求m!/n!/(m−n)!。 6.4 实验小结 写出实验报告,实验报告要求如下。(1)问题分析:写出解决问题的算法思路。(2)源程序:根据算法思想编写源程序。(3)调试记录:记录源程序在上机调试时出现的各种问题及其解决办法。(4)总结:总结本次实验的经验与教训。实验7 函数嵌套与递归 7.1 实验目的 1.理解函数的嵌套调用和递归调用的思想和原理。 2.能理解嵌套调用和递归调用的程序。 3.能编写嵌套调用的程序和简单递归调用的程序。 7.2 实验指导(1)函数的嵌套调用方法:函数的嵌套调用就是函数A调用函数B,函数B再调用函数C……最终再一层一层返回。(2)函数的递归调用方法:函数的递归调用就是特殊的嵌套调用,就是一个子函数直接或者间接的调用自己的过程。例如:(3)void a() {......a( ); . . } void a( ) {...... b( ); ...... } void b( ) {...... a( );. .. } [范例1] 编程实现求 实验步骤:(1)在Visual c++ 6.0环境下编写求阶乘函数long fac(int k),求组合函数long combination (int n,int m)和主函数main(),并保存源程序。(2)求阶乘函数long fac(int k)要求用递归调用的原理和方法来编写。(3)求组合函数long combination(int n ,int m)要求调用求阶乘函数long fac(int k)来实现,这里就用了嵌套的方法。(4)最后编写主函数main(),在main中调用combination函数,最终实现求。(5)对源程序进行调试、运行,验证结果。 程序处理中用到了函数的嵌套又用到了函数的递归,在main()函数中先定义了两个基本整型变量m、n,运行时从键盘输入m和n的值,就可以得到从m个不同个体取n个个体的组合个数,例如输入m为4,n为2,结果如图2-6所示。 [范例2] 用递归方法计算学生的年龄。已知第一位学生的年龄最小为10岁,其余学生一个比一个大2岁,求第5位学生的年龄。图2-6 参考代码如下。 #include int age(int n) {int c;if(n==1) c=10;else c=age(n-1)+2;return c; } main( ) {int n=5;printf("Age =%d\n",age(n)); } 7.3 实验内容【基础实验】 1.从键盘输入ABCDEFG?,分析下述程序的运行结果,然后上机验证。 /*sy7_1.c*/ #include void string( ) {char ch;ch=getchar( );if(ch!='?') string( );putchar(ch); } main( ) {string( ); } 运行结果:______kkkk 2.本程序的功能是计算s=1+2+3+…+n,设k=3,n=6即求33331+2+3+…+6的和。阅读程序,完成如下工作。(1)上机编辑、调试程序,运行程序,写出运行结果。(2)写出函数f2(int n,int k)和f1(int n,int k)的功能。(3)程序中6次调用f1()函数,写出n值的6次变化过程。 程序如下: long f2 ( int n, int k ) { int i;long sum=0;for( i=1; i<=n; i++ )sum += f1( i, k );return sum; } long f1( int n, int k ) { long power=1; int i;for( i=1; i<= k; i++ )power *= n;return power; } main() { int k=3, n=6;printf("Sum of %d powers of integers ",k);printf(" from 1 to %d = ", n);printf("%d\n",f2(n,k) ); } 3.编写递归函数sum计算1+2+3+…+n的值,并在主函数中输出调用sum(100)的结果。 4.已知Fibonacci数列为1,1,2,3,5,8,13…试用递归法编写求Fibonacci数的函数,在主函数中输入一个自然数,输出不小于该自然数的最小的一个Fibonacci数。 5.计算x的y次幂的递归函数getpower(int x,int y),并在主程序中实现输入/输出。【提高实验】 1.使用递归的方法计算下列多项式。多项式的递归定义如下: 2.用递归算法求m和n的最大公约数。递归公式如下: 7.4 实验小结 写出实验报告,实验报告要求如下。(1)问题分析:写出解决问题的算法思路;画出程序流程图。
试读结束[说明:试读内容隐藏了图片]