C语言程序设计实验电子稿 下载本文

1.3 实验一 熟悉C语言的VC++6.0编程环境

一、实验目的与要求

1. 学会使用Visual C++集成开发环境。

2.掌握简单C程序的编写、编辑、编译、连接和运行。 3.初步学会Visual C++环境下简单调试C程序的方法。 二、实验内容

1.程序运行题

(1)打开VC++6.0环境。

(2)在VC++6.0环境的编辑窗口中,输入如下程序保存为myexp1_1.cpp。 (3)选择 【组建】?【编译 myexp1_1.cpp】(可按快捷键CTRL+F7)命令对程序进行编译。

(4) 选择【组建】?【组建】(按快捷键F7)命令对程序进行连接。 (5) 单击【!】按钮或选择【组建】?【执行】菜单项(按快捷键F5),运行程序。 (6) 判断结果正确与否。 #include void main()

{ int a, b, sum; a=123; b=456; sum=a+b;

printf(“a+b= %d\\n”,sum); } 填写运行结果: 关闭上面的程序,按上面的步骤再次输入如下的程序,进行编译、连接和运行,写出运行结果。

#include void main() { int m=7,n=4;

float a=38.4,b=6.4,x; x=m/2+n*a/b+1/2; printf(“%f\\n”,x); }

填写运行结果:

思考: 把前面的语句x=m/2+n*a/b+1/2;改为x=m/2.0+n*a/b+1.0/2;

运行结果将会是什么?

2.程序改错题

程序改错1:

⑴ 输入如下错误的程序,然后进行编译和连接,仔细检查并修改错误,再进行编译连接,直到没有错误为止。

⑵ 运行程序, #include void mian( )

{ printf(“We are studying C language!\\n) }

程序改错2

输入并运行下面一个需要在运行时输入数据的程序,程序要求从键盘输入三个实数,输出它们的和。

#include mian( )

