四川师范大学c语言实验报告

更新时间:2024-05-01 19:05:01 阅读量: 综合文库 文档下载

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

实验一 数据类型和表达式 实验

(验证性 实验 2学时)

一、目的要求:

(1)了解C语言中数据类型的意义。 (2)理解常用运算符的意义。

(3)掌握C语言表达式的运行规则。 (4)编写实验报告。

二、实验内容(参考实验指导书):

1、计算由键盘输入的任何两个双精度数据的平均值。 (1)算法描述:将数据代入公式(a+b)/2,输出结果。 (2)源代码及说明:

#include main() {

double a,b; scanf(\ %lf\ printf(\}

(3)测试数据:2 6 (4)运行结果:4.00000

(5)问题及解决方法:问题:格式符使用“%f ”,输出结果总是 0.000000 。

解决方法:格式符改为”%lf ”。

2、写一个输入7个数据的程序,把输入的数据代入a + b * (c – d ) / e * f – g 表达式进行运算。

(1)算法描述:将数据代入公式a + b * (c – d ) / e * f – g,输出结果。 (2)源代码及说明:

#include

main() {

int a,b,c,d,e,f,g;

scanf(\

&a,&b,&c,&d,&e,&f,&g); printf(\ }

(3)测试数据:1 2 3 4 5 6 7 (4)运行结果:-6

(5)问题及解决方法:无

3、编写一个C语言程序,测试下列各表达式: i, j i + 1 , j + 1

第 1 页 共 1 页

i++ , j++ ++i , ++j i+++++j

(1)算法描述:定义变量并将其分别代入各表达式中,输出结果。 (2)源代码及说明:

#include main() {

int i=2,j=3;

printf(\ printf(\ printf(\ i=2,j=3;

printf(\ i=2,j=3;

printf(\ }

(3)测试数据:2 3

(4)运行结果:2 3;3 4;2 3;3 4;6 (5)问题及解决方法:

问题:没有注意变量的使用。 解决方法:重新定义变量。

4、输入存款金额money,存期year和年利率rate,根据下列公式计算存款到期时的利息interest(税前),输出时保留2位小数。 interest = money(1+rate)year - money

(1)算法描述:利用函数pow( ),将数据代入公式interest = money(1+rate)year - money输出结果。

(2)源代码及说明:

#include #include main() { double money,rate,interest; int year=0; scanf(\ %lf\ scanf(\ interest=money*pow(1+rate, year)-money; printf(\}

(3)测试数据:100 0.1 2 (4)运行结果:21.00 (5)问题及解决方法:

问题:求利率的多次幂

解决方法:利用math 函数库里的pow( )函数

第 2 页 共 2 页

5、输入华氏温度,输出对应的摄氏温度。计算公式如下: c = 5 * ( f - 32) / 9

其中,c表示摄氏温度,f表示华氏温度。

(1)算法描述:将数据代入c = 5 * ( f - 32) / 9,输出结果。 (2)源代码及说明:

#include main() { double c,f; scanf(\ c=5*(f-32)/9; printf(\摄氏温度为: %lf\}

(3)测试数据:90.0

(4)运行结果:32.222222 (5)问题及解决方法:无 三、实验总结:

1. 通过实验我清楚的知道了双精度型数据的格式说明符的使用。 2. 学会使用pow( )函数。

实验二 分支结构程序设计 实验

(验证性 实验 2学时)

一、目的要求:

(1)了解和掌握分支语句的使用,包括if语句的各种形式以及switch语句。 (2)编写实验报告。

二、实验内容(参考实验指导书):

1、编写一个程序完成输入一个整数,输出它的符号。 (1)算法描述:

if(i>0) 输出“+”。 if(i<0) 输出“-”。 if(i=0) 输出“0”。 (2)源代码及说明:

#include main() { int i; printf(\请输入一个整数:\\n\ scanf(\ if(i>0) {

第 3 页 共 3 页

printf(\ }

else if(i=0)

printf(\ else printf(\

}

(3)测试数据:5 -6 (4)运行结果:+ -

(5)问题及解决方法:无

2、请编写居民应交水费,并提供各种测试数据。

居民应交水费y(元)与月用水量x(吨)的函数关系式如下: 0 x < 0 y = f(x) = 4x / 3 0 ≤ x ≤ 15 2.5x – 10.5 x > 15 (1)算法描述:

if x<0 => f(x)=0;

if 0<=x<=15 =>f(x)=4x/3 if x>15 =>f(x)=2.5x-10.5 (2)源代码及说明:

#include main() { float x,y; scanf(\ if(x<0) { y=0; printf(\应交水费%f 元\\n\ } else if(x>=0&&x<=15) { y=4*x/3; printf(\应交水费%f 元\\n\ } else { y=2.5 * x-10.5; printf(\应交水费%f 元\\n\ } }

(3)测试数据:-1 8 20 (4)运行结果:0.000000 10.666667 35.200000

第 4 页 共 4 页

(5)问题及解决方法:无

3、请根据输入的学生成绩给出成绩等级的判断,判断规则如下: 如果输入的成绩大于等于90,则输出优秀; 如果输入的成绩小于90、大于等于80,则输出良好; 如果输入的成绩小于80、大于等于70,则输出中等; 如果输入的成绩小于70、大于等于60,则输出及格; 其他输出不及格。 (1)算法描述:

if score>=90 输出优秀 if 80<=score<90 输出良好 if 70<=score<80 输出中等 if 60<=score<70 输出及格 else 输出不及格 (2)源代码及说明: #include main() { int score ; scanf(\ if(score>=0&&score<=100) { switch(score/10) { case 10: case 9:printf(\优秀\ break; case 8:printf(\良好\ break; case 7:printf(\中等\\n\ break; case 6:printf(\及格\\n\ break; case 5: case 4: case 3: case 2: case 1: case 0:printf(\不及格\\n\ break; default: printf(\你输入的成绩非法\\n\ } } printf(\你输入的成绩非法\\n\

第 5 页 共 5 页

}

(3)测试数据:98 86 75 64 53 105 -22

(4)运行结果:优秀 良好 中等 及格 不及格 输入不合法 输入不合法 (5)问题及解决方法:

问题:大于100的分数未给出明确结果

解决方法;在代码中加上对高于100分的限制

4、运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下: s = 250km 没有折扣 250km ≤ s < 500km 2%折扣 500km ≤ s < 1000km 5%折扣 1000km ≤ s < 2000km 8%折扣 2000km ≤ s < 3000km 10%折扣 3000km ≤ s 15%折扣

设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费的计算公式为: f = p * w * s * ( 1 – d )

请编程实现:从键盘输入基本运费p,货物重w,距离s,计算输出用户最终需要支付的运费。

(1)算法描述:

if(s<250) d=0.0 if(s>=250&&s<500) d=0.02 if(s>=500&&s<1000) d=0.05 if(s>=1000&&s<2000) d=0.08 if(s>=2000&&s<3000) d=0.1

else d=0.15

然后再将数据代入公式money=p*w*s*(1-d),输出money。 (2)源代码及说明: #include main() { double p,w,s,money,d; scanf(\ %lf %lf\ if(s<250) { d=0.0; } else if(s>=250&&s<500) { d=0.02; } else if(s>=500&&s<1000) { d=0.05;

第 6 页 共 6 页

} else if(s>=1000&&s<2000) { d=0.08; } else if(s>=2000&&s<3000) { d=0.1; } else d=0.15; money=p*w*s*(1-d); printf(\总运费为:%.2lf\}

(3)测试数据:10 2 230 (4)运行结果:4600.00 (5)问题及解决方法:无

三、实验总结:掌握了if和switch分支语句的使用。

实验三 循环结构程序设计 实验 (验证性 综合性 实验 2学时)

一、目的要求:

(1)使用循环语句完成累乘、图像输出的程序编写。 (2)掌握较复杂结构程序的编写。 (3)掌握程序调试的方法。 (4)编写实验报告。

二、实验内容(参考实验指导书):

1、已知xyz + yzz = 532,其中x、y、z都是数字(0~9),编写一个程序求出x、y、z分别代表什么数字。 (1)算法描述: for i=1到9

for j=1到9 for z=1到9

if满足xyz + yzz = 532 则输出x、y、z (2)源代码及说明: #include main() { int x,y,z; for(x=0;x<=9;x++)

第 7 页 共 7 页

{ for(y=0;y<=9;y++) { for(z=0;z<=9;z++) { if(x*100+y*10+z+y*100+z*10+z==532) printf(\ } } } }

(3)测试数据: (4)运行结果:3 2 1 (5)问题及解决方法:无

2、编写一个程序打印如下对称图形(行数由键盘输入1~9范围的值),例如下面是输入的数字4时的情形:

4444444 33333 222 1 222 33333 4444444 (1)算法描述:

for(i=number;i>0;i--){ for(k=number;k>=i;k--){ printf(\ } for(j=0;j

for(i=2;i<=number;i++){ for(k=number;k>=i;k--) } for(j=0;j

(2)源代码及说明: #include main() {

int number; int i,j,k;

scanf(\

第 8 页 共 8 页

for(i=number;i>0;i--) { for(k=number;k>=i;k--) { printf(\ } for(j=0;j

for(i=2;i<=number;i++) { for(k=number;k>=i;k--) { printf(\ } for(j=0;j

}

(3)测试数据:4

(4)运行结果: 4444444 33333 222 1 222 33333 4444444 (5)问题及解决方法:无 3、学校有近千名学生,在操场上排队,5人一行余2人,7人一行余3人,3人一行余1人,编写一个程序求该校的学生人数。 (1)算法描述:

for(x=1;x<1000;x++)

if满足x%5==2 && x%7==3 && x%3==1 则输出x

(2)源代码及说明: #include main() {

第 9 页 共 9 页

int x; for(x=1;x<1000;x++) { if(x%5==2 && x%7==3 && x%3==1) printf(\ } }

(3)测试数据:

(4)运行结果:52 157 262 367 472 577 682 787 892 997 (5)问题及解决方法:无

4、学校某班A、B、C、D四位同学中的一位做了好事不留名,表扬信来了之后,班主任问这四位是谁做了好事,四位回答如下: A说:不是我。 B说:是C。 C说:是D。 D说:他胡说。

已知三个人说的是真话,一个人说的是假话。请根据这些信息,找出做了好事的人。 (1)算法描述:

for(x='A';x<='D';x++)

if((x!='A')+(x=='C')+(x=='D')+(x!='D')==3)

输出谁做了好事 (2)源代码及说明:

#include main() { char x; for(x='A';x<='D';x++) { if((x!='A')+(x=='C')+(x=='D')+(x!='D')==3) printf(\做了 好事\\n\ } }

(3)测试数据:

(4)运行结果:C做了好事 (5)问题及解决方法:无

三、实验总结:通过这几个实验基本掌握了循环的用法和循环嵌套的使用。

实验四 数组程序设计 实验 (验证性 综合性 实验 4学时)

一、目的要求:

(1)掌握一维和二维数组的使用技巧。 (2)编写实验报告。

第 10 页 共 10 页

二、实验内容(参考实验指导书):

1、从键盘输入一个长度为N(比如10)的整型数组,而后将数组中小于零的元素移动到数组的前端,大于零的元素移到数组的后端,等于零的元素留在数组中间。比如原来数组为:2 -5 -89 75 0 -89 0 93 48 0,经过处理后的数组为:-5 -89 -89 0 0 0 75 93 48 2。由于不要求数组有序,所以不允许用排序方法。 提示:

1)输入N个数据,构建数组。

2)按照要求确定数据的位置,需要注意循环条件的确定、0数据元素往中间推的实现过程以及数组处理的方向。 (1)算法描述:

for(从第一个数到第十个数) {

for(从第i+个数到第十个数) {

首先判断前一个数是否大于零,再判断后一个数是与零之间的关系,如果不是等于零,则需交换位置。 } }

(2)源代码及说明: #include main() { int N,i,end=0; scanf(\ int a[N]; int b[N]; int j=0; int st =0; int m=N-1; for(i=0;i0) { b[m--]=a[i];

第 11 页 共 11 页

end=m; } } for(i=st;i

(3)测试数据:10

2 -5 -89 75 0 -89 0 93 48 0 (4)运行结果:-5 -89 -89 0 0 0 75 93 48 2 (5)问题及解决方法:

问题:对大于0和小于0的数进行分类,再重新组合。 解决方法:重新定义一个数组,依次放入数据。 2、设数组a的定义如下:

int a[20] = {2,4,6,8,10,12,14,16}; 已存入数组中的数据值已经按由小到大的顺序存放,现从键盘输入一个数据,把它插入到数组中,要求插入新数据以后,数组数据仍然保持有序。请编写一个程序实现上述功能。 提示:

1)定义整型数组并初始化。 2)从键盘输入一个数据。

3)将该数据插入到数组中,由于要保证插入的数组仍然有序,所以需要查找插入的位置。 4)输出插入数据以后的数组。 (1)算法描述:

遍历数组找到插入数在数组中的位置

for( i=0;i<20;i++) { if(a[i]>x) break; } j=i;

重新排列插入数后面的数 for(i=8;i>=j;i--){ a[i+1]=a[i];} a[j]=x;

最后输出插入数据后的数组 (2)源代码及说明: #include main() { int a[20]={2,4,6,8,10,12,14,16}; int n,i,k;

第 12 页 共 12 页

scanf(\ for(i=0;i<8;i++) { if(n=k;i--) { a[i+1]=a[i]; } a[k]=n; for(i=0;i<9;i++) { printf(\ } }

(3)测试数据:3

(4)运行结果:2 3 4 6 8 10 12 14 16 0 0 0 0 0 0 0 0 0 0 0 (5)问题及解决方法:无

3、写一个3 x 5矩阵的转置程序,输出其原矩阵的值和转置以后的结果。 提示:

1)定义一个二维数组及相关变量。

2)对二维数组赋值,可以由键盘输入,也可以通过其他方式赋值。 3)输出转置前的二维数组。 4)对二维数组中的值进行转置。 5)输出转置后的二维数组中的值。 (1)算法描述:

从键盘中输入数组

for(i=0;i<3;i++) for(j=0;j<5;j++) scanf(\ 交换数组对应数值并输出 for(i=0;i<5;i++) for(j=0;j<3;j++) b[i][j]=a[j][i];

printf(\(2)源代码及说明: #include main() { int a[3][5]={1,2,3,4,5,1,2,3,4,5,1,2,3,4,5}; int b[5][3]; int i,j;

第 13 页 共 13 页

for(i=0;i<5;i++) { for(j=0;j<3;j++) { b[i][j]=a[j][i]; printf(\ } printf(\ } }

(3)测试数据:1 2 3 4 5 5 6 7 8 9 1 3 5 7 9 (4)运行结果:1 5 1 2 6 3 3 7 5 4 8 7 5 9 9 (5)问题及解决方法:无

4、编程实现随机产生10个位于区间[100 200]互不相等的整数,并将其按降序排序和输出。 (1)算法描述: 产生随机数

#include #include

#define random(x) (100+rand()1) 存入数组for(i=0;i<=9;i++) { a[i]=random(200); printf(\ }

进行排序(选择) for(i=0;i<=9;i++) { for(j=i+1;j<10;j++) { if(a[i]

(2)源代码及说明:

第 14 页 共 14 页

#include #include #include main() { int x; int a[10]; int i,j,m = 1; int temp; srand((unsigned)time(NULL)); while(1) { for(i=0;i<10;i++) { x =100+ rand() % 101; for(j=0;j

第 15 页 共 15 页

{ if(a[i]

(3)测试数据:137 114 155 107 146 173 160 166 172 186 (4)运行结果:186 173 172 166 160 155 146 137 114 107 (5)问题及解决方法:无 三、实验总结:

(1)熟练地掌握了选择排序和穷举算法的使用; (2)掌握了对二维数组的简单的使用。

实验五 函数 实验

(验证性 综合性 实验 5学时)

一、目的要求:

(1)学习函数的编程思想,编写一个包括3~4个函数的程序。 (2)掌握函数中参数传递的两种方式和函数的相互调用。 (3)编写实验报告。

二、实验内容(参考实验指导书):

1、写一个函数int digit( int n , int k ),它返回数n的从右向左的第k个十进数字值。例如,函数调用digit(1234,2)将返回值3。 (1)算法描述:

int digit( int n , int k ) {

for(i=0;i

{

d=n; n=n/10; } return d;

}

用scanf输入数,调用函数int digit输出结果

第 16 页 共 16 页

(2)源代码及说明: #include int digit(int n,int k) { int i; int m; for(i=0;i

main() { int x; x = digit(1234,2); printf(\}

(3)测试数据:digit(1234,2)将返回值3 (4)运行结果:3

(5)问题及解决方法:无

2、写一个函数int isprime(int n),当n是质数时,函数返回非零值;当n是合数时,函数返回零值。

(1)算法描述:

int isprime(int n){ for(i=2;i

if(n%i==0) return 0; else

return 1; } }

if(n==1) return 0 (2)源代码及说明:

#include int isprime(int n) {

int i;

if(n==1) { return 0; }

第 17 页 共 17 页

for(i=2;i<=n-1;i++){ if(n%i==0){ return 0; } }

return 1; }

main() {

int r;

r = isprime(5); printf(\ r = isprime(8); printf(\}

(3)测试数据:2 4 (4)运行结果:1 0

(5)问题及解决方法:无

3、写一个函数reverse( char s[]),将字符串s[]中的字符串倒序输出。试分别用递归和非递归两种形式编写。 (1)算法描述:

递归:递归的出口:

if(n==1)

printf(\

递归的形式

printf(\ s[n-1]='\\0'; reverse(s); 非递归:

利用倒序特点,进行交换

for(i=0;i

(2)源代码及说明: 递归:

void reverse( char s[]) { int n; n=strlen(s); if(n==1) {

第 18 页 共 18 页

printf(\ return ; } printf(\ s[n-1]='\\0'; reverse(s); }

非递归:

void reverse( char s[]) { int n; int i,j; char temp; n=strlen(s); if(n==1) { printf(\ return ; } for(i=0;i

(3)测试数据: (4)运行结果:

(5)问题及解决方法:

4、写一个主函数输入测试数据(自己指定),并调用上述函数,检查函数功能的正确性。 (5)一个数如果从左到右和从右到左读,数字是相同的,则称这个数字为回文数,比如898、1221、15651都是回文数。求:既是回文数又是质数的5位十进制数有多少个?要求:回文判断和质数判断都需要通过子函数实现,输出的时候要求5个数字一行。 (1)算法描述:

用递归和非递归写出函数reverse( char s[]) 递归:递归的出口:

if(n==1)

printf(\

递归的形式

第 19 页 共 19 页

printf(\ s[n-1]='\\0'; reverse(s); 非递归:

利用倒序特点,进行交换

for(i=0;i

}

写出主函数,调用函数reverse( char s[]) (2)源代码及说明: 递归:

#include #include void reverse( char s[]) { int n; n=strlen(s); if(n==1) { printf(\ return ; } printf(\ s[n-1]='\\0'; reverse(s); }

int main() { char text[10]={'a','b','c','d','e','f','g','h','m','o'}; int i,n=10; for(i=0;i

非递归:

#include #include

第 20 页 共 20 页

void reverse( char s[]) { int n; int i,j; char temp; n=strlen(s); if(n==1) { printf(\ return ; } for(i=0;i

int main() { char text[10]={'a','b','c','d','e','f','g','h','m','o'}; int i,n=10; for(i=0;i

(3)测试数据:a b c d e f g h i j (4)运行结果:j i h g f e d c b a (5)问题及解决方法:无

5、在n个已排好序(设为从小到大)的数据(数或字符串)中查找某一个数据,如果找到了,就指出其在n个数中的位置;否则给出无该数据的信息。请用递归的方法实现二分查找来实现这一查找过程。

提示:采用二分法求解本问题的基本思路是:设数列为a1,a2,?,an,被查找的数为x,则查找首先对am(m = ( n + 1 ) / 2)进行,于是得到三种情形。 若x > am,则x只可能在区间[am + 1 , an]

第 21 页 共 21 页

若x < am,则x只可能在区间[a1 , am - 1] 若x = am,则am即为查找的数,求解结束。

从上面的分析发现,这个过程很适合用递归来实现。 (1)算法描述:

for(i=10000;i<100000;i++) { if(hw(i)) { if(isprime(i)==1) { cnt++; } } } printf(\合计:%d个\\n\}

(2)源代码及说明: #include #include int hw(int n); int isprime(int n); void main() { int i; int cnt=0; for(i=10000;i<100000;i++) { if(hw(i)) { if(isprime(i)==1) { cnt++; } } } printf(\合计:%d个\\n\}

int isprime(int n) {

int i=2; while(i<=sqrt(n)) { if(n%i==0) return 0;

第 22 页 共 22 页

i++; } return 1; }

int hw(int n) { int m=0; int t=n; while(t) { m=m*10+t; t/=10; } return m==n; }

(3)测试数据:

(4)运行结果:93个 (5)问题及解决方法:无

三、实验总结:掌握了函数中参数传递的两种方式和函数的相互调用。

实验六 指针 实验

(验证性 综合性 实验 4学时)

一、目的要求:

(1)用指针作为函数参数完成字符串的传递。 (2)掌握函数中参数传递的两种方式。 (3)编写实验报告。

二、实验内容(参考实验指导书):

(1)编写一个函数char *delk( char *sp),把sp所指向的字符串中所有的“$”字符删除,并把处理后的字符串指针返回。 (1)算法描述:

char *b=\ char *a=(char*)malloc(sizeof(b)); delk(b,a);

(2)源代码及说明: #include #include

char *delk(char *sp,char *q) { char *p=sp; while (*p!='\\0') { if (*p!='$'){

第 23 页 共 23 页

*q=*p; q++; } p++; } }

main() { char *b=\ char *a=(char*)malloc(sizeof(b)); delk(b,a); printf(\}

(3)测试数据:$abcd$efgh (4)运行结果:abcdefgh (5)问题及解决方法:无

2、写一个函数int find( char *s1, char *s2),函数find的功能是查找串s1中是否包含指定的词(s2指向),如果存在则返回第1次出现的位置,否则返回-1.约定串中的词由1个或1个以上的空格符分隔。 (1) 算法描述:

char s1[]=\ char s2[]=\ int a=find(s1,s2); (2)源代码及说明: #include #include

int find(char *s1,char *s2) { char *p=s1; char *q; int k=0; int r; while(*p!='\\0')

{ while(*p==' ')

{

p++; } q=p; while(*q!='\\0'&&*q!=' ')

{

q++; } char c=*q;

第 24 页 共 24 页

}

main() { char s1[]=\ char s2[]=\ int a=find(s1,s2); printf(\}

(3)测试数据:

char s1[]=\char s2[]=\

char s1[]=\char s2[]=”we”;

(4)运行结果:3 -1

(5)问题及解决方法:无

3、编程实现将输入的十进制整数n通过函数DtoH转换为十六进制数,并将转换结果以字符形式输出。例如:输入十进制数79,将输出十六进制数4f。 (1)算法描述:

for(int i=len-1;i>=0;i--) { printf(\ }

(2)源代码及说明: #include char trans(int n) { if(n<10)

{ return n+'0'; } else

}

if(r!=0) { return -1; }

*q='\\0';

r=strcmp(p,s2); k=k+1; if(r==0) { return k; }

p=q+1;

第 25 页 共 25 页

return 'a'+n-10; }

int DtoH(int n,char *res) { int i=0; while(n!=0)

{ res[i++]=trans(n); n=n/16; } return i; }

main() { int a=79; char q[100]; int len =DtoH(a,q); for(int i=len-1;i>=0;i--)

{ printf(\ } }

(3)测试数据:79 (4)运行结果:4f

(5)问题及解决方法:无

4、定义函数void Merge(int a[], int n, int b[], int m),参数a、b为一维数组,数组中的数据为升序排列,n和m分别为它们的元素个数。函数的功能为:将数组a和b合并为一个数组,合并后的结果存放于数组a中,要求合并后的数组a仍旧为升序排列。请编程实现,并编写main函数对其测试。 (1)算法描述:

for(i=0,j=0;i

{ if(a[i]

{

c[k]=a[i]; c[k+1]=b[j]; if(k>1)

{

if(c[k]

{

temp=c[k-1]; c[k-1]=c[k]; c[k]=temp;

第 26 页 共 26 页

} } k=k+2; }

(2)源代码及说明: #include

void Merge(int a[],int n,int b[],int m) { int k=0; int c[100]; int temp; int i,j; for(i=0,j=0;i

{ if(a[i]

{

c[k]=a[i]; c[k+1]=b[j]; if(k>1)

{

if(c[k]

{

temp=c[k-1]; c[k-1]=c[k]; c[k]=temp; } } k=k+2; } if(a[i]>b[j])

{

c[k]=b[j]; c[k+1]=a[i]; if(k>1)

{

if(c[k]

{

temp=c[k-1]; c[k-1]=c[k]; c[k]=temp; } } k=k+2; }

第 27 页 共 27 页

}

main() { int a[5]={1,4,7,9,10}; int b[5]={0,2,3,5,8}; Merge(a,5,b,5); }

(3)测试数据: int a[5]={1,4,7,9,10}; int b[5]={0,2,3,5,8};

(4)运行结果:0 1 2 3 4 5 7 8 9 10 (5)问题及解决方法:无 三、实验总结:

(1)掌握了用指针作为函数参数完成字符串的传递。 (2)掌握了函数中参数传递的两种方式。

} a=c;

for(i=0;i

实验七 字符串与指针 实验 (验证性 综合性 实验 2学时)

一、目的要求:

(1)掌握用指针进行函数参数传递的方法。

(2)掌握指针数组和二维数组间的关系以及进行参数传递时的写法。 (3)编写实验报告。

二、实验内容(参考实验指导书):

1、编写一个书名排序程序,输入10个书名存入一个二维数组,用函数void sortstring( char *name[] , int n)实现它们的字典顺序。 (1)算法描述:

sortstring(name,10);

for(a=0;a<10;a++) printf(\(2)源代码及说明: #include #include

void sortstring(char *name[],int n) { char *p;

第 28 页 共 28 页

int i,j; for(i=0;i0) { p=name[i]; name[i]=name[j]; name[j]=p; } } } main() { char *name[]={\ \ int a; sortstring(name,10); for(a=0;a<10;a++) printf(\}

(3)测试数据:

(4)运行结果:hello world start end then first follow watch see hear (5)问题及解决方法:无

2、编写函数void search( char *s1, char *s2, char *s3)。函数search()从已知的两个字符串s1与s2中找出它们都包含的最长的单词放入字符串s3,约定字符串中只有小写字母和空格字符,单词用1个或1个以上空格分隔。 (1)算法描述: (2)源代码及说明: #include #include #include

void search(char *s1, char *s2, char *s3) {

char *p;

int word,i,m,n; char a[20]; p=s1; s3[0]='\\0';

while (*p!='\\0') {

word=0; for (i=0;p[i]!='\\0';i++)

第 29 页 共 29 页

{

if (p[i]!=' '&&word==0) { word=1; m=i; }

else if (p[i]==' '&&word==1) { n=i; break; } }

if (p[i]=='\\0'&&word==1) n=i; if (word==1) {

strncpy(a,p+m,n-m); a[n-m]='\\0'; char *pfind;

if ( (pfind=strstr(s2,a))!=NULL ) {

if ( *(pfind+strlen(a))==' ' || *(pfind+strlen(a))=='\\0' ) if (strlen(a)>strlen(s3)) strcpy(s3,a); }

p=p+n; }

else break; } }

main() {

char *s1=\

char *s2=\ char s3[20]; search(s1,s2,s3); printf(\}

(3)测试数据:

(4)运行结果:name (5)问题及解决方法:无

3、编写一个主函数,测试上述两个函数的正确性。 (1)算法描述: (2)源代码及说明:

第 30 页 共 30 页

(3)测试数据: (4)运行结果:

(5)问题及解决方法:

4、输入一个字符串,内有数字和非数字字符,例如: A123cdf 456.78cpc876.9er 849.1 将其中连续的数字作为一个实数,依次存放到一数组a中。例如123存放在a[0],456.78存放在a[2],依次类推,统计共有多少个数,并输出这些数。 (1)算法描述: f(a,b); for(j=0;j<4;j++) printf(\(2)源代码及说明: #include

void f(char *sp,float b[]) { char *p; float value; int power,i=0,j=0; p=sp; while(*p) { for(;!(*p>='0'&&*p<='9');p++) value=0; for(value=0;(*p>='0'&&*p<='9');p++,i++) value=value*10+*p-'0'; if(*p=='.') p++; for(power=1;(*p>='0'&&*p<='9');p++,i++) { value=value*10+*p-'0'; power=power*10; } value=value/power; b[j++]=value; } printf(\数字个数为:%d\\n\}

void main() { int j; float b[4]={0}; char *a=\ f(a,b); for(j=0;j<4;j++)

第 31 页 共 31 页

printf(\}

(3)测试数据: (4)运行结果:16

123.00 456.78 876.90 849.18 (5)问题及解决方法:无 三、实验总结:

(1)掌握了用指针进行函数参数传递的方法。

(2)掌握了指针数组和二维数组间的关系以及进行参数传递时的写法。

实验八 结构体 实验 (验证性 综合性 实验 2学时)

一、目的要求:

(1)掌握结构体的定义、数据输入方法。 (2)掌握结构体成员变量的两种访问方法。

(3)掌握编写程序完成单链表的建立和查询方法。 (4)编写实验报告。

二、实验内容(参考实验指导书):

1、编写一个建立单链表的函数,设链表的表元素信息包含学号、姓名、一门课的成绩;写一个按照学号查学生成绩的函数;最后写一个主函数,它先调用建立函数,再调用查询函数,显示查到学生的姓名和成绩。 (1)算法描述: for(k=0;k<4;k++) { printf(\请输入学号:(1~4)\\n\scanf(\ for(j=0;j<4;j++) if(stu[j].num==i) (2)源代码及说明: #include struct student { int num; char name[20]; float score; }

stu[4]={{1,\main() { int i,j,k; for(k=0;k<4;k++) {

第 32 页 共 32 页

printf(\请输入学号:(1~4)\\n\scanf(\ for(j=0;j<4;j++) if(stu[j].num==i) printf(\ } }

(3)测试数据:

(4)运行结果: (5)问题及解决方法:无

2、编一程序,能把从终端输入的一个字符串中的小写字母全部转换成大写字母,要求输入的字符的同时指定该字符在字符串中的序号(即字符在字符串中的顺序号,例如第1个字符的序号为1),字符和序号存入结构体中,字符串存入结构体数组中,然后显示结构体数组的结果(用字符!表示输入字符串的结束)。 (1)算法描述: while(1) { scanf(\ if(s[i].a!='!') s[i].num=i+1; else break; if(s[i].a>'Z') s[i].a=s[i].a-32; printf(\ i++; }

(2)源代码及说明: #include struct str { char a; int num; } s[10]; main() {

第 33 页 共 33 页

int i=0; printf(\请输入字母,以!为结束标志\\n\ while(1) { scanf(\ if(s[i].a!='!') s[i].num=i+1; else break; if(s[i].a>'Z') s[i].a=s[i].a-32; printf(\ i++; } }

(3)测试数据:

(4)运行结果:

(5)问题及解决方法:无

3、在本实验的实验内容1的基础上,实现在链表元素index之前插入元素的操作Insert( struct node *head, int index)和删除指定位置元素的操作Delete( struct node * head, int index),并编写主函数测试。 (1)算法描述: (2)源代码及说明: #include #include #include #include struct student { char name[15]; char num[15]; char risk[15]; struct student *next; };

struct student * fun() { struct student *p,*q,*head;

第 34 页 共 34 页

q=head=NULL; char str[15]={'\\0'}; printf(\请依次输入学生的姓名,学号,成绩:(以'0'作为结束标志)\\n\ while(1) { scanf(\ if(str[0]=='0') break; p=(struct student *)malloc(sizeof(struct student)); strcpy(p->name,str); scanf(\ scanf(\ if(head==NULL) head=q=p; else { q->next=p; q=p; } } q->next=NULL; return head; }

struct student * park(struct student *head) { int i; char str[15]; struct student *p,*q; printf(\你想要删除某个学生的信息吗?是/否(1/0)\\n\ scanf(\ if(!i) return head; printf(\请输入你想要删除的学生姓名\\n\ scanf(\ for(p=head,q=NULL;p!=NULL;q=p,p=p->next) if(!strcmp(p->name,str)) break; if(p==NULL) { printf(\没有你要删除的学生的信息\\n\ return head; } else {

第 35 页 共 35 页

if(q==NULL) head=p->next; else { q->next=p->next; } free(p); } return head; }

struct student *wall(struct student *head) { int i,j,k=1; struct student *p,*q,*r; printf(\你想要添加某个学生的信息吗?是/否(1/0)\\n\ scanf(\ if(!i) return head; printf(\请输入你想要添加的学生的信息:(依次为:姓名,学号,成绩)\\n\ p=(struct student *)malloc(sizeof(struct student)); scanf(\ scanf(\ scanf(\ printf(\请输入你想要添加到的位置\\n\ scanf(\ for(q=head,r=NULL;q!=NULL;r=q,q=q->next) { if(j==1) { p->next=head; head=p; break; } if(k==j) { p->next=q; r->next=p; break; } k++; } if(q==NULL&&j==k) { q=p;

第 36 页 共 36 页

p->next=NULL; } if(q==NULL&&j>k) printf(\你的添加的位置不合法\\n\ return head; }

void prin(struct student *head) { struct student *p; for(p=head;p!=NULL;p=p->next) { printf(\ printf(\ printf(\ printf(\ } }

main() { struct student *head; head=fun(); head=wall(head); head=park(head); prin(head); }

(3)测试数据:

(4)运行结果:

(5)问题及解决方法:无 三、实验总结:

(1)掌握了结构体的定义、数据输入方法。 (2)掌握了结构体成员变量的两种访问方法。

(3)掌握了编写程序完成单链表的建立和查询方法。

实验九 文件操作 实验

第 37 页 共 37 页

(验证性 综合性 实验 1学时)

一、目的要求:

(1)掌握文件的打开和关闭。 (2)精通文件的读写操作。

(3)了解文件的定位操作及文件的检测函数。 (4)掌握文件的应用。 (5)编写实验报告。

二、实验内容(参考实验指导书):

1、编写一个程序,读取磁盘上的一个C语言程序文件,要求加上注释后再存放到磁盘上,文件可以另外命名。 (1)算法描述:

if((p=fopen(\ fscanf(p,\ fclose(p); if((p=fopen(\ { printf(\ exit(1); }

(2)源代码及说明: #include #include void main() { int i=0,j; char c,a[80]={\ FILE *p; if((p=fopen(\ fscanf(p,\ fclose(p); if((p=fopen(\ { printf(\ exit(1); } fputs(\ fprintf(p,a); fputs(\ fclose(p); }

第 38 页 共 38 页

(3)测试数据:

(4)运行结果:

(5)问题及解决方法:无

2、编写一个程序,将文件old.txt从第10行起存放到new.txt中。 (1)算法描述: while(!feof(p1)) {

if((c=fgetc(p1))=='\\n') i++; if(i>=9) {

fputc(c,p2); } }

(2)源代码及说明: #include #include void main() {

int i=0; char c;

FILE *p1,*p2;

if((p1=fopen(\ {

printf(\ exit(1); }

if((p2=fopen(\ {

printf(\ exit(1); }

while(!feof(p1)) {

if((c=fgetc(p1))=='\\n') i++; if(i>=9) {

fputc(c,p2); } }

第 39 页 共 39 页

system(\ fclose(p1); fclose(p2); }

(3)测试数据:

(4)运行结果:

(5)问题及解决方法:无

3、有一个整数文件,读取其中的数值,如果为奇数加1,如果为偶数减1,然后存放到新的文件中去。 (1)算法描述: while(!feof(p1)) {

c=fgetc(p1); if((c-'0')%2==0) i--;

else if((c-'0')%2==1) i++; }

(2)源代码及说明: #include #include void main() {

第 40 页 共 40 页

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

Top