电1C语言实验报告

更新时间:2024-01-04 10:03:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验名称:实验1 VC++6.0运行环境认识与简单C程序

实验时间:第4周周三 实验地点:5423

【实验目的】了解VC++6.0的集成开发环境,掌握C程序的基本结构,学会如何在VC中编辑、编译、连接和运行C程序。 【实验内容】

1.读程序

要求:编辑下面源程序,并且读懂与分析运行程序,上机运行程序,并与分析结果相对 比。学会使用VC 运行程序的基本方法。 ⑴

main( ) /*C 程序必须有一个主函数*/ { /*大括弧里为函数体*/ printf(\

printf(\printf(\}Key: 运行结果: Hello,World!

Welcome to the C language world! Everyone has been waiting for it. 因为printf中字符串原样输出 ⑵ main() {

int a,b,sum; /*声明部分:定义变量,a,b 为乘数,sum 为和*/

a=123;b=456; /*a,b 赋初值。该条语句开始三条语句,构成函数的执行部分*/ sum=a+b; /*用赋值语句求和*/ printf(\产生输出*/ }Key: 运行结果:a+b=579

printf 中删除a+b= 输出结果:579

printf 中删除\\n 输出结果:a=b=579Press any key to continue

2.完成程序

要求:依据题目要求,分析已给出的语句,填写空白。但是不要增行或删行,改动程序 的结构。

⑴求(a+b)×c 的值。(设a=3,b=2,c=1) main() {int a,b,c; a=3; ; c=1;

printf(\}

Key: 应填 b=2

⑵从键盘输入一位整数,并显示输出该位整数。

《计算方法与程序设计实验》

main() {

printf(\ scanf(\

printf(\}

Key: 应填 int a; 因为变量必先定义,后使用 ⑶求圆的面积。 #define PI 3.14 main() {float r,area;

printf(\ scanf(\ area=PI*r*r;

printf(\}

Key: 应填 area 因为输出园面积 3.调试程序

要求:调试运行下列程序是否正确,若有错,写出错在何处?填写正确的运行结果。 #include main() {int x,y; x=5,y=8,

printf(\}

Key:运行结果: 5,20,8 4.写程序

⑴编写程序输出用 6 颗星构成的等边三角形。* ⑵编写程序求10、20 和35 的平均值。 ⑴【程序源代码】: #include void main() {printf(\ printf(\ printf(\⑵【程序源代码】: #include main()

{int a=10,b=20,c=35; float ave; ave=(a+b+c)/3.0;

2

《计算方法与程序设计实验》

printf(\}

【实验总结】通过做这个实验,我认识了VC++6.0的集成开发环境,掌握C程序的基本结构,学会如何在VC中编辑、编译、连接和运行C程序,了解了C语言的一些基本语法规则。

实验名称:实验2 基本输入与输出操作

实验时间:第5周周三 实验地点:5423

【实验目的】掌握数据的输入和输出操作;通过编写简单的C程序,了解C程序的编写方法和特

点。

【实验内容】

1.读程序

要求:进一步学会应用 Visual C++。首先读懂给定的程序,写出分析结果;然后调试 运行,得到正确运行结果。 ⑴

#include main() {int a=17; float u=1234.567;

printf(\ printf(\}

Key:运行结果:output integer, 17,17 ,0000017 1234.567017,1234.57Press any to continue ⑵

#include main( ) { int a,x,y; x=(a=2,6*2); y=a=2.6 *a;

printf(\}

Key:运行结果:x=12,y=5Press any key to continue ⑶

#include main() {float x,y; int k1,k2; x=-45.2;y=1.1;

3

《计算方法与程序设计实验》

k1=(int)x+10; k2=y+10;

printf(\ printf(\

Key:运行结果: x=-45.200001,k1=-35y=1.10000,k2=11Press any key to continue 2. 完成程序

要求:按照给定题目要求,参照出现的语句,填写程序空白处。 ⑴键盘输入任意一个小写字母,将其转换成大写字母,然后输出。 #include main()

{char c1,c2; c1=getchar(); c2= ;

putchar('\\'');putchar(c2);putchar('\\'');putchar('\\n'); }

Key:应填 c1-32 因为小写变大写要减32 运行结果:若输入a,则输出'A'

(a?b)*4⑵求a*b的值。(设a=25,b=5) #include main()

{float a=25,b=5; float c;

c= ;

printf(\}

Key:应填 (a+b)*4/(a*b) 或(a+b)*4/a/b 注意乘除法C语言表达式与数学表达式的书写区别 运行结果:0.960000

n

⑶计算到期利息。到期利息= a ×(1 + p) ? a,其中本金为a,存款年数为n,年利率为p。 #include #include main() {float a,p,s; int n;

printf(\ scanf(\

printf(\ scanf(\

printf(\ scanf(\ p=p/100;

printf(\到期利息:.2f\\n\}

Key:应填 s=a*pow(1+p,n)-a; 注意乘方C语言表达式与数学表达式的书写区别 3. 调试程序

要求:分析下列程序是否正确,如有错误,指出错误所在,并改正;若正确,写出运行结果。 ⑴

#include main( ) { int i,k; i=80;

4

《计算方法与程序设计实验》

k=5 *i * j;

printf(\}

Key:错误所在行:(5),[error 'j':undeclared identifier],应去掉 *j 因变量必须先定义,后使用 ⑵该程序输入一个三位数,然后进行个位和百位的置换,如 234 ,转换成432 #include main( )

{ int n,a,b,c,m; scanf(\a=n; b=(n/10); c=(n/100); m=100*a+10*b+c

printf(\}

Key:错误所在行:(9),[syntax error : missing ';' before identifier 'printf'],应在第8行后加;

4.写程序

编程求出某学生期末三门课程的总分及平均分。结果保留小数点后一位。 【程序源代码】 #include main()

{float score1,score2,score3,sum,aver; printf(\

scanf(\ sum=score1+score2+score3; aver=sum/3;

printf(\}

【实验总结】通过做这个实验,我掌握数据的输入和输出操作;通过编写简单的C程序,了解C程序的编写方法和特点,进一步熟悉了C语言的一些基本语法规则。

实验名称:实验3 选择结构程序设计

实验时间:第6周周三 实验地点:5423

【实验目的】掌握if语句的两种格式和switch语句的使用。 【实验内容】

1.下面程序的功能是求三角形的面积,分别用3,6,5 和1,2,3 作为三角形的3 边,

写出该程序的运行结果。

#include \#include \main() {

float a,b,c,area,p;

5

《计算方法与程序设计实验》

scanf(\p=(a+b+c)/2;

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

area=sqrt(p*(p-a)*(p-b)*(p-c)); printf(\} else

printf(\}

Key:输入3,6,5时运行结果:area= 7.48 输入1,2,3时运行结果:Error 2. 计算器程序。用以下数据运行该程序:1+2;2-1;3*4;4/3,输出计算结果。 #include \main() {

float a,b,s; char c;

printf(\scanf(\switch(c) {

case '+': printf(\case '-': printf(\case '*': printf(\case '/': printf(\default: printf(\} }

Key:输入1+2时运行结果:3.000000 输入2-1时运行结果:1.000000 输入3*4时运行结果:12.000000 输入4/3时运行结果:1.333333

3.下列给定程序中,将大写字母转换为对应小写字母之后的第5个字母;若小写字母为v~ z,则使小写字母的值减21。例如,若是字母A,则转换为小写字母f;形参是字母W,则转 换为小写字母b。请改正程序中的错误,使它能得出正确的结果。 #include main() {

char c1,c2;

printf(\ c1=getchar();

if(c1>='A'&&c1<='Z') {

/*************found**************/ C2=C1+32;

if(c2>='a' && c2<='u')

6

《计算方法与程序设计实验》

/*************found**************/ c2=c2-5;

else if(c2>='v' && c2<='z') c2=c2-21; printf(\ } }

Key:第一个错误:C2=C1+32; 应改为:c2=c1+32; 因C语言中标识符大小写有别。

第二个错误: c2=c2-5; 应改为:c2=c1+5; 因将大写字母转换为对应小写字母之后第5个字母 4.编程输入三个整数,输出最大数和最小数。 具体要求如下:

(1)用if 语句实现。

(2)三个整数要用scanf 函数输入,且输入前要有提示。

(3)三个数比较完后将最大数赋给max,最小数赋给min 输出。 (4)用以下数据运行该程序:23、10、89 【程序源代码】 #include void main() {int a,b,c,max,min;

printf(\ scanf(\ max=min=a; if(b>max)max=b; else min=b; if(maxc)min=c;

printf(\

【实验总结】通过做这个实验,我掌握if语句的两种格式和switch语句的使用;通过编写、调试并运行简单的C程序,增强了学习并探索C语言的激情,并巩固了C语言的一些基本语法规则知识。

实验名称:实验4 三种循环语句的使用

实验时间:第7周周三 实验地点:5423

【实验目的】掌握while语句、do-while语句和for语句的格式、功能和使用;掌握三种语句的联

系和区别;掌握连加算法和连乘算法

【实验内容】

1.分析以下程序的输出结果,区分3 种循环控制语句及变量的前后自增。

#include main()

{ int a,b,c,d,i,j,k; a=10; b=c=d=5; i=j=k=0; for(; a>b; ++b) i++; while(a>++c) j++; do{k++;}while(a>d++);

7

《计算方法与程序设计实验》

printf(\

Key:5,4,6 因for(; a>b; ++b) i++;是先判断a>b,再执行i++;++b而while(a>++c) j++;是先判断 a>++c前自增,再执行j++;do{k++;}while(a>d++);是先执行k++;再判断a>d++后自增

23581321,,,,,,…12358132.下列给定程序的功能是:求出如下分数序列的前n项之和。

例如,若n=5,则应输出8.391667。请改正程序中的错误,使其得出正确的结果。

#include main( )

{ int a,b,c,k,n = 5;

double s;

s = 0.0; a = 2; b = 1; for ( k = 1; k <= n; k++ ) { /************found************/ s = s + (Double)a / b; c = a; a = a + b; b = c; }

printf( \ is: %lf\\n\ s ); }

Key: 错误:s = s + (Double)a / b; 应改为 s = s + (double)a / b; 因C语言中的关键字只能小写 3.设计一个程序,计算1至100自然数之和。

具体要求如下:

(1)分别用while、do~while和for语句实现。

(2)定义一个循环变量i,一个存放相加和的变量sum。加数从1开始有规律地变到100,每次递增1,不断循环,直至i的值超过100时退出循环。

【程序源代码】

用while语句实现 #include \main() {int sum=0,i=1; while(i<=100) {sum=sum+i; i++;}

printf(\ }

用do~while语句实现 #include \main() {int sum=0,i=1; do

8

《计算方法与程序设计实验》

{sum=sum+i; i++;

}while(i<=100);

printf(\用for语句实现 #include \main() {int sum=0,i=1; for(;i<=100;i++) sum=sum+i;

printf(\4.求n!。

具体要求如下:

(1)定义一个变量t,初值为1,则第一次循环乘1,第i次循环乘i,直到第n次循环执行后,t中存放的就是所求的值(n从键盘上输入)。

(2)用for语句实现。 (3)用以下数据运行该程序:5。

【程序源代码】

#include \main() {int i,n; float t=1; scanf(\for(i=1;i<=n;i++) t=t*i;

printf(\学生练习:

1. 求500以内(含500)能被5或9整除的所有自然数的倒数之和。按四舍五入的方式精确到小数点后第二位。 2. 求Y=1-1/2+1/3-1/4+1/5...前30项之和。要求:按四舍五入的方式精确到小数点后第二位。

【实验总结】通过做这个实验,我掌握while语句、do-while语句和for语句的格式、功能和使用;掌握三种语句的联系和区别;掌握连加算法:s=0;s=s+n;和连乘算法:m=1;m=m*n;

实验名称:实验5 三种基本结构的综合应用

实验时间:第8周周三 实验地点:5423

【实验目的】学会使用穷举算法和迭代算法;综合使用三种基本结构解决逆向超级素数和相邻素

数问题。

【实验内容】

1. 中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一,百钱买百鸡,问翁、母、雏各几何?

9

《计算方法与程序设计实验》

#include main() {int x,y,z;

for(x=0;x<=20;x++) /*外层循环控制鸡翁数*/ for(y=0;y<=33;y++) /*内层循环控制鸡母数y在0~33变化*/ {z=100-x-y; /*内外层循环控制下,鸡雏数z的值受x,y的值的制约*/ if(5*x+3*y+z/3.0==100.0) /*验证取z值的合理性及得到一组解的合理性*/ printf(\Key:cock=0,hen=25,chicken=75

cock=4,hen=18,chicken=78 cock=8,hen=11,chicken=81

cock=12,hen=4,chicken=84

2.分析下列程序的功能,写出运行结果。

#include #include main( )

{ double x1,x2, x, f1, f2, f;

printf(\ x1 x2 : \用do~while循环保证f(x1)*f(x2)异号*/ do { scanf(\ f1=2*x1*x1*x1-4*x1*x1+3*x1-6;

if(fabs(f1)<=0.001){x=x1;goto end;}/*若fabs(f1)<=0.001,则x1就是方程的一个根*/ f2=2*x2*x2*x2-4*x2*x2+3*x2-6;

if(fabs(f2)<=0.001){x=x2;goto end;} /*若fabs(f2)<=0.001,则x2就是方程的一个根*/

if(f1*f2<0)break; else printf(\ }while(1);

x=(x1+x2)/2;

while(fabs(x1-x2)>0.001)

{ f1=2*x1*x1*x1-4*x1*x1+3*x1-6; f=2*x*x*x-4*x*x+3*x-6; if(f1*f<0)x2=x; else x1=x; x=(x1+x2)/2; }

end: printf(\

Key:Enter x1 x2 :1.2 2.2

root = 2.000

3.下列给定程序的功能是:从3个红球、5个白球、6个黑球中任意取出8个作为一组,进行输出。在每组中,可以没有黑球,但必须要有红球和白球。组合数作为函数值返回。正确的组合数应该是15。程序中i的值代表红球数,j的值代表白球数,k的值代表黑球数。请改正程序中的错误,使它能得出正确的结果。

#include void main() { int i,j,k,sum=0;

printf(\

/*************found**************/ for(i=0;i<=3;i++) { for (j=1;j<=5;j++)

10

《计算方法与程序设计实验》

{k=8-i-j;

/*************found**************/ if(k>=1&&k<=6) { sum=sum+1;

printf(\ }

printf(\

Key:第一个错误:for(i=0;i<=3;i++) 应改为:for(i=1;i<=3;i++) 因必须要有红球和白球。

第二个错误:if(k>=1&&k<=6) 应改为:if(k>=0&&k<=6) 因可以没有黑球 sum= 15 4.一个素数(设为p)依次从最高位去掉一位,二位,三位,……,若得到的各数仍都是素数(注:除1和它本身外,不能被其它整数整除的正整数称为素数,1不是素数,2是素数),且数p的各位数字均不为零,则称该数p为逆向超级素数。例如,617,17,7都是素数,因此617是逆向超级素数,尽管503,03,3都是素数,但它不是逆向超级素数,因为它包含有零。试求[100,999]之内的所有逆向超级素数的个数。

#include \main()

{int i,j,k,m,p,q,n=0; for(i=100;i<=999;i++) {for(j=2;j

if(j>=i) /*三位数是素数时*/ {k=i0; /*去掉百位数字*/ if(k>=10) /*十位数字不是0时*/ {for(m=2;m

if(m>=k) /*两位数是素数时*/ {p=i; /*p为个位数字*/ if(p>1)

{for(q=2;q

if(q>=p)n++,printf(\printf(\

Key:39

5.求[2,400]中相差为10的相邻素数对的对数。

#include \main()

{int i,j,k,m,p,q,n=0; for(i=2;i<=400;i++) {for(j=2;j

11

《计算方法与程序设计实验》

if(j>=i) /*i是素数时*/ {for(k=i+1;k

if(k%m==0)break;/*k不是素数时终止if语句的内层循环*/ if(m>=k)break;} /*k是素数时终止if语句的外层循环*/ if(k>=i+10) /*[i+1,i+9]不是素数时*/ {for(q=2;q

if(k%q==0)break; if(q>=k) /*i+10是素数时*/ n++;}}}

printf(\Key:5

6.求[1,21]范围内的梅森尼数 #include \ main()

{long n,k=2,m,p,q; for(n=2;n<=21;n++) { k=k*2; p=k-1;

m=sqrt(p); for(q=2;q<=m;q++) if(p%q==0) break;

if(q>m) printf(\

Key: 2 3 5 7 13 17 19

7.求1000以内的亲密数对 main()

{int a,b,n,m,q,p; for(a=1;a<1000;a++) {n=0;

for(q=1;q<=a/2;q++) if(a%q==0) n+=q; for(b=a;b<=1000;b++) { m=0;

for(p=1;p<=b/2;p++) if(b%p==0) m+=p;

if(a==m&&b==n) printf(\学生练习:

1. 计算Y=X/1!-X^3/3!+X^5/5!-X^7/7!+……前20项的值(已知:X=2)。精确到小数点后第二位。 2. 若一个自然数恰好是它的平方的末后几位数,则称此数为自同构数(或守形数)。如5和76都是自同构数,因为它们的平方分别是25和5776。求[100,99999]内所有自同构数之和。(提示:若

12

《计算方法与程序设计实验》

x是m位同构数,则x的平方除以10的m次方的余数就是x) 教学方法

【实验总结】通过做这个实验,我学会使用穷举算法(百钱百鸡问题)和迭代算法(二分法求方程的根);综合使用三种基本结构解决逆向超级素数和相邻素数问题,提高了编程的能力。

实验名称:实验6 数组及其应用

实验时间:第11周周三 实验地点:5423

【实验目的】掌握一维数组和二维数组的定义、初始化、赋值和输入输出操作;掌握与数组有关

的算法,如排序和查找等。

【实验内容】

1.分析下列程序的功能,写出运行结果。 #include \#define N 10 main()

{ int i,j,temp, a[N+1];

int count=0; /* 计数器,记录是第几趟排序*/ printf(\for (i=1;i<=N;i++) scanf(\printf(\for(i=1;i<=N;i++)

{ count++; /*每排序一趟,计数器加1*/ for(j=1;j<=N-i;j++)

if(a[j]>a[j+1]) /*若第一个数大于第二个数则交换*/ { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } printf(\打印是第几趟排序*/

for(j=1;j<=N;j++) printf(\打印本趟排序的结果*/ printf(\}

printf(\

for(i=1;i<=N;i++) printf(\打印排序的最终结果*/ printf(\

Key:冒泡法排序,并输出每趟排序的结果

2.以下程序的功能是用筛选法求1~100之间的所有素数,请分析并写出运行结果。 #include \#define SIZE 100 main()

{ int sieve[SIZE+1],prime[SIZE]; /*定义两个数组*/ int i,j,count=0;

sieve[0]=1; /*将1筛除*/ for(i=1;i

for(i=j;i<=SIZE;i=i+j) sieve[i-1]=1; count++; }

13

《计算方法与程序设计实验》

for(i=1;i<=count;i++) {printf(\

if(i==0)printf(\ /*每13个一行输出素数*/ Key: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

分析:先设全为素数,若sieve[i-1]为0,则i是素数,i的2倍…为非素数,sieve[2*i-1]=1。 3.由N个有序整数组成的数列已放在一维数组中,下列给定程序中函数fun的功能是:利用折半查找法查找整数m在数组中的位置。若找到,返回其下标值;否则,返回-1。

折半查找的基本算法是:每次查找前先确定数组中待查的范围low和high(lowhigh,查找结束。请改正程序中的错误,使它能得出正确的结果。

#include #define N 10 main()

{ int i,a[N]={-3,4,7,9,13,45,67,89,100,180 },k=-1,m; int low=0,high=N-1,mid; printf(\数组中的数据如下:\ for(i=0;i/************found************/ else If(m > a[mid]) low=mid+1;

/************found************/ else {k=mid;continue;} }

if(k>=0) printf(\

else printf(\

Key:第一个错误:else If(m > a[mid]) 应改为:else if(m > a[mid]) 因C语言关键字必须小写。

第二个错误:else {k=mid;continue;} 应改为:else {k=mid;break;} 因找到就可终止循环。 4.有一个3*4矩阵,找出每行中最大的元素并与第1列元素交换。 具体要求如下:

(1)使用二维数组存放该3*4矩阵。 (2)定义并初始化该二维数组。

(3)输出原矩阵和处理后的矩阵进行比较。 【程序源代码】 #include \main()

14

《计算方法与程序设计实验》

{ int i,j,k,temp;

int data[3][4]={{12,15,7,11},{14,6,10,21},{25,7,16,45}}; printf(\ for(i=0;i<=2;i++) { for(j=0;j<=3;j++) printf(\

printf(\ /*打印原矩阵*/ }

for(i=0;i<=2;i++) {

k=0;

for(j=1;j<=3;j++) if(data[i][j]>data[i][k]) k=j;

temp=data[i][0]; data[i][0]=data[i][k]; data[i][k]=temp;

} /*求每行最大数并与第1列上的元素交换*/ printf(\ for(i=0;i<=2;i++) {

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

} /*打印处理后矩阵,此时第1列上的元素为每行的最大数*/ }

5.猴子选大王问题:n个人围坐一圈,并顺序编号1~n,从1号开始数,每数到m个就让其出局,重复...。求最后出局者的编号。当n=50,m=3时 ,答案为11

具体要求如下:

(1)使用一维数组存放每个人的编号,每数到m个数就让其出局,出局者编号为0。 (2)使用for循环嵌套实现。 【程序源代码】 #include \main()

{int a[51],i,j,m=0,n;

for(i=1;i<=50;i++)a[i]=i;/*为了符合习惯,数组下标从1开始,下标就是编号*/ for(j=1;j<=50/3;j++) /*外层循环最多循环50/3次*/ for(i=1;i<=50;i++)

15

《计算方法与程序设计实验》

{if(a[i]!=0)m++; /*对未出局者计数*/

if(m==3)a[i]=0,n=i,m=0;/*对出局者编号为0,并保存原编号,计数从0开始*/ }

printf(\最后出局者的编号*/ 学生练习:要求用数组进行编程

1. 已知F(0)=F(1)=0 F(2)=1 F(n)=F(n-1)-2F(n-2)+F(n-3) (n>2) 求F(0)到F(100)中正数的个数。

2 . 计算A15的值,已知A1=1,A2=1/(1+A1),A3=1/(1+A2),A4=1/(1+A3)…(结果保留10位小数)。 【实验总结】通过做这个实验,我掌握了一维数组和二维数组的定义、初始化、赋值和输入输出操作;掌握与数组有关的算法:冒泡法、筛选法、二分查找法、矩阵和猴子选大王问题。

实验名称:实验7 函数及其应用

实验时间:第13周周三 实验地点:5423

【实验目的】掌握C语言中定义、调用函数的方法;掌握函数形参与实参的参数传递关系;加强

常用算法的使用。

【实验内容】

1.调试程序,掌握函数的定义形式,分析函数调用过程中形参和实参的关系。 #include \void swap(int x, int y) { int t;

t=x; x=y; y=t;

printf(\}

main( ) {

int a=10, b=20;

printf(\(1)a=%d, b=%d\\n \swap(a,b);

printf(\(2)a=%d, b=%d\\n \}

Key:分析:C语言中由于实参和形参是不同的变量,实参到形参是单向的值传递,swap函数中形 参值的改变不影响主函数中实参的值。 运行结果:main(1)a=10,b=20 swap***x=20,y=10

main(2)a=10,b=20

2.调试程序,分析程序中函数的调用过程,分析程序的运行结果。 #include \int fun(int x) { int y;

if(x==0||x==1) return 3; y=x*x-fun(x-2); return y; }

main()

16

《计算方法与程序设计实验》

{

printf(\}

Key:分析:C语言中递归调用是先递推再回推,主函数中实参3先送给fun函数中形参x,得到y=3*3-fun(1);在未执行return y;返回主函数之前再用1自已调用自已,这时就到了递归出口,返回3到fun(1)处,因而y=3*3-3; 返回值6到主函数的fun(3)处,所以主函数输出6。

3.排错题:下列给定程序中函数fun 的功能是:用递归算法求形参a 的平方根。请改正 程序中的错误,使它能计算出正确的结果。注意:源程序不得增行或删行,也不得更改程序 的结构!

例如,a 为2 时,平方根值为:1.414214。 #include #include

/**********found**********/ void fun(double a, double x0) { double x1, y; x1=(x0+a/x0)/2.0;

/**********found**********/ if( fabs(x1-x0)<=0.00001 ) y=fun(a,x1); else y=x1; return y; }

main( ) { double x;

printf(\

printf(\}

Key:第一个错误:void fun(double a, double x0) 应改为:double fun(double a, double x0) 因根据题意,需通过调用fun()函数返回a的平方根,故必须将void改为double,否则不能用带值的return语句。自增。

第二个错误:if( fabs(x1-x0)<=0.00001 ) 应改为:if( fabs(x1-x0)>=0.00001 ) 因只有 fabs(x1-x0)>=0.00001才须递归。

4.设计一个程序,判断一个整数n 是否是素数。 具体要求如下:

(1)编制一个函数int prime(number),判断整数number 是否是素数。

(2)编制主函数,由键盘输入整数number,调用(1)中的函数,若返回值为真则是素 数,否则不是素数。

(3)分别用以下数据运行该程序:103,117。

【程序源代码】 #include \main() { int number;

printf(\请输入一个正整数:\\n\scanf(\if (prime(number))

printf(\是素数. \else

printf(\不是素数. \}

17

《计算方法与程序设计实验》

int prime(number) int number; {int flag=1,n;

for(n=2;n

5.编写程序,通过两个自定义函数分别求两个正数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个正数由键盘输入。 具体要求如下:

(1)用辗转相除法实现。

(2)输出要有文字说明,输出形式为:最大公约数=具体值,最小公倍数=具体值 (3)分别用以下数据运行该程序: 8 和26, 64 和258

(4) 辗转相除法:对于两个数m 和n,将大数放在m 中,小数放在n 中,用n 去除m, 若余数为0,则n 为最大公约数,否则将n 作为m,余数作为n,再用n 去除m, 直到余数为0,则n 为最大公约数。

【程序源代码】 #include \hcf(u,v) int u,v; {int a,b,t,r; a=u; b=v;

while((r=b%a)!=0) {b=a; a=r;} return(a);} lcd(u,v,h) int u,v,h; {return(u*v/h);} main() {int u,v,h,l; scanf(\h=hcf(u,v);

printf(\l=lcd(u,v,h);

printf(\

6.请编写函数fun,函数的功能是:求出二维数组周边元素之和,作为函数值返回。二维 数组中的值在主函数中赋予。例如,若二维数组中的值为 1 3 5 7 9 2 9 9 9 4 6 9 9 9 8 1 3 5 7 0 则函数值为61。

18

《计算方法与程序设计实验》

【程序源代码】 #include #define M 4 #define N 5

int fun( int a [M][N]) {int i,j,s=0; for(i=0;i

for(j=0;j

if(i==0||j==0||i==M-1||j==N-1)

s+=a[i][j];;

return s; } void main()

{ int aa[M][N]={{1,3,5,7,9},{2,9,9,9,4},{6,9,9,9,8},{1,3,5,7,0}}; int i, j, y; printf (\ for(i=0; i

{for (j=0; j

【实验总结】通过做这个实验,我掌握了C语言中定义、调用函数的方法;掌握函数形参与实参的参数传递关系;加强常用算法(递归算法求算术根;用函数编程判断素数、求最大公约数和最小公倍数及求二维数组周边元素之和)的使用。

实验名称:实验8 作用域和存储类型应用

实验时间:第14周周三 实验地点:5423

【实验目的】理解C语言中变量的作用域和存储类型;掌握函数调用时它们产生的作用。 【实验内容】

1.调试程序,在程序中观察变量值的变化,掌握在函数调用时变量的作用域和存储类型的作用。 #include \int fun(int a) {

auto int y=0; static int z=3; y=y+1; z=z+1;

return (x+y+z); }

main()

{

int x=2,i;

for (i=0;i<3;i++) printf(“=”,fun(x)); }

Key:编译时出错(8):error 'x' : undeclared identifier 将fun(int a)改为fun(int x) 因x是main函数定义的变量,在fun()中没定义,故在fun()函数中不能引用。运行结果: 5 6 7

19

《计算方法与程序设计实验》

分析:主函数3次调用fun()函数,由于y是fun()中定义的自动变量,z是fun()中定义的静态变量,所以主函数每次调用fun()函数时y都重新赋值,而z的初值在编译前赋予,且改变了的z值能保留。 2.调试程序,分析下列程序的输出结果。 int a=10,b=20; /*全局变量*/ void swap(void); main( ) {

printf(\swap( );

printf(\}

void swap( ) { int c; c=a; a=b; b=c;

printf(\}

Key:运行结果:main(1)a=10,b=20 swap***a=20,b=10 main(2)a=20,b=10

分析:因为a,b是全局变量,在主函数中输出a,b的值,main(1)a=10,b=20,主函数调用无参函数swap(),在swap()中改变了a,b的值,所以输出swap***a=20,b=10,回到主函数后输出已经改变了的a,b的值:main(2)a=20,b=10

3.排错题:下列程序的输出结果应为6 15 15。通过调试程序,改正程序中不恰当的地方以便能够得到要求的结果。 #include \int t=1;

int fun (int p) {

/**********found**********/ int t= 5; t+=p;

printf(\

/**********found**********/ return ; }

main() {

int a =3;

printf(\}

Key:第一个错误:int t= 5; 应改为:static int t= 5; 因根据题意,fun()函数中的t应是静态变量。 第二个错误:return ; 应改为:return t; 因fun()函数调用是作为printf()函数的输出项。

4.程序设计。函数的递归调用Hanoi(汉诺)塔问题的程序参考源代码如下。分析程序中函数的定义和调用以及程序运行的输出结果,并要求进一步改进:通过全局变量的使用使程序的运行能输出移动指定数目盘子时的总步骤数。 【程序参考源代码】

#include \

20

《计算方法与程序设计实验》

void move(char getone ,char putone) {

printf(\——>%c\\n\}

void hanoi(int n,char one ,char two,char three) {

if(n==1) move(one,three); else

{ hanoi(n-1,one,three,two); move(one ,three); hanoi(n-1,two,one,three); } } main() { int n;

printf(\scanf(\

printf(\hanoi(n,'A','B','C');

}

【程序改进源代码】

#include \int n=0;

void move(char getone ,char putone) {n++;

printf(\——>%c\\n\}

void hanoi(int n,char one ,char two,char three) {

if(n==1) move(one,three); else

{ hanoi(n-1,one,three,two); move(one ,three); hanoi(n-1,two,one,three);

21

《计算方法与程序设计实验》

} } main() { int n;

printf(\scanf(\

printf(\hanoi(n,'A','B','C');

}

学生练习:

下面的程序是求表达式的值:

s=1+1/3+(1*2)/(3*5)+(1*2*3)/(3*5*7)+...+(1*2*3*...*n)/(3*5*7*...(2*n+1)) 请将程序补充完整,并给出当n=20时,将程序的运行结果填入相应窗口(按四舍五入保留10位小数)。 程序:

#include #include double fun(int n)

{ double s, t; int i; ____________ t=1.0;

for(i=1;i<=n; i++) { t=t*i/(2*i+1); ____________ }

return s; }

main()

{printf(\}

【实验总结】通过做这个实验,调试程序,分析在函数调用时变量的作用域和存储类型的作用及全局变量的作用域,我理解了C语言中变量的作用域和存储类型;掌握函数调用时它们产生的作用。

实验名称:实验9 指针及其应用

实验时间:第16周周三 实验地点:5423

【实验目的】进一步熟悉模块化设计的方法;掌握使用指针变量实现数组元素的访问;

掌握使用指针变量作为函数的形式参数。

【实验内容】

1.以下函数调用Reverse()函数按逆序重新放置数组A 中的元素,请补全程序。 #include \#define N 10

void Reverse(int *p, int a, int b) {int c;

while (________) {c=*(p+a);

22

《计算方法与程序设计实验》

*(p+a)= ________; *(p+b)=c; ________;}} int main() {int A[N], i;

for (i=0; i

scanf(\Reverse(A, 0, N-1); for (i=0; i

printf(\printf(\return 0;}

Key:第一空应填:a

第二空应填:*(p+b) 或 p[b] /*用指针方法或用下标方法*/ 第三空应填:a++,b++ 或++a/a+=1/a=a+1,++b/b+=1/b=b+1

第四空应填:&A[i] 或 A+i /*用数组元素的地址或数组的首地址加偏移量的方法*/ 第五空应填:*(A+i) 或 A[i] /*用指针方法或用下标方法*/ 2.记录以下程序的运行结果,并进行分析。 #include \int main()

{int a=10, b=0, *pa, *pb; pa=&a, pb=&b;

printf(\

printf(\a=20, b=30;

*pa=a++, *pb=b++; printf(\

printf(\(*pa)++;(*pb)++; printf(\

printf(\return 0; }

分析程序运行:________ Key:运行结果:10,0,10,0 21,31,21,31 22,32,22,32

分析:因为pa=&a;pb+&b;所以*pa和a是同一个变量,占据内存同一存储单元。 注意该程序与下面程序的区别: #include \int main()

{int a=10, b=0, c=a, d=b; printf(\printf(\a=20, b=30;

23

《计算方法与程序设计实验》

c=a++, d=b++; printf(\printf(\c++;d++;

printf(\printf(\return 0; }

Key:运行结果:10,0,10,0 21,31,20,30 21,31,21,31

分析:因为c=a++;相当于c=a;a++;而a和c是两个不同的变量,所以c++不影响a的值。 3.设计一个程序,统计字符串中大写字母的个数。 具体要求如下:

(1)字符串的长度从键盘输入,并以此分配存储空间。

(2)使用指针变量遍历字符串。 【程序源代码1:用数组存放字符串】 #define N 80 #include int capital(char *p) {int count=0; while(*p)

{if(*p>='A'&&*p<='Z') count++; p++;} return count;} main() {char c[N],n;

printf(\ gets(c);

printf(\ puts(c); n=capital(c);

printf(\【程序源代码2:用指针指向字符串(此法可能更合出题者的意图)】

24

《计算方法与程序设计实验》

#include #include int capital(char *p) {int count=0; while(*p)

{if(*p>='A'&&*p<='Z') count++; p++;} return count;} main() {char *c,n;

printf(\ scanf(\ getchar(); c=malloc(n+1);

printf(\ gets(c);

printf(\ puts(c); n=capital(c);

printf(\ free(c);}

【实验总结】通过做这个实验,我进一步熟悉模块化设计的方法;掌握了使用指针变量实现数组元素的访问;掌握了使用指针变量作为函数的形式参数的方法。

实验名称:实验10 结构体与共用体

实验时间:第17周周三 实验地点:5423

【实验目的】掌握结构体变量的定义和使用;掌握结构体数组的概念和应用;掌握链表的概念和

链表的基本操作;掌握共用体变量的定义和使用。

【实验内容】

1.写出下面程序的输出结果,分析结果并上机验证 (1)

#include\struct student { int num; char name[20]; char sex; int age;

}stu[3]={{10101,\

25

《计算方法与程序设计实验》

main()

{ struct student *p; for(p=stu;p

printf(\}

Key: 运行结果:10101,Li Lin,M,18 10102,Zhang Fun,M,19 10104,Wang Min,F,20

分析:本程序定义了具有3个元素的全局结构体数组stu,每个元素由num,name,sex,age四 个成员组成,使用结构体指针变量控制循环,结构体指针变量引用对应的结构体成员 的形式是:指针变量->成员 (2)

#include\struct data { int a,b,c; };

void func(struct data y); main()

{ struct data x;

x.a=27; x.b=3; x.c=x.a+x.b;

printf(\printf(\…\\n\func(x);

printf(\}

void func(struct data y)

{ printf(\printf(\…\\n\

y.a=18; y.b=5; y.c=y.a*y.b;

printf(\printf(\}

Key: 运行结果:x.a=27 x.b=3 x.c=30 Call Func()…

y.a=27 y.b=3 y.c=30 Process…

y.a=18 y.b=5 y.c=90 Return...

x.a=27 x.b=3 x.c=30

分析:本程序使用结构体变量作实参调用func()函数,由于C语言中的函数调用是实参到形 参的单向传递,因此主函数调用func()函数时,虽然在func()函数中改变了形参y的 值,但返回主函数时,实参的值并不改变。另外,要改变结构体变量的值,只能逐个 改变它的成员值。引用结构体成员的形式是:结构体变量.成员。 2.程序设计

(1)有5 个学生,每个学生的数据包括学号、姓名、3 门课的成绩,从键盘输入5 个学 生数据,要求输出3 门课总平均成绩,以及最高分的学生的数据(包括学号、姓名、3 门课 的成绩、平均分数)。

要求:用一个 input 函数输入5 个学生数据;用一个output 函数输出5 个学生数据;用 一个average 函数求总平均分;用max 函数找出最高分学生数据;总平均分和最高分的学生 的数据都在主函数中输出。 【程序框架】

#include\

26

《计算方法与程序设计实验》

struct student { int num; char name[20]; float score[3]; float avg; };

/**********函数声明**********/ void input(struct student stu[5]); void output(struct student stu[5]); float average(struct student stu[5]);

struct student *max(struct student stu[5]); /**********主函数**********/ void main()

{struct student stu[5], *pmax; float avg; printf(\input(stu); /*输入学生数据*/ output(stu); /*输出学生数据*/ avg=average(stu); /*求总平均分*/

printf(\pmax=max(stu); /*查找最高分学生,用指针pmax 指向*/ printf(\

printf(\pmax->score[0], pmax->score[1], pmax->score[2], pmax->avg); /*输出最高分学生数据*/ }

/**********子函数**********/

void input(struct student stu[5]) { }

void output(struct student stu[5]) { }

float average(struct student stu[5]) /*求3 门课总平均分,并作为函数值返回*/ { }

struct student *max(struct student stu[5]) /*查找最高分学生,函数返回最高分学生的地址*/ { } Key:

/**********子函数**********/ void input(struct student stu[5]) {int i,j;

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

{ printf(\ scanf(\ getchar();

printf(\ gets(stu[i].name); for(j=0;j<3;j++)

{ printf(\ scanf(\}

27

《计算方法与程序设计实验》

void output(struct student stu[5]) {int i,j;

printf(\ for(i=0;i<5;i++)

{ printf(\ for(j=0;j<3;j++)

printf(\ printf(\

float average(struct student stu[5]) /*求3 门课总平均分,并作为函数值返回*/ {int i,j;

float aver=0; for(i=0;i<5;i++) { stu[i].avg=0; for(j=0;j<3;j++)

stu[i].avg+=stu[i].score[j]/3; aver+=stu[i].avg/5;} return aver;}

struct student *max(struct student stu[5]) /*查找最高分学生,函数返回最高分学生的地址*/ {struct student *p=stu,*q; for(q=&stu[1];qavgavg)p=q; return p;}

28

《计算方法与程序设计实验》

(2)建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。

要求:用一个create 函数创建链表,输入若干学生的信息存入链表中,以学号为0 作为结束标志;用一个output 函数输出链表中存放的学生信息;用一个delete 函数删除链表中其年龄等于输入年龄的结点。

【程序框架】

#include\#include\struct node { int num; char name[20]; char sex; int age;

struct node *next; /*next 指向下一个结点*/ }; /*链表结点类型定义*/

/**********函数声明**********/ struct node *create( );

void output(struct node *head);

struct node *delete(struct node *head, int age); /**********主函数**********/ void main()

{struct node *head; int age; printf(\head=create(); /*创建链表*/ printf(\output(head); /*输出链表*/

printf(\scanf(\

head=delete(head,age); /*删除链表中其年龄等于输入年龄age 的结点*/ printf(\output(head); /*输出删除后的链表*/ }

/**********子函数**********/

struct node *create( ) /*输入若干学生信息存入链表中,以学号为0 作为结束标志,从而 创建一个链表,函数返回链表的头指针*/ { }

void output(struct node *head) /*输出head 所指链表中的学生信息*/ { }

struct node *delete(struct node *head, int age) /*删除head 所指链表中其年龄等于给定值 age 的结点,函数返回删除后的链表头指针*/ { } Key:

/**********子函数**********/

struct node *create( ) /*输入若干学生信息存入链表中,以学号为0 作为结束标志,从而 创建一个链表,函数返回链表的头指针*/ {int num,age,n=1;char name[20],sex;

struct node *h=malloc(sizeof(struct node)),*s,*r=h; printf(\

29

《计算方法与程序设计实验》

scanf(\ while(num) { getchar();

printf(\

printf(\ printf(\ s=malloc(sizeof(struct node));

s->num=num; strcpy(s->name,name); s->sex=sex; s->age=age; r=r->next=s; n++;

printf(\ scanf(\ r->next=0; return h; }

void output(struct node *head) /*输出head 所指链表中的学生信息*/ {struct node *p=head->next;

if(p==0)printf(\ else

{ printf(\ while(p)

printf(\ p=p->next;

printf(\

struct node *delete(struct node *head, int age) /*删除head 所指链表中其年龄等于给定值 age 的结点,函数返回删除后的链表头指针*/ {struct node *q=head,*p=q->next;

if(p==0)printf(\ else

{ while(p&&p->age!=age) p=p->next,q=q->next;

if(p->age==age)q->next=p->next,free(p); else printf(\ return head; }

30

《计算方法与程序设计实验》

(3)从键盘输入一个类型为unsigned long 型的整数,分别将其前两个字节和后两个字 节作为unsigned int 型数据输出。

要求:使用共用体变量实现;有必要的提示信息;用以下数据测试:12345678。 提示:

typedef union u{ unsigned int byte[2]; /*分别存放unsigned long 型数据的高低两个字节的数据*/

unsigned long word; /*存放unsigned long 型数据*/ }BYTE;

【程序源代码:考虑兼容性,两个字节的整型定义用short,输出用%hd,长整型输入用%ld】 #include

typedef union u{ unsigned short byte[2]; /*分别存放unsigned long 型数据的高低两个字节的数据*/

unsigned long word; /*存放unsigned long 型数据*/ }BYTE; main() {BYTE num;

printf(\ scanf(\

printf(\ num.word,num.byte[0],num.byte[1]);/*十进制输出对照*/

printf(\ num.word,num.byte[0],num.byte[1]);/*十六进制输出对照*/ }

【实验总结】通过做这个实验,我掌握了结构体变量的定义和使用;掌握结构体数组的概念和应用;掌握链表的概念和链表的基本操作;掌握了共用体变量的定义和使用。

实验名称:实验11 文件及其应用

实验时间:第18周周三 实验地点:5423

【实验目的】掌握与文件有关的基本概念;了解文件操作的一般步骤,掌握文件的各种基本操作;

掌握文件的顺序读写和随机读写的处理方法;熟练编写简单文件应用程序。

【实验内容】

1. 调试运行以下程序并验证。

有五个学生,每个学生有3 门功课,从键盘输入学号、姓名以及成绩,计算平均分,并 将原有数据和平均分存放在磁盘文件stud.txt 中。 #include #include #include #define N 5 struct stud {

long num;

char name[20]; float score[3]; float aver; }student[N]; main() {FILE *fp;

char numstr[20]; int i,j;

31

《计算方法与程序设计实验》

float sum;

if((fp=fopen(\{printf(\getch(); exit(1);}

for(i=0;i

printf(\

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

{printf(\gets(numstr);

student[i].score[j]=atol(numstr); sum+=student[i].score[j]; }

student[i].aver=sum/3;

fwrite(&student[i],sizeof(student[i]),1,fp); }

fclose(fp); }

Key:输入截图

32

《计算方法与程序设计实验》

若要验证输入文件中的内容是否正确,可以将文件的内容读出来,但不能直接打开二进 制形式的文件,可以利用以下程序打开文件,调试运行并验证输入是否正确。 #include #include #include struct stud

{long num;char name[20];float score[3];float aver;}student; main()

{FILE *fp;int i;

if((fp=fopen(\{printf(\getch(); exit(1);}

while(fread(&student,sizeof(student),1,fp)==1) {printf(\printf(\for(i=0;i<3;i++)

printf(\printf(\printf(\}}

Key:输出截图

33

《计算方法与程序设计实验》

2. 以下函数的功能是把文本文件 B 的内容追加到文本文件A 的内容之后。补全程序并验证。 #include #define N 80 main() {

FILE *fp,*fp1,*fp2; int i;

char c[N],t,ch;

if( ==NULL) {

printf(\exit(1); }

printf(\

for(i=0;(ch=fgetc(fp))!=EOF;i++) {

c[i]=ch;

}

fclose(fp);

if((fp=fopen(\{

printf(\exit(1); }

printf(\

for(i=0;(ch=fgetc(fp))!=EOF;i++) {

c[i]=ch;

putchar(c[i]); }

fclose(fp);

if((fp1=fopen(\{

while((ch=fgetc(fp2))!=EOF) } else {

printf(\}

fclose(fp1); fclose(fp2);

printf(\if((fp=fopen(\{

printf(\exit(1); }

for(i=0;(ch=fgetc(fp))!=EOF;i++) {

c[i]=ch;

34

《计算方法与程序设计实验》

putchar(c[i]); }

putchar('\\n'); fclose(fp); }

Key:第一空应填:(fp=fopen(\

第二空应填:putchar(ch); 或 putchar(c[i]); /*输出变量或数组元素*/ 第三空应填:&&

第四空应填:fputc(ch,fp1);

注意:若此程序运行前,先用C++集成开发环境新建文本文件a.dat,其内容为asdfg;新建文本文件b.dat,其内容为qwerty。则第一次运行结果为:

此题最好改成如下形式:否则每次运行结果不同。

2. 以下函数的功能是把文本文件 B 的内容追加到文本文件A 的内容之后。补全程序并验证。 #include #define N 80 main() {

FILE *fp,*fp1,*fp2; int i;

char c[N]={'a','s','d','f','g'},t,ch; if( ==NULL) {

printf(\exit(1); }

printf(\for(i=0;i<5;i++) {

putchar(c[i]); }

fclose(fp);

if((fp=fopen(\{

printf(\exit(1); }

printf(\

for(i=0;(ch=fgetc(fp))!=EOF;i++) {

c[i]=ch;

putchar(c[i]); }

fclose(fp);

35

《计算方法与程序设计实验》

if((fp1=fopen(\{

while((ch=fgetc(fp2))!=EOF) fputc(ch,fp1); } else {

printf(\}

fclose(fp1); fclose(fp2);

printf(\if((fp=fopen(\{

printf(\exit(1); }

for(i=0;(ch=fgetc(fp))!=EOF;i++) {

c[i]=ch;

putchar(c[i]); }

putchar('\\n'); fclose(fp);}

Key:第一空应填:(fp=fopen(\ 第二空应填:putc(c[i],fp); 第三空应填:&&

第四空应填:fputc(ch,fp1);

注意:若此程序运行前,先用C++集成开发环境新建文本文件b.dat,其内容为qwerty。则每次运行结果为:

3. 从磁盘文件 file1.dat 中读入一行字符到内存,将其中的小写字母全改成大写字母, 然后输出到磁盘文件file2.dat 中。 具体要求如下:

(1)用fgetc()和fputc()实现字符的输入和输出。

(2)用条件运算符判断输入的字符是否是小写字母,若是,则减去32(大小写字母的 ASCII 码相差32);否则不改变。最后输出此字符。

(3)分别用以下数据运行该程序:c,F。/*此要求似乎与题意不符,建议去掉*/ 【程序源代码1:将该行字符存入字符数组中】 #include #define N 80 main() {

FILE *fp; int i;

char c[N];

36

《计算方法与程序设计实验》

if((fp=fopen(\{

printf(\exit(0); }

printf(\

for(i=0;(c[i]=fgetc(fp))!=EOF;i++) {

putchar(c[i]);

c[i]=c[i]>='a'&&c[i]<='z'?c[i]-32:c[i]; }

putchar('\\n'); fclose(fp);

if((fp=fopen(\{

printf(\exit(0); }

printf(\for(i=0;c[i]!='\\n';i++) {

fputc(c[i],fp); putchar(c[i]); }

putchar('\\n'); fputc('\\n',fp); fclose(fp); }

注意:若此程序运行前,先用C++集成开发环境新建文本文件file1.dat,若其内容为: aS12 DF-afiour(表示按回车键)。则运行结果为:

【程序源代码2:只显示修改后的该行字符】 #include \main() { FILE *fp1,*fp2; char ch;

fp1=fopen(\ if(fp1==NULL)

{ printf(\ exit(0); }

fp2=fopen(\ if(fp2==NULL)

{ printf(\ exit(0); }

printf(\

while((ch=fgetc(fp1))!= '\\n') { ch=ch>='a'&&ch<='z'?ch-32:ch; fputc(ch,fp2);

37

《计算方法与程序设计实验》

putchar(ch); }

putchar('\\n'); fclose(fp2); fclose(fp1); }

4. 密码管理。(本实验强调文件的操作,密码设置和密码字符串的加密自己设计和实现,本实验进行不加密存储和校验) 具体要求如下:

(1)设置密码长度为6~12 个字符。

(2)加密存储到1 个ASCII 文件。本实验直接利用fputs()函数,将假定已加密的密码存储在文件password 中。

(3)密码校验。使用同一个加密算法对登录密码加密然后和设置的原始密文比较进行校验。 【程序源代码】 #include #include #include void show(char *s) { int i,len; len=strlen(s); for(i=0;i

void getpass(char *s) { FILE *fp; int i=0; if((fp=fopen(\ { printf(\ printf(\ while((s[i]=getch())!='\\r') { putchar('*'); i++; } s[i]=0; putchar('\\n'); show(s); fputs(s,fp); fclose(fp); }

int main() { int i; char pass[50],t[50]; while(1) { getpass(pass); i=strlen(pass); if(i>=6&&i<=12)break; } printf(\ printf(\ i=0; while(1) { while((t[i]=getch())!='\\r') { putchar('*');

38

《计算方法与程序设计实验》

i++; } t[i]=0; putchar('\\n'); show(t); if(!strcmp(t,pass))break; printf(\ printf(\ return 0;} 输出截图

}

5. 假设有若干个学生,每个学生有 3 门功课,从键盘上输入学生有关信息(学号、姓 名、成绩),并计算其平均成绩,将原有数据和平均分保存在磁盘文件record 中。 具体要求如下:

(1)学生有关信息采用结构体类型存储。

(2)fwrite()函数实现数据块输出到文件record。 (3)结合循环结构实现数据输入和输出。

【程序源代码】 #include #include #define N 3

typedef struct{int num;char name[10];float score[3],ave;}STU; main()

{FILE *fp; int i,j; STU st[N];

if((fp=fopen(\

{ printf(\ for(i=0;i

{ printf(\ scanf(\ getchar(); printf(\ gets(st[i].name); st[i].ave=0; for(j=0;j<3;j++) { printf(\ scanf(\ st[i].ave+=st[i].score[j];} st[i].ave/=j; fwrite(&st[i],sizeof(STU),1,fp);} fclose(fp);} 输出截图

39

《计算方法与程序设计实验》

6. 假设有 10 个学生记录从键盘输入到文件record 中,在实验3(实验3建议改为本实验的第5题)的基础之上,将第1、3、5、7、9 号记录学生信息读出显示在屏幕。 具体要求如下:

(1)用fread()函数实现从文件record 中数据块读。

(2)用随机方式读文件,采用fseek()函数定位文件读写位置。 【程序源代码】 #include #include #define N 3

typedef struct{int num;char name[10];float score[3],ave;}STU; main() {FILE *fp; int i=1,j; STU st;

if((fp=fopen(\

{ printf(\while(fread(&st,sizeof(st),1,fp)==1)

{ printf(\ printf(\ for(j=0;j<3;j++) printf(\ printf(\ fseek(fp,sizeof(STU),SEEK_CUR); i+=2;} fclose(fp); }

输出截图

7.有两个磁盘文件,各自存放已排好序的若干字符(如a1.dat中放\,a2.dat中放\),要求将两个文件合并,合并后仍然保持有序(如\),存放在a3.dat文件中。 【程序如下】

#include main()

{FILE *in1,*in2,*out; int i,j,n; char q[10],t;

if((in1=fopen(\if((in2=fopen(\if((out=fopen(\i=0;

while(!feof(in1)){q[i]=fgetc(in1);i++;} while(!feof(in2)){q[i]=fgetc(in2);i++;} i--;

40

《计算方法与程序设计实验》

q[i]=NULL; n=i;

for(i=0;i!=n;i++)

for(j=i;j!=n;j++) if(q[i]>q[j]) {t=q[i];q[i]=q[j];q[j]=t;} printf(\

for(i=0;q[i]!=NULL;i++) fputc(q[i],out); fclose(in1); fclose(in2); fclose(out); }

【实验总结】通过做这个实验,我掌握了与文件有关的基本概念;了解文件操作的一般步骤,掌握文件的各种基本操作;掌握文件的顺序读写和随机读写的处理方法;熟练编写简单文件应用程序。

实验名称:实验12 基于结构体的学生信息管理系统

实验时间:第19周周三 实验地点:5423

【实验目的】

通过这个实验的练习,学生能够掌握本课程所有知识的综合应用。

【实验内容】

设计一个学生信息(姓名、学号、年龄、性别及5门课的成绩)管理系统。要求实现的功能有:①用结构体存放所有数据;②每个功能都用函数实现;③从键盘输入10名学生的信息:姓名、学号、年龄、性别及5门课的成绩,然后将这10名学生的信息输出到data.txt文件中;④计算每个学生的总分;⑤按总分从高到低排序;⑥把最后结果输出到data2.txt文件中。

方法:先定义一个结构体类型,再定义一个结构体数组。用一个主函数和三个自定义函数完成所有功能,newr()用来输入原始数据并计算总分,所有信息输出到文件data.txt中;sort()用来排序并把结果输出到data2.txt文件中,disp()用来输出信息到显示器上。

源程序如下: #include #include #include #include #define M 3 #define N 5 struct student { char xm[10]; char xh[10]; char xb; int nl; int score[N]; int sum; };

typedef struct student STU;

41

《计算方法与程序设计实验》

void display(void); void sort(void); void newr(void); STU rec[M];

char *sub[]={\main() {

printf(\这是一个学生信息管理系统,可以对学生信息进行管理。\\n\ printf(\欢迎使用该管理系统!\\n\ printf(\ newr(); sort(); display(); }

void newr(void) { int i, j; FILE *fp;

for(j=0;j

printf(\请输入姓名:\ gets(rec[j].xm); printf(\请输入学号:\ gets(rec[j].xh); printf(\请输入性别:\ scanf(\ printf(\请输入年龄,5门成绩:\

scanf(\ &rec[j].score[1],&rec[j].score[2],

&rec[j].score[3],&rec[j].score[4]);

rec[j].sum=0; for (i=0;i

rec[j].sum+=rec[j].score[i]; }

if ((fp=fopen(\ { printf(\不能存入文件!\\n\ exit(0); } for(i=0;i

fprintf(fp,\

42

《计算方法与程序设计实验》

rec[i].xh, rec[i].xb, rec[i].nl, rec[i].score[0], rec[i].score[1], rec[i].score[2], rec[i].score[3], rec[i].score[4], rec[i].sum); fclose(fp); }

void sort(void) { int i,j; STU tmps; for(i=0;i

if(rec[i].sum>rec[j].sum)

{ tmps=rec[i];rec[i]=rec[j];rec[j]=tmps;} }

void display(void) { int i,j; FILE *fp;

if ((fp=fopen(\ { printf(\不能存入文件!\\n\ exit(0); }

for(i=0;i

fprintf(fp,\rec[i].xm, rec[i].xh, rec[i].xb,

rec[i].nl, rec[i].score[0], rec[i].score[1],

rec[i].score[2], rec[i].score[3],rec[i].score[4], rec[i].sum); fclose(fp);

printf(\ for (j=0;j

{printf(\ for (j=0;j

printf(\ printf(\} } 运行结果是:

43

《计算方法与程序设计实验》

【实验总结】通过这次实验掌握了……………………,在上机过程中出现………………问题,

我是……怎样解决的,我有……什么收获。

44

本文来源:https://www.bwwdw.com/article/sxbx.html

Top