{ float a,b,c,sum;

printf(\scanf(\sum=a+b+c;

printf(\}

⑴ 输入该程序,然后进行编译和连接,如果出错,仔细检查并修改错误,再进行编译连接,直到没有错误为止。

⑵ 运行程序,按照输入输出示例提示输入a、b、c三个变量的值,变量值之间用空格分隔,输入完毕按回车键【Enter】。 ⑶ 查看运行结果,判断结果正确与否。

输入输出示例: Input a,b,c:3 5 6?

sum=14.0 再次运行程序并按如下的格式输入数据,观察结果是否正确?为什么? Input a,b,c: 3,5,6?

sum=? 思考: 改正程序的错误后,把printf语句中的%f改成%d,再运行程序,有什么结果?

Input a,b,c: 3.5,5.5,6.5?

结果:

3.程序完整题

完整题1

二整数整除程序模板如下:

#include void main( ) { int a,b, div; printf(\/*提示输入二个数*/ scanf(\ /*从键盘输入二个数存储在变量a,b中*/ /*除法运算,相除的结果放在变量div中*/ /*用%d输出结果*/ } 输入输出示例: Input a,b:3 5? div=0

Input a,b:5 3? div=1

思考: 把上述int a,b,div;改成float a,b,div;

scanf(\中的%d改成%f,同时把输出语句中的%d改成%f,运行程序后,再用前面的数据输入,结果会发生如何变化?为什么有这样的变化?

Input a,b:3,5? div=

Input a,b:5,3? div=

完整题2

仿照教材中例1-2程序,在横线地方填写语句,输入圆柱体的半径和高,计算并输出圆柱体的体积和表面积。 #include void main( ) { ; /* 定义变量*/

printf(\请输入圆的半径和高:\\n\ /*在屏幕上显示提示信息*/ scanf(\

/* 从键盘输入半径和高给变量r*/ /* 计算体积*/

/* 计算表面积*/

;

;

printf(\ ; /* 输出体积和表面积*/ }

输入与输出: 请输入圆的半径和高:?

试一试: 5.0 8.0? 输出结果?

如果把上述程序中所有的%f改成%d,再次运行程序,仍然输入“5.0 8.0”,输出结果会是什么?分析结果。 把上述程序中的第一个\\n去掉,再编译运行程序,有什么变化?试说出\\n的作用。

2.5 实验二 编写几个简单的C程序

一、实验目的与要求

1. 2. 3. 4. 5. 6.

掌握C语言基本数据类型的概念,理解数据类型与运算的关系。 掌握简单变量的定义,算术表达式和赋值表达式的使用。 掌握基本输出语句的使用。

进一步熟悉C程序的编辑、编译、连接和运行的过程。 掌握简单C程序查错方法,编写几个简单程序。 实验4学时

二、实验内容

1.程序验证或填空

(1) 编译和运行下面程序,查看执行的结果:

#include int main(void) {

int si=-1; float f=5; double df=3;

printf(\ return 0; }

若把输出语句中的格式控制中的格式说明符的顺序改变一下,会有什么结果? 再把%lf修改为%f,运行会有什么结果? (2)分析程序,并上机运行验证运行结果 #include “stdio.h” void main( )

{ printf(“\\t*\\n”);

printf(“\\t\\b* * *\\n”);

printf(“\\t\\b\\b * * * * *\\n”); }

(3) 运行程序,并分析结果。

#include “stdio.h” void main( )

{ int a=10,x=5,y=6; a+=a*=6; x=y++; y=++x ; a=x+++y ;

printf(“%d,%d,%d\\n”,a,x,y);

(4)不用第3个变量,实现将二个数进行对调,请填空。

#include “stdio.h” void main( ) { int a,b ;

scanf(“%d%d”,&a,&b);

printf(“a=%d b=%d\\n”,a,b); a= ; b= ;

a= ;

printf(“a=%d b=%d\\n”,a,b); }

2.程序改错

改正下面程序中的多处错误。计算某个数x的平方y,并分别以“y = x*x”和“x*x = y”的形式输出x和y的值。x的值由键盘输入。

输出示例(假设x的值为3): 9 = 3*3 3*3 = 9

源程序(有错误的程序)

#include int main(void) {

int y; y = x*x;

printf(\ /* 输出 printf(\} 3.一般编程题

编程题1

编写程序,输入二个整数,计算它们的和、差、积、商和余数,并按5+11=16这样的输出格式输出结果。 编程题2

编写程序,输入二个实数,计算它们的和、差、积、商,并按32.24=12.2+20.04这样的输出格式输出结果。实数分别定义为单精度实数或双精度实数。 编程题3

编写程序,从键盘输入一个大写字母,改用小写字母输出。 编程题4

求华氏温度150 ℉对应的摄氏温度。计算公式如下,其中:c表示摄氏温度,f表示华氏温度。

c?55?f??32 99要求输出结果为: fahr = 150,celsius = 66

思考:如果使用公式c?5?(f?32)计算华氏温度150 ℉所对应的摄氏温度,计算结果是

9否一样?为什么? 编程题5 编写程序,从键盘输入学生的三门课成绩,求其平均成绩(保留小数点后1位)。 4.较难编程题

编程题1

当n为三位十进制整数时,分别求出n的个位数字(digit1)、十位数字(digit2)和百位数字(digit3)的值。

输出示例: 这里增加了一个题目 n为整数152时,它的个位数字是2,十位数字是5,百位数字是1

提示:n的个位数字digit1的值是n,十位数字digit2的值是(n/10),百位数字digit3的值是n/100。 编程题2

将从键盘输入的实型十进制数分离为整数部分和小数部分后输出。如输入233.55,输出为:233.55=233+0.55。 编程题3

计算定期存款的本金与利息之和。设银行定期存款的年利率rate为2.25%,存款期为n年,存款本金为money元,具体的数字由键盘输入,编程计算n年后的本金与利息之和(提示,利用pow函数)。

3.5 实验三 选择结构程序设计

一、实验目的与要求

1. 理解C语言表示逻辑量的方法,学会正确使用逻辑运算符和逻辑表达式。 2. 掌握利用if结构实现选择结构的方法。 3. 掌握利用switch结构实现多分支选择结构。 4. 结合程序掌握一些简单的算法,学习调试程序 5. 实验4学时

二、实验内容

1.程序改错题

改正下面程序中的错误。输入实数x,计算并输出下列分段函数f(x)的值(保留1位小数)。

1x(x?100)

y?f(x)?

x(x?100)

输入输出示例1(改正后程序的运行结果)

Enter x:100 f(100.00)= 0.1

输入输出示例2(改正后程序的运行结果)

Enter x:23 f(23.00)= 23.0

源程序(有错误的程序)

#include #include void main(void) {

double x;

printf(\ x: \\n\ scanf(\ if(x = 100) { y = 1/sqrt(x) }

else (x != 100) { y = x; }

printf(\}

2.一般编程题

编程题1

输入任意三个整数a,b,c,求3个数中的最大值和最小值。 编程题2

输入x,计算并输出下面分段函数f(x)的值(保留2位小数)。请调用sqrt函数求平方根,调用pow函数求幂。

2 (x?1)?2x?1x(x?0)

f(x)?

x(x?0)

输入输出示例(共运行3次)

Enter x:10 f(10.00) = 3.16 Enter x:-0.5 f(-0.50) = -2.75 Enter x:0

f(0.00) = 0.00

成本 编程题3

有一函数:

x (-5

y= x-1 (x=0) x+1 (0

编写程序,要求用scanf函数输入x的值,输出y的值。 具体要求如下:

(1)用if语句实现分支,自变量和函数值均用实数类型。 (2)自变量用scanf函数输入,给一些输入提示。

(3)运行程序,输入x的值(分别为-5

某服装店经营成套服装的买卖,同时也允许单件销售。若一次购买不少于70套,则每套90元;若不足70套,则每套110元;只买上衣每件70元;只买裤子每条60元。请编写程序假设用户买入x件上衣和y条裤子,请编写程序计算相应的应付款是多少? 编程题5

编写程序实现:输入一个整数,判断它能否被3 、5 、7整除,同时输出如下信息。 (1) 能同时被3 、5 、7整除; (2) 能同时被其中的哪二个数整除; (3) 能被其中的哪一个数整除;

(4) 不能被3 、5 、7任一个数整除。

3.较难编程题

编程题1

请用switch语句编程计算员工每月的薪水。(exph3_1.cpp)

已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与提成的关系如下(计量单位:元): profit≤1000 没有提成; 1000<profit≤2000 提成10%; 2000<profit≤5000 提成15%; 5000<profit≤10000 提成20%; 10000<profit 提成25%。 分析:为使用switch语句,必须将利润profit与提成的关系,转换成某些整数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍(1000、2000、5000、……),如果将利润profit整除1000,则相邻两个区间的重叠。为解决相邻两个区间的重叠问题,最简单的方法就是:利润profit先减1(最小增量),然后再整除1000即可: profit≤1000 对应0 1000<profit≤2000 对应1 2000<profit≤5000 对应2、3、4 5000<profit≤10000 对应5、6、7、8、9

10000<profit

对应10、11、12、……

编程题2

编写程序实现如下功能:输入二个运算数(exp1,exp2)和一个运算符(op),计算表达式exp1 op exp2的值,其中OP可以为+、-、*、/、%五个符号中的任一种(提示:用switch语句实现)。

4.5 实验四 循环结构程序设计 一、实验目的与要求

1. 熟练掌握用while语句,do-while语句实现循环的方法。 2. 熟练掌握用for语句实现循环的方法。

3. 对循环语句的三种形式进行分析、比较,以掌握各种形式的共同之处与其特点。 4. 掌握循环结构的嵌套,掌握break语句和continue语句在循环体中的作用。 5. 实验4学时

二、实验内容

1. 程序验证题与改错题 (1)程序验证

从键盘输入一个整数,在屏幕上将其逆序数输入,例如输入8193,输出3918。 #include void main() {

int x,number;

printf(\请输入一个整数:\ scanf(\ do{

x=number; number=number/10; printf(\ }while(number!=0); printf(\}

如果输入的是一个负整数,程序应该如何改? (2)程序改错

计算表达式1+2!+3!+…10!的值,改正下面程序中的多处错误。 源程序(有错误的程序) #include void main(void) {

int sum1,sum2, i,j; for(i=1;i<10;i++) for(j=1,j<=i,i++) sum1*=j; sum1+=sum2; printf(\ } 3.一般编程题 编程题1

用三种循环结构(while语句、do-while语句、for语句),求1000以内奇数的和。 编程题2

输入一个正整数n,计算 1?11??? 的前n项之和,输出时保留6位小数。 35输入输出示例1: Enter n:5 sum = 1.787302

输入输出示例2: Enter n:23 sum = 2.549541 编程题3

编写程序求a+aa+aaa+……+aa……a,a是一个数字,有n个a,实际的n和a值由键盘输入,输出格式如下示例(此时a是3,n是5)。 3+33+333+3333+33333=37035

提示:将a乘上10倍并加上a,变成aa,再将aa乘上10倍并加上a,变成aaa,依次类推,在变化的同时将a,aa,aaa进行累加。 编程题4

统计从键盘输入的一行字符中的英文字母的个数。

4.较难编程题

编程题1

输出1-999之间的所有同构数。(同构数:一个数出现在它的平方数的右端,这个数就称为同构数,如5出现在25的右端,5是同构数,25出现在625右端,25也是同构数。 编程题2

如下程序利用c语言的数学函数库,求解sinx的近似值, 根据高等数学的公式,sinx =x-x3/3!+x5/5!-...(-1)k-1*x2k-1/(2k-1)!+... ,直到最后一项的绝对值小于1e-7为止。请阅读此程序,并根据cosx =1-x2/2!+x4/4!-...(-1)k*x2k/(2k)!+..., 实现计算cosx的程序代码。(exph4_1.cpp)

5.4 实验五 函数与预处理 一、实验目的与要求

1. 掌握C语言函数的定义方法、函数的声明及函数的调用方法。 2. 理解函数实参与形参的对应关系以及“值传递”的方式。

3. 掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。 4. 掌握动态存储分配的方法。

5. 掌握宏定义和文件包含处理方法。 6. 实验4学时

二、实验内容

1.程序验证与改错题

(1) 程序验证题

① 下面程序执行的结果是什么 void swap(int x, int y) {

int temp; temp=x; x=y; y=temp;

}

void main() {

int a,b;

scanf(“%d%d”, &a,&b); if(a>b) swap(a, b);

printf(“%d\\t %d”, a,b); }

思考:为什么a,b的值没有交换?

② 调用函数fun计算:m=1+2+3+4+…+9+10,并输出结果。请验证下面的程序是否符合题目要求。

#include”stdio.h” int fun(int n) {

int m, i;

for (i=1; i<=n; i++) {

m+=i; }

return m; }

void main() {

printf(\}

在上面程序的基础上,修改程序. 计算m=1-2+3-4+?+9-10。 (2)程序改错题

下列程序的功能是利用自定义函数计算一无符号的整数各位数字的乘积。

#include

unsigned f(unsigned num) {

unsigned k=0; do {

k*=num/10; num/=10; }while(k); return k; }

void main() {

int x;

printf(“input x=:\\n”); scanf(“%d”, x); printf(“%d”, f(x)); }

2.一般编程题

编程题1 编写一函数,把输入的4个数字字符转换成一个int数据存放,如输入4123这字符转换为4123这个整数,并通过主函数验证结果。

编程题2 编写程序求:1*1*1+2*2*2+3*3*3+4*4*4+5*5*5

提示:主函数用来现实结果,f1( )函数用来求一个数的立方,f2( )函数用来求和。

#include int f1(int n) { …… }

int f2(int m) { …… }

void main() {

…… }

编程题3 定义两个带参数的宏,将两个参数的值相加和相减,并写出程序,输入两个数作为使用宏时的实参。输出相加和相减后的和与差。 编程题4

编程输出2到10000之间的所有完数。所谓完数是指因子之和与它本身相等的数。如6=1+2+3,6是一个完数。

要求:定义函数 factor(m) 判断m是否为完数;由主函数调用它,来对所有2到10000之间的所有数进行判断。 #include #include int factor(int m) {

int i,s=0; …… }

void main() {

int i,m,sum; …… }

3.较难编程题

编程题1 用函数调用实现求两个数的最大公因子和最小公倍数 编程题2 用递归方法求1+2+3+...+n并将其中素数去除后之和。 #include #include

int isprime (int number) { …… }

long fact(int n)

{

…… }

void main() {

int m,sum; …… }

6.4 实验六 数组 一、 实验目的与要求

1. 掌握一维数组的定义、赋值和输入输出的方法。 2. 理解一维数组的存储方法及下标的表示方法。 3. 掌握与数组有关的算法(特别是排序算法)。

4. 掌握二维数组的定义、赋值和输入输出的方法。 5. 理解二维数组的存储方法及下标的表示方法。 6. 实验4学时。

二、实验内容 1.程序验证题与改错题

这里有改动 (1)程序验证题

① 给定一个整型数组a,要求求出其中小于0的元素的个数。请验证下面的程序是否符合题目要求。 #define N 10 void main() {

int a[N]={11,2,4,-1,5,-3,-66,0,10,-5};

int i; /*变量i用于for循环*/

int count=0; /*变量count用于技术,初始化为0*/ for (i=0;i

if(a[i]<0)

count++; /*如果元素a[i]<0,count计数+1*/ printf(\ }

② 给定一个整型二维数组a(3,3),要求求出对角线元素的和。请验证下面的程序是否符合题目要求。

#include #define N 3 void main() {

int a[N][N]={{1,2,3},{4,5,6},{7,8,9}};

int i,j; /*变量i,j用于for循环*/

int sum=0; /*变量sum用于求和,初始化为0*/ for (i=0;i

for(j=0;j

if (i==j)sum+=a[i][j]; /*如果是对角线元素,sum+a[i][j]*/

printf(\ return 0;

}

注1:在程序验证题①的基础上,修改程序,求出数组a中大于a[0]的元素之和。 注2:对上述程序②进行优化,消除内循环,实现同样的效果。在② 的基础上,修改程序,求出数组a中反对角线元素之和。提示:内循环用逆序;i+j==N-1。 (2)程序改错题

2.一般编程题

编程题1:从键盘输入10个整型数据,放入数组a 中,求其最大值、最小值及其所在元素的下标位置,并输出。

程序提示:定义10个元素的数组,用for循环语句逐一输入数据;定义最大值变量和最小值变量,用for循环语句遍历所有数组元素,逐一比较查找最大值和最小值。 编程题2:给定一个字符数组a,要求将数组的内容倒置。如:

执行前数组的内容为{'1','2','3','4','5','6','7','8'} 执行后数组的内容为{'8','7','6','5','4','3','2','1'}

提示:用i表示数组的第一个元素的下标;用j表示数组最后一个元素的下标。 交换a[i]和a[j],当i<=j时交换完毕。 交换一个元素后,i+1,j-1。 编程题3:

给定一个二维数组a,要求将数组的内容逆置。如: 执行前数组的内容为{{1,2,3},{4,5,6},{7,8,9}}, 执行后数组的内容为{{1,4,7},{2,5,8},{3,6,9}}

提示:用i表示数组的行下标;用j表示数组的列下标。以对角线元素为界,交换a[i][j]和a[j][i]。 编程题4:

一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。 Math C 5

张 80 7王 61 65 李 59 63 赵 85 87 周 76 77

English 92 71 70 90 85 提示:可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。

3.较难编程题

编程题1:给定一个整型数组a,要求将数组a中的元素进行从小到大的排序(用冒泡法排序)

【算法描述】

从第一个数开始依次对相邻两数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍的(N-1)次比较后,最大的数已放在最后;第二遍只需考虑(N-1)个数,即不用考虑最后一个数;以此类推每次少考虑一个数,直到第(N-1)遍比较后就可以完成排序。

编程题2:有15个整数(已排序)存放在一个数组中,输入一个数,要求用折半查找法找出该数在数组中的下标值,如果该数不在数组中,则输出“无此数”。这15个数用赋初值的方法在程序中给出。要找的数用scanf函数输入。

提示:折半查找法:在一个已从小到大排序的数组a中,用b(begin)表示数组首元素的下标,用e(end)表示数组末元素的下标,需查找的数x首先和处于数组最中间的下标为m=(b+e)/2的元素比较,若x和该数组元素相等,则找到位置,返回m;否则,若x大,则x可能落在下半区中,令b=m+1,若x小,则x可能落在上半区中,令e=m-1。重新计算m,再比较x和a[m];重复上述操作直到找到相等元素或b>e。若找到相等元素,则返回元素下标,否则返回-1表示无此数。

7.4 实验七 字符与字符串处理 一、实验目的与要求

1. 2. 3. 4. 5. 6.

掌握C语言字符型数据的概念,理解字符型与整型数据之间的关系。 掌握字符的输入与输出。

掌握转义字符常量、字符串常量的使用。 掌握字符、字符串与字符数组的输入与输出。 掌握字符串函数的使用\\字符串数组的使用。 实验课时2学时

二、实验内容 1.程序改错题

① 调试下列程序,使之具有如下功能:任意输入两个字符串(如:\和\,

并存放在a,b两个数组中。然后把较短的字符串放在a数组,较长的字符串放在b数组。并输出。程序中的strlen是库函数,功能是求字符串的长度,它的原型保存在头文件\中。调试时注意库函数的调用方法,不同的字符串输入方法,通过错误提示发现程序中的错误。 #include #include void main() {

char a[10],b[10],ch; int c,d,k; scanf(\

scanf(\ /* error */ printf(\c=strlen(a);d=strlen(b); if(c>d) {

for(k=0;k

ch=a[k];a[k]=b[k];b[k]=ch; }

a[k]='\\0'; /* error */ }

printf(\printf(\ }

② 下列给定程序中,函数fun的功能是:依次取出字符串中所有数字字符,形成新

的字符串,并取代原字符串。请改正函数fun中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! #include void fun(char *s) {

int i,j;

for(i=0;j=0;s[j]!='\\0';i++) /* error */ if(s[i]>='0' && s[i]<='9') s[j++]=s[i]; s[j]=”\\0”; /* error */ }

void main() {

char item[80];

printf(\ gets(item);

printf(\ fun(item);

printf(\}

2.一般编程题

编程题1

请编一个函数fun(char*s),该函数的功能是把字符串中的内容逆置。

例如:字符串中原有的字符串为abcdefg,则调用该函数后,串中的内容为gfedcba。

注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

#include #include #define N 81 void fun ( char s[]) {

/*请填写完整*/ }

void main() { char a[N];

printf ( \ a string : \ gets ( a );

printf ( \ puts( a );

fun( a ); printf(\

printf ( \ puts (a); }

编程题2

请编写输入以下图案(1)、(2)的程序,图案的行数由输入的值确定。

(1) (2)

3.较难编程题

编程题1

编写程序:程序功能是从键盘接收一个字符串,然后按照字符顺序从小到大进行排序,

例如,若输入edcba,则应输出abcde。

#include #include void main() { int i,j;

char string[100], c;

printf(\ gets(string); /*请填写完整*/

printf(\} 编程题2

编写程序:程序功能是统计子串substr在母串str中出现的次数。要求编写并调用函数fun的功能是:从str所指字符串中,找出substr所指子串的个数作为函数值返回。例如,当str所指字符串中的内容为abcdabfab,substr所指字符串的内容为ab,则函数返回整数3。

#include

count(char str[],char substr[]) {

/*请填写完整*/ }

void main()

{char str[80],substr[80]; int n; gets(str); gets(substr);

printf(\ }

8.4 实验八 指针

一、 实验目的与要求

1. 理解和掌握指针的概念,定义和使用指针变量。 2. 掌握函数之间指针的传递关系。

3. 掌握通过指针操作数组中元素的方法。 4. 实验2学时

二、实验内容

1.程序调试

(1)调试本程序,了解运算符*与&的用法,并注意容易出错的地方。 #include void main() { float x;

float *xptr; //① xptr=&x; //②,此处是否可以用*xptr=&x;? x=7.9;

printf(“The address of x is %x\\n”,&x); printf(“The value of xptr is %x\\n”,xptr); printf(“The value of x is %f\\n”,x);

printf(“The value of *xptr is %f\\n”,*xptr); //③ }

程序运行结果如下:

在上面的程序中,注意区别*ptr的不同意义。语句①中的*表示此处的xptr是作为一个指针变量来定义的,而语句③中的*则表示取变量xptr所指向的值,在本题中就是变量x的值,这时的*可以作为运算符来看待。这也可以理解为什么语句②中用了xptr=&x而不是*xptr=&x,因为在运算过程中*xptr所表示的就是x,如果将x的地址赋给x,肯定会产生错误。明白了*与&的用法后,可以接着看下面一个例子,分析其出错的原因。

(2) 调试程序。下面程序中有错误,请调试修改

输入3个整数,按从小到大的顺序输出。 #include “stdio.h” void main( ) { int a,b,c ;

int *p1,*p2,*p3 ; //定义3个指针变量 void swap(int *p1,int *p2) ; scanf(“%d,%d,%d”,&a,&b,&c) ;

p1=&a ; p2=&b ; p3=&c ; //3个指针分别指向3个整型变量

//用swap函数交换2个数,使较小数放到变量a中,较大数放到变量b中 if(a>b) swap(p1,p2) ; // ① if(a>c) swap(p1,p3); if(b>c) swap(p2,p3);

printf(“%d,%d,%d”,a,b,c); //按从小到大的顺序输出3个数

}

void swap(int *p1,int *p2) //swap函数试图实现2个数的交换 { int *x;

x=p1; // ② p1=p2; //③ p2=x; //④ }

本题编译连接都没有问题,但是不能运行出正确结果。原因在哪里呢?对语句①的调用进行分析,请大家仔细观察swap函数的实现部分。语句①表明a>b成立,因此需要将变量a和b中的数值进行调换,使其满足从小到大的排列顺序。swap函数中定义了一个指针变量x,语句②~④是以指针变量x作为中间变量,将形参指针p1和p2所指的方向进行了调换,即,使形参指针p2指向了较小值,而p1指向了较大值,但是这种交换对变量a和b并没有产生任何影响,当swap函数调用完毕后,变量a和b依然维持原有情况,无法使它们中的数值按从小到大的顺序重新排列,因此无法得到正确的运行效果。

对swap函数如何改造才能得到正确结果呢?请大家结合本题进行改错。

2. 程序完整题

运用指针对传递进来的两个整型量计算它们的和与积之后,通过参数返回,并予以输出。划横线的位置是本程序缺失的部分,请填写正确内容并运行此程序。

#include

void compute(int m, int n, int *sum, int *p) { }

void main() { }

int x,y,sum,product;

scanf(\ //输入两个整型量

compute(x,y,&sum,&product); //将两数和存入变量sum,积存入变量product printf(\

3.一般编程题

1. 用指针法统计10个数中正数、负数和零的个数,并分别求正数的总和,负数的总和。

2. 通过指向整型数组的指针将数组a[m][n]的内容按m行n列的格式输出,如一个2×3的

数组将显示为如下所示的2行3列的形式:

4.较难编程题

1. 输入一行字符,开始用一个指针指向这行字符的开头,并依次向后移,分别统计出其中

英文字母、空格、数字和其它字符的个数。

2. 输入一个正整数表示一个星期中的某一天,若此数字在[1,7]内,则 输出对应英文星期

名,否则表示输入错误,例如,输入2,程序输出“Tuesday”,输入“16”,程序输出“Illegal day” 要求用指针数组处理。

9.4 实验九 结构体与链表

一、 实验目的与要求

1. 2. 3. 4.

掌握结构体类型变量的定义和使用。 掌握结构体类型数组的定义和使用。 掌握利用结构和指针处理单向链表的方法 实验4学时。

二、实验内容

1. 程序完整题

定义一个结构体变量(包括年、月、日),计算该日在本年中是第几天,注意闰年问题。以下的程序没有考虑闰年问题,请调试以下程序,并将闰年的判断加在程序中使其完整。

#include struct { int year; int month; int day; } date;

void main( ) { int i,days; int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; printf(“Input year, month, day:”); scanf(“%d,%d,%d”, &date.year, &date.month, &date.day); days=0; for(i =1; i

//此处遗漏判断闰年的语句,请补充

printf(“%d/%d is the %dth day in %d.”, date.month, date.day, days, date.year); }

2. 程序改写题

改写上面的程序,用一个函数days来实现上面第1题的计算,由主函数将年、月、日传递给days函数,计算后将日数传回主函数输出。

#include struct

{ int year; int month; int day; } date; main() {

}

daysum(int year, int month, int day) { }

3. 一般编程题

(1) 宁波大学阳明学院分流,信息科学与工程学院有4个专业,分别是通信工程、电子信息

科学与工程、自动化、光电信息工程,编写程序统计每个专业的报名人数,描述候选专业的信息用专业名和报名数表示。

(2) 从键盘输入n个学生的3门课程(语文、数学和英语)考试成绩,计算每个学生的平均

成绩,并按平均成绩从高到低排序输出每个学生的信息。要求使用结构体数据类型

(3) 利用下面的节点结构:

struct Node {char data; struct Node *link; }

实现:从键盘输入一行字符,然后按输入顺序建立链表,最后输出整个链表。其中建立链表和输出链表的过程分别用不同的函数实现。

(4) 假设有a、b两个链表,每个链表中的节点包括学号、一门课程的成绩。要求把两个链

表合并,按学号升序排列。(两个链表中不存在重复的学号)

4. 较难编程题

(1) 用结构体数组修改教材上的例9-2,输入n个职工的姓名,工资,奖金和扣款,对每个

职工在原来工资的基础上增加5%,计算职工的实发工资并输出每个职工的工资条。

(2) 编写一个程序实现对学生数据的操作,每个学生结点包括学号和三门课程的成绩以及平

均分,要求:①输入若干学生的学号和成绩建立链表; ②能对链表进行输出; ③能根据学号删除指定的学生结点;④能插入给定的学生结点。围绕以上4个功能建立一个简单的菜单,使用户能方便地选择不同功能进行操作。

第10章 文件

10.1 知识要点

1. 文件的功能

文件的引入,使得c处理大量数据时非常方便,可以从存储介质上直接导入导出,而不必从键盘上一个一个数据输入。

使用文件时,首先要定义一个文件指针 FILE *fp;

C语言把文件看成是一个字符(字节)的序列,即由一个一个字符的数据顺序组成。根据数据的组织形式,可分成ASCII文件和二进制文件。区别如下所示。

十进制整数10000

内存中存放形式: 00100111 00010000 二进制文件中的存放形式: 00100111 00010000

ASCII码文件中的存放形式:00110001 00110000 00110000 00110000 00110000 ASCII优点:容易移植,缺点:占用存储空间大,耗时;

二进制优点:占用存储空间少,存储时间快;缺点:不易移植。 2. 文件的打开、关闭 文件打开:

if ((fp=fopen(“file1.c”, ” r ”))= =NULL)

{printf(“cannot open this file\\n”); exit(0);} 文件关闭:fclose(fp);

3. 文件读写及定位操作

常用的读写函数:fputc,fgetc,fputs,fgets,fscanf,fprintf,fread,fwrite 定位函数:rewind,fseek,ftell

10.2 常见错误和难点分析

文件打开和关闭时,一定要指明打开或关闭的方式,如“r”, “w”, “a”分别表示只读形式,写入形式,附加形式。 1. 文件指针的定义

对文件进行操作,首先,必须要建立文件指针。文件类型指针的定义方式: FILE *文件指针变量名; 注意:编程的时候,所有的标点符号必须在英文输入状态下输入! 2. 打开与关闭文件,

文件要使用时,必需先对文件打开,使用后,在程序结束之前,必须要关闭文件,也就是说fopen和fclose是成对出现!

3. 掌握输入输出函数fscanf,fprintf,fread,fwrite等中每个参数的意义,以及相对位置。

参数书写位置一定不能搞错,如fscanf(fp,“%d,%f”,&i,&t); 绝对不可以写成fscanf( “%d,%f”,&i,&t ,fp);

10.3 测试与练习题

1. 程序阅读题

有如下程序 #include void main() { FILE *fp;

int i=20,j=30,k,n; fp=fopen(\

fprintf(fp,\fclose(fp);

fp=fopen(\fscanf(fp,\printf(\ %d\\n\fclose(fp); }

程序运行后的输出结果是 。

A) 20 30 B) 10 30

C) 10 20

2.程序填空题

阅读下面题目,请补充完整。 #include \#include \void main() {

FILE *fp; char ch;

if((fp=fopen(\{

printf(\ exit(0);} ch=getchar(); while(ch!='#') { fputc( 【1】); ch=getchar();

}

D) 20 10

【2】 ;

}

【1】 A. fp,ch B. ch,file_s C. ch,fp D. file_s,ch 【2】 A. exit(0) B. fclose(fp) C. exit(fp) D. fclose(0)

3. 编程题

(1) 函数 ff(str,ch)的功能是统计并返回字符ch在字符串str中出现的次数。例如:调用ff(\后返回2,因为在字符串\中字符'e'出现了2次。

从键盘输入一个字符ch,输出该字符在文本文件 input.txt 的每一行中出现的次数。 ( 必须调用函数 ff(str,ch) )。例如:如果文件input.txt中存放了下列数据:

every 121

I am a student.

运行程序,并输入'e'后,输出 2 0 1

(2)编写程序,从键盘输入3个学生的数据(学号,姓名,年龄,通信地址),将它们存入文件student;然后再从文件中读出数据,显示在屏幕上。

#include #include #define SIZE 3 struct student /* 定义结构 */ { long num; char name[10]; int age;

char address[10]; } stu[SIZE], out; /*请填写完整*/

10.4 实验十 文件操作

一、实验目的与要求

1.掌握文件、文件指针的概念。

2.学会使用文件打开、关闭、读、写等文件操作函数。 3.实验2学时。

二、实验内容

1.程序完整题

填空横线处并调试程序:从键盘输入一行字符(以#字符结束),写到文件file1.txt中。注意文件打开方式的定义。

#include \#include \main() {FILE *fpout; char ch;

if( ==NULL) {printf(\ exit(0);}

while(( )!='#') {fputc(ch,fpout); }

}

2.程序调试题

设文件NUMBER.DAT中放了一组整数。请修改以下程序并调试程序:统计并输出文件中正整数,零和负整数的个数。假设NUMBER.DAT文件内容为“1 2 3 0 -2 0”,输出结果应为positive:3,negtive:1,zero:2。

#include\FILE *fp; main() { int p=0,n=0,z=0,temp;

fp=fopen(?number.dat?,?r?); /* error */ if(fp==NULL)

printf(\else

{ while(feof(fp)) /* error */

{ fscanf(fp,\ /* error */

if(temp>0) p++;

else if (temp<0) n++; else z++; } fclose(fp);

printf(\}

}

3.一般编程题

(1)以下程序的功能是将文件file1.c的内容输出到屏幕上并复制到文件file2.c中。请将横线处添入适当的内容。

#include void main() {

FILE *fp1,*fp2;

fp1=fopen(\ /* 打开file2.c */

while (!feof(fp1)) putchar(fgetc(fp1)); /* 把文件file1.c的内容输出到屏幕 */ rewind(fp1); /* 把文件内部的位置指针移动文件首 */ /* 把文件file1.c的内容写入文件file2.c */ fclose(fp1); fclose(fp2); }

(2) 请编写程序:从键盘输入一行字符串,将其中的小写字母全部转换成大写字母,然后输出到磁盘文件“upper.txt”中保存。

4.较难编程题

(1)请编写函数 sum_fact(number),返回number 的因子之和(能整除number的数就是它的因子,number定义为int)。例如sum_fact(6) = 12 (因为1, 2, 3, 6是6的因子)。

文本文件 input.txt 中存放了一批整数,将其中每个数的因子之和顺序写入文件 output.txt。 (必须调用函数 sum_fact(number)),例:若文件 input.txt 中存放了1, 2, 6 ,则每个数的因子之和分别是 1 3 12 ,它们被写入文件output.txt。

# include # include \

int sum_fact(int number) {

/*请填写完整*/ }

void main() {

FILE *fpin, *fpout; int x;

if (( fpin = fopen(\ printf( \ exit(0); } /*请填写完整*/ }