资源描述
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 <stdio.h>
void main()
{ int a, b, sum;
a=123;
b=456;
sum=a+b;
printf(“a+b= %d\n”,sum);
}
填写运行结果:
关闭上面的程序,按上面的步骤再次输入如下的程序,进行编译、连接和运行,写出运行结果。
#include <stdio.h>
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 <stdio.h>
void mian( )
{ printf(“We are studying C language!\n)
}
程序改错2
输入并运行下面一个需要在运行时输入数据的程序,程序要求从键盘输入三个实数,输出它们的和。
#include <stdio.h>
mian( )
{ float a,b,c,sum;
printf(" Input a,b,c: ")
scanf("%f %f %f",&a,&b, c);
sum=a+b+c;
printf("\n sum=%f\n",sum);
}
⑴ 输入该程序,然后进行编译和连接,如果出错,仔细检查并修改错误,再进行编译连接,直到没有错误为止。
⑵ 运行程序,按照输入输出示例提示输入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 <stdio.h>
void main( )
{ int a,b, div;
printf(" Input a,b: "); /*提示输入二个数*/
scanf("%d%d",&a,&b); /*从键盘输入二个数存储在变量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%d",&a,&b);中的%d改成%f,同时把输出语句中的%d改成%f,运行程序后,再用前面的数据输入,结果会发生如何变化?为什么有这样的变化?
Input a,b:3,5'
div=
Input a,b:5,3'
div=
完整题2
仿照教材中例1-2程序,在横线地方填写语句,输入圆柱体的半径和高,计算并输出圆柱体的体积和表面积。
#include <stdio.h>
void main( )
{ ; /* 定义变量*/
printf("请输入圆的半径和高:\n"); /*在屏幕上显示提示信息*/
scanf("%f%f", &r,&h); /* 从键盘输入半径和高给变量r*/
; /* 计算体积*/
; /* 计算表面积*/
printf("v=%f,s=%f\n", v,s) ; /* 输出体积和表面积*/
}
输入与输出:
请输入圆的半径和高:'
5.0 8.0'
输出结果?
试一试:
如果把上述程序中所有的%f改成%d,再次运行程序,仍然输入“5.0 8.0”,输出结果会是什么?分析结果。
把上述程序中的第一个\n去掉,再编译运行程序,有什么变化?试说出\n的作用。
2.5 实验二 编写几个简单的C程序
一、实验目的与要求
1. 掌握C语言基本数据类型的概念,理解数据类型与运算的关系。
2. 掌握简单变量的定义,算术表达式和赋值表达式的使用。
3. 掌握基本输出语句的使用。
4. 进一步熟悉C程序的编辑、编译、连接和运行的过程。
5. 掌握简单C程序查错方法,编写几个简单程序。
6. 实验4学时
二、实验内容
1.程序验证或填空
(1) 编译和运行下面程序,查看执行的结果:
#include<stdio.h>
int main(void)
{
int si=-1;
float f=5;
double df=3;
printf("si = %d, f = %f, f = %lf\n", si,f,df);
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<stdi0.h>
int main(void)
{
int y;
y = x*x;
printf("%d = %d * %d",x); /* 输出
printf("d * %d = %d", y);
}
3.一般编程题
编程题1
编写程序,输入二个整数,计算它们的和、差、积、商和余数,并按5+11=16这样的输出格式输出结果。
编程题2
编写程序,输入二个实数,计算它们的和、差、积、商,并按32.24=12.2+20.04这样的输出格式输出结果。实数分别定义为单精度实数或双精度实数。
编程题3
编写程序,从键盘输入一个大写字母,改用小写字母输出。
编程题4
求华氏温度150 ℉对应的摄氏温度。计算公式如下,其中:c表示摄氏温度,f表示华氏温度。
要求输出结果为: fahr = 150,celsius = 66
思考:如果使用公式计算华氏温度150 ℉所对应的摄氏温度,计算结果是否一样?为什么?
编程题5 编写程序,从键盘输入学生的三门课成绩,求其平均成绩(保留小数点后1位)。
4.较难编程题
编程题1
当n为三位十进制整数时,分别求出n的个位数字(digit1)、十位数字(digit2)和百位数字(digit3)的值。
这里增加了一个题目
输出示例:
n为整数152时,它的个位数字是2,十位数字是5,百位数字是1
提示:n的个位数字digit1的值是n%10,十位数字digit2的值是(n/10)%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位小数)。
输入输出示例1(改正后程序的运行结果)
Enter x:100
f(100.00)= 0.1
输入输出示例2(改正后程序的运行结果)
Enter x:23
f(23.00)= 23.0
源程序(有错误的程序)
#include<stdio.h>
#include<math.h>
void main(void)
{
double x;
printf("Enter x: \n");
scanf("=%f", x);
if(x = 100) {
y = 1/sqrt(x)
}
else (x != 100) {
y = x;
}
printf("f(%.2f) = %.1f\n",x,y);
}
2.一般编程题
编程题1
输入任意三个整数a,b,c,求3个数中的最大值和最小值。
编程题2
输入x,计算并输出下面分段函数f(x)的值(保留2位小数)。请调用sqrt函数求平方根,调用pow函数求幂。
输入输出示例(共运行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<x<0)
y= x-1 (x=0)
x+1 (0<x<10)
编写程序,要求用scanf函数输入x的值,输出y的值。
具体要求如下:
(1)用if语句实现分支,自变量和函数值均用实数类型。
(2)自变量用scanf函数输入,给一些输入提示。
(3)运行程序,输入x的值(分别为-5<x<0,x=0,0<x<10)三种情况,检查输出的y值是否正确。
编程题4
某服装店经营成套服装的买卖,同时也允许单件销售。若一次购买不少于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<stdio.h>
void main()
{
int x,number;
printf("请输入一个整数:");
scanf("%d",&x);
do{
x=number%10;
number=number/10;
printf("%d", x);
}while(number!=0);
printf("\n");
}
如果输入的是一个负整数,程序应该如何改?
(2)程序改错
计算表达式1+2!+3!+…10!的值,改正下面程序中的多处错误。
源程序(有错误的程序)
#include<stdi0.h>
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("%d ",sum1);
}
3.一般编程题
编程题1
用三种循环结构(while语句、do-while语句、for语句),求1000以内奇数的和。
编程题2
输入一个正整数n,计算 的前n项之和,输出时保留6位小数。
输入输出示例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=%d\n", fun(10));
}
在上面程序的基础上,修改程序. 计算m=1-2+3-4+…+9-10。
(2)程序改错题
下列程序的功能是利用自定义函数计算一无符号的整数各位数字的乘积。
#include<stdio.h>
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 <stdio.h>
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 <stdio.h>
#include <math.h>
int factor(int m)
{
int i,s=0;
……
}
void main()
{
int i,m,sum;
……
}
3.较难编程题
编程题1 用函数调用实现求两个数的最大公因子和最小公倍数
编程题2 用递归方法求1+2+3+...+n并将其中素数去除后之和。
#include <stdio.h>
#include <math.h>
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<N;i++)
if(a[i]<0)
count++; /*如果元素a[i]<0,count计数+1*/
printf("%d\n",count);
}
② 给定一个整型二维数组a(3,3),要求求出对角线元素的和。请验证下面的程序是否符合题目要求。
#include <stdio.h>
#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<N;i++)
for(j=0;j<N;j++)
if (i==j)sum+=a[i][j]; /*如果是对角线元素,sum+a[i][j]*/
printf("%d\n",sum);
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
80
61
59
85
76
C
75
65
63
87
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. 掌握C语言字符型数据的概念,理解字符型与整型数据之间的关系。
2. 掌握字符的输入与输出。
3. 掌握转义字符常量、字符串常量的使用。
4. 掌握字符、字符串与字符数组的输入与输出。
5. 掌握字符串函数的使用\字符串数组的使用。
6. 实验课时2学时
二、实验内容
1.程序改错题
① 调试下列程序,使之具有如下功能:任意输入两个字符串(如:"ningbo"和"china"),并存放在a,b两个数组中。然后把较短的字符串放在a数组,较长的字符串放在b数组。并输出。程序中的strlen是库函数,功能是求字符串的长度,它的原型保存在头文件"string.h"中。调试时注意库函数的调用方法,不同的字符串输入方法,通过错误提示发现程序中的错误。
#include <stdio.h>
#include<string.h>
void main()
{
char a[10],b[10],ch;
int c,d,k;
scanf("%s",&a);
scanf("%s",&b); /* error */
printf("a=%s,b=%s\n",a,b);
c=strlen(a);d=strlen(b);
if(c>d)
{
for(k=0;k<d;k++) /* error */
{
ch=a[k];a[k]=b[k];b[k]=ch;
}
a[k]='\0'; /* error */
}
printf("a=%s\n",a);
printf("b=%s\n",b);
}
② 下列给定程序中,函数fun的功能是:依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串。请改正函数fun中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
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("\nEnter a string :");
gets(item);
printf("\n\nThe string is : %s\n",item);
fun(item);
printf("\n\nThe string of changing is : %s\n",item);
展开阅读全文