《高级语言程序设计》
学生实验报告
专业:计算机科学与技术
学号:
姓名:
实验一 C程序的运行环境和使用方法
1. 实验目的
1) 了解所用的计算机系统的基本操作方法,学会独立使用该系统。
2) 了解在该系统上如何编辑、编译、连接和运行一个C程序。
3) 通过运行简单的C程序,初步了解C程序的特点。
2. 实验程序清单及运行结果
课后习题1.5
编写一个C程序,输出以下信息:
**************************
Very Good!
**************************
Source
#include
int main()
{
printf("**************************\n");
printf(" Very Good!\n");
printf("**************************\n");
}
课后习题1.6
编写一个程序,输入a、b、c三个值,输出其中最大值。
Source
#include
int main()
{
int max(int x,int y);
int a,b,c,d;
scanf("%d %d %d",&a,&b,&c);
d=max(a,b);
d=max(d,c);
printf("%d\n",d);
return 0;
}
int max(int x,int y)
{
int z;
if(x>y)
z=x;
else z=y;
return z;
}
实验二 顺序结构程序设计
1. 实验目的
1) 掌握C语言的数据类型,熟悉如何定义整型、字符型和实型的变量,以及对它们赋值的方法。
2) 掌握不同类型的数据之间赋值的规律。
3) 学会用C的有关算术运算符,以及包含这些运算符的表达式。
4) 掌握C语言中使用最多的一种语句——赋值语句的使用方法。
5) 掌握scanf()函数、printf()函数的调用方法,掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符。
6) 掌握字符输入输出函数getchar()、putchar()函数的调用方法。
2. 运行程序及填空
(一)输入并运行下面的程序,写出运行结果。
#include
int main( )
{
char c1 , c2;
c1=97; c2=98;
printf(“%c,%c\n”, c1, c2 );
printf(“%d,%d\n”, c1, c2 );
return 0;
}
运行结果:a,b
97,98
【思考题】若将第四行改为:int c1, c2; 再使之运行,输出结果一样吗?为什么?
答:一样,因为第六行的printf输出的是%c即字符,任然将c1,c2按照ASCII码字以符形式输出。
(二)程序填空:输入一个十进制整数,输出与之相应的八进制数与十六进制数。
例如:输入31,输出37(八进制)和1F(十六进制)。源程序如下:
#include
int main()
{
long n;
printf("输入一个十进制整数:");
scanf("%d",&n);
printf("对应的八进制整数是 %o\n", n);
printf("对应的十六进制整数是 %X\n", n);
return 0;
}
运行程序,输入1234567,显示结果如何?
答:输入一个十进制整数:1234567
对应的八进制整数是 4553207
对应的十六进制整数是 12D687
3. 实验程序清单及运行结果
课后习题3.7
要将"China"译成密码。
Source
#include
int main()
{
char c1='C',c2='h',c3='i',c4='n',c5='a';
printf("%c%c%c%c%c\n",c1+4,c2+4,c3+4,c4+4,c5+4);
}
课后习题4.8
求圆周长C1、圆面积Sa、圆球表面积Sb、圆球体积Va、圆柱体积Vb。
Source
#include
#define PI 3.14
#include
int main()
{
float r,h,C1,Sa,Sb,Va,Vb;
scanf("%f%f",&r,&h);
C1=2*PI*r;
Sa=PI*r*r;
Sb=4*PI*r*r;
Va=4.0/3*r*r*r*PI;
Vb=PI*r*r*h;
printf("C1=%.2f\nSa=%.2f\nSb=%.2f\nVa=%.2f%\nVb=%.2f\n",C1,Sa,Sb,Va,Vb);
}
课后习题4.9
输入一个华氏温度,要求输出摄氏温度。公式为c=5(F-32)/9。取位2小数。
Source
#include
int main()
{
float F,c;
scanf("%f",&F);
printf("c=%.2f\n",c=5*(F-32)/9;);
return 0;
}
实验三 选择结构程序设计
1. 实验目的
1)了解C语言表示逻辑量的方法(以0代表“假”,以非0代表“真”)。
2)学会正确使用关系运算符、逻辑运算符和相关表达式。
3)熟练掌握if语句和switch语句。
4)结合程序掌握一些简单的的算法。
5)学习调试程序。
2. 程序填空
请将下列源程序填写完整。程序说明:输入实数x, 计算并输出下列分段函数f(x)的值,结果保留2位小数。
#include
#include
int main ( )
{ double x,y;
printf("Input x:");
scanf(“%lf”,&x);
if (x<-1) y= x+1;
else if (x<1) y= exp(x) ;
elsey=sqrt(x*x+1);
printf("f(%.2f)=%.2f\n", x, y);
return 0;
}
运行程序,输入 -2,显示结果是:-1
输入 0.5,显示结果是:1.65
输入 3,显示结果是:3.16
3. 实验程序清单及运行结果
课后习题5.5
有一个函数
/ x (x<1)
y={ 2x-1 (1<=x<10)
\ 3x-11 (x>=10)
写一段程序,输入x,输出y
Source
#include
int main()
{
int x,y;
scanf("%d",&x);
if(x<10)
{if(x<1)y=x;
else y=2*x-1;}
else y=3*x-11;
printf("%d\n",y);
return 0;
}
课后习题5.6
给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。
Source
#include
int main()
{
int t;
scanf("%d",&t);
if(90<=t&&t<=100) printf("A\n");
else if(80<=t&&t<=89) printf("B\n");
else if(70<=t&&t<=79) printf("C\n");
else if(60<=t&&t<=69) printf("D\n");
else if(0<=t&&t<=59) printf("E\n");
}
课后习题5.7
给出一个不多于5位的非负整数,要求
1、求出它是几位数
2、分别输出每一位数字
3、按逆序输出各位数字,例如原数为321,应输出123
Source
#include
int main()
{
int n,g,s,b,q,w;
scanf("%d",&n);
g=n%10;
s=n/10%10;
b=n/100%10;
q=n/1000%10;
w=n/10000;
if((w==0)&&(q==0)&&(b==0)&&(s==0)) {printf("1\n%d\n%d",g,g);}
else if((w==0)&&(q==0)&&(b==0)) {printf("2\n%d %d\n%d%d",s,g,g,s);}
else if((w==0)&&(q==0)) {printf("3\n%d %d %d\n%d%d%d",b,s,g,g,s,b);}
else if(w==0) {printf("4\n%d %d %d %d\n%d%d%d%d",q,b,s,g,g,s,b,q);}
else printf("5\n%d %d %d %d %d\n%d%d%d%d%d",w,q,b,s,g,g,s,b,q,w);
}
课后习题5.8
企业发放的奖金根据利润提成。
Source
#include
int main()
{
int I,P;
scanf("%d",&I);
if(I<=100000)
P=I*10/100;
else if(I<=200000)
P=10000+(I-100000)*75/1000;
else if(I<=400000)
P=17500+(I-200000)*5/100;
else if(I<=600000)
P=27500+(I-400000)*3/100;
else if(I<=1000000)
P=33500+(I-600000)*15/1000;
else
P=39500+(I-1000000)*1/100;
printf("%d\n",P);
return 0;
}
实验四 循环结构程序设计
1. 实验目的
1) 熟悉掌握用while语句、do-while语句和for语句实现循环的方法。
2) 掌握循环次数不确定的解题技巧,掌握多项式求和问题的解题技巧。
3) 掌握多重循环的编程技巧。
4) 掌握在程序设计中用穷举法、迭代法、递推法求解问题的编程技巧。
5) 进一步学习调试程序。
2. 程序填空
输出菲波那契数列的前20项,要求每行输出10项。
#include
int main()
{ int i,x1,x2,x;
x1=x2=1;
printf("%6d%6d",x1,x2); /*输出前2项*/
for(i=3; i<=20; i++)
{ x=x1+x2; printf("%6d",x);
if(i%10==0) printf("\n"); /*每行输出10项*/
x1=x2; x2=x;
}
return 0;
}
3. 实验程序清单及运行结果
课后习题6.1
输入两个正整数m和n,求其最大公约数和最小公倍数。
Source
#include
int main()
{
int x,y,m,n,t;
scanf("%d %d",&x,&y);
m=x;
n=y;
t=m%n;
while(t!=0)
{
m=n;
n=t;
t=m%n;
}
printf("%d %d\n",n,x*y/n);
}
课后习题6.2
输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
Source
#include
int main()
{
char c;
int w=0,x=0,y=0,z=0;
while((c=getchar())!='\n')
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
w++;
else if(c==' ')
x++;
else if(c>='0'&&c<='9')
y++;
else
z++;
}
printf("%d %d %d %d\n",w,y,x,z);
}
课后习题6.3
Sn=2+22+222+2222+22222+22...2222(最后一项n个2)
Source
#include
int main()
{
int s,t,i,n,a;
a=2;
s=0;
t=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
t=t+a;
s=s+t;
a=a*10;
}
printf("%d\n",s);
}
课后习题6.10
猴子吃桃问题。求第一天共摘多少桃子。
Source
#include
int main()
{
int s=1,N,i;
scanf("%d",&N);
for(i=1;i { s=(s+1)*2; } printf("%d\n",s); } 实验五 数组 1) 掌握一维数组和二维数组的定义、赋值和输入输出的方法。 2) 掌握字符数组和字符串函数的使用。 3) 掌握与数组有关的算法(特别是排序算法)。 (一)程序填空:输入一个整数n (1≤n≤10),再输入n个整数,将它们按升序排列后输出。 选择排序基本思想: (1)由于n最大是10,需要定义一个长度为10的整型数组a; (2)整个排序只需要确定前n-1个元素(a[0] ~a[n-2]),最后一个元素a[n-1]无需另外处理; (3)在确定a[i](i=0,1,…,n-2)时,先将a[i]本身看成最小,即令k=i,并将a[k]与后面的元素a[j](j=i+1, i+2, …, n-1)一一比较,如果a[j]< a[k],则更新k的值:k =j。 找出对应于下标i的最小元素a[k]后,交换a[i]与a[k]。 #include int main() { int i, j, k,n, temp, a[10]; printf("Input n (1~10):"); while ( scanf("%d",&n),n<=1||n>=10); //输入正确的n:1≤n≤10 printf("Input %d numbers:\n", n ); for(i=0; i scanf("%d",&a[i]); //输入n个整型元素 //选择法排序 for(i=0; i<n-1; i++) { k=i; //设a[i]为剩余部分的最小元素 for(j=i+1; j<n; j++) if(a[j]) k=j; //Line 12 temp=a[i]; a[i]=a[k]; a[k]=temp; //a[i] 擗[k] } for(i=0; i printf("%d ",a[i]); //输出排序后的数组 printf("\n"); return 0; } 【思考题】运行程序,输入n:5,输入5个整数:23 -9 14 0 -3,显示结果是什么? 如果是按从大到小的降序排列,语句行Line 12 应怎么修改? 答;⑴显示结果Input n (1~10):5⑵Line 12 应改为if(a[j]>a[k]) k=j; Input 5 numbers: 23 -9 14 0 3 -9 0 3 14 23 (修改上面的程序,从在线评测系统中提交调试好的程序,题号1032。) (二)程序填空:输入5个整数, 将这5个数按逆时针顺序转动一次后再输出,如输入1 2 3 4 5,逆时针转动一次后,输出2 3 4 5 1。 提示:设存放整数的数组为a。要实现数组逆时针转动,只要先将首元素a[0]“搬”至一个变量t中;然后从第1个元素到最后1个元素,依次向前移一位,即a[i-1]= a[i]( i= 1, … , 4);最后将存放在t中的首元素放入最后的元素。 #include int main() { int i, t, a[5]; printf("Input 5 integers:\n"); for(i=0; i<5; i++) scanf("%d",&a[i]); t=a[0]; for(i=1; i<5; i++) a[i-1]=a[i]; a[4]= t; printf("After rotation:\n"); for(i=0;i<5;i++) printf("%5d",a[i]); printf("\n"); return 0; } 课后习题7.1 用筛法求之N内的素数。 Source #include #include int main() { int i,k,m,N; scanf("%d",&N); for(m=2;m<=N;m=m+1) { k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0) break; if(i>=k+1) printf("%d\n",m); } } 课后习题7.2 用选择法对10个整数从小到大排序。 Source #include int main() { int a[10]; int i,j,t; for(i=0;i<10;i++) scanf("%d",&a[i]); for(j=0;j<9;j++) for(i=0;i<9-j;i++) if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;} for(i=0;i<10;i++) printf("%d\n",a[i]);} 课后习题7.4 有一个已排好的9个元素的数组,输入一个数要求按原来排序的规律将它插入数组中。 Source #include int main() { int a[10]; int i,m,j; for(i=0;i<9;i++) { scanf("%d",&a[i]); } scanf("%d",&m); for(i=0;i<9;i++) if(a[i]>m) { for(j=9;j>=i;j--) a[j+1]=a[j]; a[i]=m; break; } else a[9]=m; for(i=0;i<10;i++) printf("%d \n",a[i]); } 课后习题7.5 输入10个数字,然后逆序输出。 Source #include int main() { int a[10],i; for(i=0;i<=9;i++) scanf("%d",&a[i]); for(i=9;i>=0;i--) printf("%d ",a[i]); return 0; } 实验六 函数 1) 掌握定义函数的方法。 2) 掌握函数实参与形参的对应关系以及“值传递”的方式。 3) 掌握函数的嵌套调用和递归调用的方法。 4) 掌握全局变量和局部变量、动态变量和静态变量的概念和使用方法。 5) 学习对多文件程序的编译和运行。 验证哥德巴赫猜想——任何一个大于6的偶数均可表示为两个素数之和。例如:6=3+3, 8=3+5,10=5+5,…,18=7+11。要求将6-100之间的偶数均表示为素数之和,一行输出5组。 #include #include Int prime(int n); int main() { int a,b,k ; for(k=6;k<=100;k=k+2) //逐个处理6~100之间的偶数k { for(a=2;a { b=k-a; if(prime(a)&&prime(b)) break; //如果a,b同为素数, 跳出内层循环 } //内层循环 printf("%d=%d+%d ",k,a,b); //输出k=a+b if(k%5==0) printf("\n"); //每行输出5组,注意第一行只有3组 } //外层循环 return 0; } //自定义函数prime(n),判断整数n是否是素数,是则返回1,不是则返回0 int prime(int n) { int i ; for( i=2;i<=n; i++) if ( n%i==0 )break; if (i==n) return 1; //n是素数,返回1 else return 0; // n不是素数,返回0 } 课后习题8.1 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数 Source #include int main() { int gcd(int x,int y); int lcm(int x,int y); int a,b; scanf("%d %d",&a,&b); printf("%d %d\n",gcd(a,b),lcm(a,b)); } int gcd(int x,int y) { int t; if(y>x) {t=x;x=y;y=t;} while(t) { t=x%y; x=y; y=t; } return x; } int lcm(int x,int y) { return x*y/gcd(x,y); } 课后习题8.3 写一个判断素数的函数,在主函数输入一个正整数,输出是否是素数的消息。 Source #include int main() { int a; int prime(int x); scanf("%d",&a); if(prime(a)) printf("prime"); else printf("not prime"); } int prime(int x) { int i=2; if(x==1) return 0; while(x%i){i++;} if(i==x) return 1; else return 0; } 课后习题8.5 写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。 Source #include #include char s[1000]; int main() { int len; void transpose(char a[],int n); gets(s); len=strlen(s); transpose(s,len); puts(s); } void transpose (char a[],int n) { int i,j=n/2; char t; for(i=0;i { t=a[i]; a[i]=a[n-1-i]; a[n-1-i]=t; } } 课后习题8.7 写一个函数,输入一个四位数,要求输出这四个数字字符,但要求每两个数字间空格。 Source #include int main() { int a,max(int x); scanf("%d",&a); max(a); } int max(int x) { if(x/10!=0) max(x/10); printf("%d ",x%10); } 实验七 指针 1) 通过实验进一步掌握指针的概念、会定义和使用指针变量。 2) 能正确使用数组的指针和指向数组的指针变量。 3) 能正确使用字符串的指针和指向字符串的指针变量。 4) 能正确使用指向函数的指针变量。 5) 了解指向指针的指针的概念及其使用方法。 (一)程序填空:输入三个整数,要求设计2个指针变量p1、p2 ,使p1指向这三个数的最大值,p2指向最小者 ,并输出最大值和最小值。 #include int main ( ) { int a,b,c, *p1, *p2, *p3; scanf(“%d%d%d”,&a,&b,&c); p1=a>=b?&a:&b; //p1指向a,b中较大者 if(*p1 p2=a>=b?&b:&a; //p2指向a,b中较小者 if(*p2>c) p2=&c; printf(“max=%d, min=%d\n”, *p1,*p2 ); return 0; } 运行结果: 输入 1 2 3 输出max=3, min=1 (二)程序填空:利用指针,将数组a中的10个整数按相反顺序存放。源程序如下: #include int main ( ) { int i,t, a[10],*p,*q; printf("Input 10 integers:"); for(i=0; i<10; i++) scanf("%d", &a[i] ); p=&a[0]; q=&a[9]; //p指向首元素,q指向最后一个元素 for( ;p!=a[5];p++,q--) //逐对交换对称元素 { t= *p; *p= *q; *q=t; } for(i=0; i<10; i++) printf("%d ", a[i] ); printf("\n"); return 0; } 以下程序都要求用指针处理。 课后习题10.1 输入三个整数,按由小到大的顺序输出。 Source #include int main() { void change(int *q1,int *q2,int *q3); int a,b,c,*p1,*p2,*p3; scanf("%d %d %d",&a,&b,&c); p1=&a;p2=&b;p3=&c; change(p1,p2,p3); printf("%d %d %d",a,b,c); } void change(int *q1,int *q2,int *q3) { void swap(int *pt1,int *pt2); if(*q1>*q2) swap(q1,q2); if(*q1>*q3) swap(q1,q3); if(*q2>*q3) swap(q2,q3); } void swap(int *pt1,int *pt2) { int t=*pt1; *pt1=*pt2; *pt2=t; } 课后习题10.2 输入三个字符串,按由小到大的顺序输出 Source #include #include void swap(char **p1,char **p2) { char *temp; temp=*p1; *p1=*p2; *p2=temp; } int main() { char str[20],str1[20],str2[20]; char *ipoint1,*ipoint2,*ipoint3; char **p1, **p2, **p3; gets(str) ; gets(str1); gets(str2); ipoint1=str; ipoint2=str1; ipoint3=str2; p1=&ipoint1; p2=&ipoint2; p3=&ipoint3; if(strcmp(*p1,*p2)>0) swap(p1,p2); if(strcmp(*p1,*p3)>0) swap(p1,p3); if(strcmp(*p2,*p3)>0) swap(p2,p3); printf("%s\n%s\n%s\n",*p1,*p2,*p3); } 课后习题10.5 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。 Source #include void check (int nub[],int n) { int *pt,i,j,k; for(k=0,i=1;n-k>1;) {for(pt=nub;pt<(nub+n);pt++,i++) {if(*pt==0) {i--;} else if(i%3==0) {*pt=0; k++; } } } } main() { int a[100],*p,n,i; scanf("%d",&n); for(p=a,i=1;p
*p=i++; p=a; check(p,n);1. 实验目的
2. 程序填空
3. 实验程序清单及运行结果
1. 实验目的
2. 程序填空
3. 实验程序清单及运行结果
1. 实验目的
2. 程序填空
3. 实验程序清单及运行结果