C语言实验总答案 下载本文

实验三 选择结构程序设计

二、程序调试方法实验

上机题目:编程实现求分段函数的值。

?x2?2x?11??x?10 y??

0 其它? 找出并改正以下源程序中错误,得出正确的运行结果。

#include void main() { float x,y;

printf(\请输入x:\ scanf(\if(1<=x<10) { y=x*x-2*x+1;

printf(\

} else

{

y=0; if(x<1); printf(\ else printf(\}

}

三、编写程序

1、编写程序。从键盘输入一个整数x,如果x是偶数,输出“x是个偶数”的提示;否则,输出“x是个奇数”的提示信息。

提示:偶数的判断方法x%2 == 0

#include void main() {

int x;

printf(\请输入一个整数:\scanf(\if (x%2 == 0)

printf(\是一个偶数\\n\else

printf(\是一个奇数\\n\}

2、为鼓励居民节约用水,自来水公司采用按月用水量分段计费的办法,居民应交水费y元与月用水量x吨的函数关系式如下(设x?0)。

4x??y?f(x)??3??2.5x?10.5x?15x?15

编写程序,输入用户的月用水量x吨,计算并输出该用户应支付的水费y元(保留两位小数)。

#include void main() {

float x,y;

printf(\请输入用户的月用水量(吨):\scanf(\if (x < 0)

printf(\输入数据非法\\n\else

{

if (x > 15)

y= 2.5*x-10.5;

else

y=4*x/3;

printf(\该用户应支付的水费为%.2f元\\n\}

}

3、编写程序。从键盘输入字符ch,判断它是哪一类字符(英文字母、数字、其他字符)。 【例3-8】

#include \void main(void) {

char ch;

printf(\请输入一个字符:\ ch=getchar();

if(ch>='0'&&ch<='9')

printf(\是数字\\n\

else if(ch>='A'&&ch<='Z' || ch>='a'&&ch<='z') printf(\是字母\\n\ else

printf(\是其他字符\\n\}

4、从键盘随机输入三个英文字母,要求从小到大的顺序输出这3个字母。【例3-7】 #include void main(void) {

char a, b, c, t;

printf(\输入三个英文字符: \ scanf(\ if(b

{ t=a; a=b; b=t; } if(c

{ t=a; a=c; c=t; } if(c

{ t=b; b=c; c=t; }

printf(\}

5、判断输入的3个数是否能构成三角形,如果能构成三角形,则判断其是哪一种三角形(等边、等腰、直角或者一般)(给出的程序未区分“等腰直角三角形) #include #include main( ) {

float a,b,c; printf(\输入三角形的三条边: \ scanf(\ if(a+b>c&&abs(a-b)

if(fabs(a-b)<=1e-6 && fabs(b-c)<=1e-6)

printf(\等边三角形\\n\

else if(fabs(a-b)<=1e-6 || fabs(b-c)<=1e-6 || fabs(a-c)<=1e-6)

printf(\等腰三角形\\n \

else if(fabs(a*a+b*b-c*c)<=1e-6 || fabs(a*a+c*c-b*b) <=1e-6 ||

fabs(c*c+b*b-a*a) <=1e-6 ) printf(\直角三角形\\n\

else

printf(\普通三角形\\n \

} else

printf(\不能构成三角形\}

6、从键盘上输入直角坐标系上一个点的坐标(x,y),编程实现判断该点属于第几象限。

#include \#include \void main() {

float x,y;

printf(\请输入坐标x,y\\n\scanf(\if(x==0 || y==0) printf(\坐标轴\\n\else if(x > 0 && y > 0) printf(\第一象限\\n\else if(x < 0 && y > 0) printf(\第二象限\\n\else if(x < 0 && y < 0) printf(\第三象限\\n\else if(x > 0 && y < 0)

printf(\第四象限\\n\

}

7、输入年、月,根据输入的年月,判断该月有多少天。

1,3,5,7,8,10,12月:31天 4,6,9,11月 :30天 2月:28/29天

提示:判断闰年的条件,年份能被4整除但不能被100整除,或者能被400整除。

#include \void main() {

int year, month;

printf(\请输入年月(yyyydd)\

scanf(\

switch(month) {

case 2:

if (year%4==0 && year0 !=0 || year@0==0)

printf(\年%d月有29天\\n\else

printf(\年%d月有28天\\n\ break ; case 1: case 3: case 5: case 7: case 8: case 10: case 12:

printf(\年%d月有31天\\n\ break; case 4: case 6: case 9: case 11:

printf(\年%d月有30天\\n\ break ; default:

printf(\输入的月份%d有误\\n\break;

} }

8、编程实现:输入一个不多于5位的正整数,要求:(1)输出它是几位数,(2)按逆序输出各位数字,如原数为321,则应输出123。 #include \void main() {

int number; //保存输入的整数

int bits = 0; //整数有几位,初值为0 int bit;

printf(\请输入一个不超过5位的正整数:\scanf(\

if(number>=100000 || number < 0) printf(\输入的数字非法\\n\else

{

if(number >= 10000)

bits = 5;

else if(number >= 1000) bits = 4;

else if(number >= 100) bits = 3;

else if(number >= 10) bits = 2; else

bits = 1;

printf(\位数\\n\

switch(bits) {

case 5:

bit = number % 10; number = number/10; printf(\case 4:

bit = number ; number = number/10; printf(\case 3:

bit = number ; number = number/10; printf(\case 2:

bit = number ; number = number/10;

}

printf(\ case 1:

bit = number;

printf(\ } }

实验四 循环结构程序设计参考程序

一、程序调试方法实验

xx2xn???求ex的近似值。找出并改正以下源程序中错误,上机题目:编写程序利用公式:e?1??1!2!n!得出正确的运行结果。

#include void main() {

int i;

float a,e,x;

printf(\请输入x的值:\

scanf(\改为 scanf(\ e=0; //改为 e=1; i=0; //改为 i=1; a=1;

while(a>1e-6); //去掉尾部的分号 {

a=a*x/i; e=e+a; i++; }

printf(\循环次数为:%d次,e的%d次方为:%f\\n\

//改为printf(\循环次数为:%d次,e的%.2f次方为:%f\\n\

}

程序正确的运行结果为:

请输入x的值:1.0

循环次数为:11次,e的1.00次方为:2.718282 Press any key to continue

二、编写程序

1、分别利用三种循环语句编程,求1+2+3+?50之和。参照例子4-12 (1)while循环 #include

void main() {

int sum=0,i=1; while(i<=50) {

sum=sum+i; i++; }

printf(\}

(2)do~while循环

#include void main() {

int sum=0,i=1; do {

sum=sum+i; i++; }

while(i<=50);

printf(\}

(3)for循环

#include void main() {

int sum=0,i;

for(i=1;i<=50;i++) sum=sum+i;

printf(\}

2、编程,输入10个整数,求其中正数的个数及其平均值(精确到小数点后两位)。 #include void main() {

float sum=0;

int i,a,count=0;

printf(\请输入10个整数:\for(i=1;i<=10;i++) {

scanf(\ if(a>0) {

count++; sum=sum+a; } }

printf(\整数个数为%d 平均值为%.2f\\n\}

3、编程实现:输入一个不多于5位的整数,要求按逆序输出各位数字,如原数为321,则应输出123。参照例子4-6

#include void main(void) {

int number, count = 0;

printf(\ scanf(\

if (number<0) number = -number; do {

printf(\ count++;

number = number/10; }while( number!=0 );

printf(\}

4、编写一个程序,求两个整数的最小公倍数。参照例子4-4

提示:可以参考“最大公约数”的求法,从两个数中较大的一个出发,找到的第一个能被这两个数整除的数,就是最小公倍数。 #include void main() {

int k, m, n;

printf(\请输入2个整数: \ scanf(\ k = m>n? m : n;

while(k%m!=0 || k%n!=0) k++;

printf(\最小公倍数: %d\\n\}

5、统计输入的一串字符中每个元音字母(a,e,i,o,u)出现的次数,当输入#时结束。参照例子5-3 #include void main() {

char c;

}

int a=0,e=0,i=0,o=0,u=0; printf(\请输入一串字符以#结束:\c=getchar(); while(c!='#') {

switch(c) {

case 'a': a++; break; case 'e': e++; break; case 'i': i++; break; case 'o': o++; break; case 'u': u++; break; }

c=getchar(); }

printf(\元音字母a的个数为%d\\n\printf(\元音字母e的个数为%d\\n\printf(\元音字母i的个数为%d\\n\printf(\元音字母o的个数为%d\\n\printf(\元音字母u的个数为%d\\n\

也可以将while循环改写(对比两种方法的异同): #include void main() {

char c;

int a=0,e=0,i=0,o=0,u=0;

printf(\请输入一串字符以#结束:\while((c=getchar())!='#') {

switch(c) {

case 'a': a++; break; case 'e': e++; break; case 'i': i++; break; case 'o': o++; break; case 'u': u++; break; } }

printf(\元音字母a的个数为%d\\n\printf(\元音字母e的个数为%d\\n\printf(\元音字母i的个数为%d\\n\

printf(\元音字母o的个数为%d\\n\ printf(\元音字母u的个数为%d\\n\}

6、输出100~200间的全部素数。参照例子4-16 #include void main() {

int n,i;

for(n=100;n<=200;n++) {

for(i=2;i<=n-1;i++) if(n%i==0)break; if(i>n-1)

printf(\ }

printf(\}

7、求n!,其中,n为用户输入的任何整数。(n<=50,具体值由用户输入)。 #include void main() {

int i,n;

double fac=1.0; /* 计算阶乘是一个很大的数,可能超出int范围*/ printf(\请输入一个不大于50的整数N:\scanf(\for(i=1;i<=n;i++) fac=fac*i;

printf(\的阶乘为%.0f\\n\/* 输出结果无小数*/ }

8、求

?n!,即求1!+2!+…+19!+20!

n?120#include void main() {

int i;

double sum=0, jc=1; for(i=1;i<=20;i++) {

jc=jc*i; sum=sum+jc; }

printf(\}

9、编写程序,找出1~999之间的全部同构数。同构数是这样的数,它出现在它的平方数的右边,例如:5是25的右边的数,25是625右边的数,5和25都是同构数。

提示:如何验证m是n右边的数,

若m是个位数,则判断若n-m能整除10,则m是n右边的数; 若m是十位数,则判断若n-m能整除100,则m是n右边的数; 若m是百位数,则判断若n-m能整除1000,则m是n右边的数; #include main() {

int m, n; }

printf(\间的同构数包括:\for( m=1; m<1000; m++) {

n = m*m;

if (m < 10 && (n-m) == 0) printf(\

else if (m<100 && (n-m)0 == 0) printf(\ else if((n-m)00 == 0) printf(\}

printf(\

10、输出所有大于1000小于10000的4位偶数,且该偶数的各位数字两两不相同。

提示:对数n将其分别获得它的个位、十位、百位和千位,然后判断它们是否两两不相同。 #include main() {

int i, m, n, p, q;

for(i=1000; i<10000; i=i+2) {

m = i/1000;

n = i00/100; p = i0/10; q = i;

if ( m!=n && m!=p && m!=q && n!=p && n!=q && p!=q) printf(\ }

printf(\}

11、分别编程输出如图所示的结果:

(1)

#include void main() {

int i,j;

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

for(j=1;j<=9;j++)

printf(\ printf(\ } }

(2)

#include void main() {

int i,j;

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

for(j=1;j<=i;j++) printf(\ printf(\ } }

(3)

#include void main() {

int i,j;

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

for(j=1;j<=10-i;j++) printf(\ printf(\ }

}

实验五 数据类型和表达式——参考程序

一、程序调试方法实验

1.以下程序功能为:华氏温度F与摄氏温度C的转换,转换公式为:F=32+9/5*C,找出并改正以下源程序中错误,得出正确的运行结果。 源程序如下:

#include void main() { double f,c; scanf(\ //改为 scanf(\ f = 32+9/5*c; printf(\}

2.以下程序功能为:统计分数,分别计算及格人数和不及格人数,输入非法分数时退出。找出并改正以下源程序中错误,得出正确的运行结果。 源程序如下: #include

void main() { int count1,count2,n; //改为 int count1=0,count2=0,n; scanf(\ //改为 scanf(\ while (0<=n<=100) //改为 while (0<=n && n<=100) { if(60<=n<=100) //改为 if(60<=n && n<=100) count1=+1; //改为 count1+=1; else count2+=1;

scanf(\ //读入下一个数

} printf(\

}

三、编写程序

1、输入一串字符,统计其中字母、数字和空格的个数,当输入回车时输入结束。 #include void main() {

char c;

int sz=0,zm=0,kg=0;

printf(\请输入一串字符回车结束:\c=getchar(); while(c!='\\n') {

if(c>='a' && c<='z' || c>='A' && c<='Z') zm++;

else if(c>='0' && c<='9') sz++;

else if(c==' ') kg++; c=getchar(); }

printf(\字母的个数为%d\\n\ printf(\数字的个数为%d\\n\ printf(\空格的个数为%d\\n\}

2、求s=a+aa+aaa+aaaa+aaaa+aa?a,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。 #include void main() {

int a,n,i,sum,item;

printf(\请输入s=a+aa+aaa+aaaa+aaaa+aa?a中a的值:\scanf(\

printf(\请输入s=a+aa+aaa+aaaa+aaaa+aa?a中累加项的个数:\ scanf(\ sum=a; item=a;

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

item=item*10+a; sum=sum+item; }

printf(\?的前%d项之和为:%d\\n\}

3、一个数恰好等于它的因子之和,这个数就称为“完数”,例如6=1+2+3。编程找出1000以内的所有完数。参照例子4-5。 #include void main() {

int m,i,sum;

printf(\以内的完数有:\for(m=1;m<=1000;m++)

}

{

sum=0;

for(i=1;i

if(m%i==0) sum=sum+i; }

if(m==sum)

printf(\}

printf(\

4、36 块砖,36 人搬。男搬4,女搬3,两个小儿抬一砖。要求一次全搬完。问需男、女、小儿各若干?(穷举法)。 #include void main() {

int x,y,z,n=0; }

printf(\序号 男 女 小儿\\n\for(x=0; x<=9; x++)

for(y=0; y<=12; y++) {

z=36-x-y;

if(8*x+6*y+z==72 )

printf(\ }

实验6 数组

【实验目的】

1. 熟练掌握使用数组编程的方法。 2. 熟练掌握排序算法。

3. 熟练掌握字符串的存储和操作方法。

【实验内容】 一、一维数组实验

1. 以下程序功能为:输入一个正整数n,再输入n个整数,将它们排序后由小到大输出。找出并改正以下源程序中错误,得出正确的运行结果。

源程序(有错误的程序) #include void main()

{

int i,j,num,a[num]; int change,t;

printf(\scanf(\printf(\for(i=0;i

for(i=num-1,change=1;i>0 && change;i--) { change=0; for(j=0;j<=i;j++) if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; /*调试时设置断点*/ a[j+1]=t; change=1; }

}

printf(\ /*调试时设置断点*/ for(i=0;i

}

运行结果(改正后程序的运行结果) Enter Number:6

Enter Data:23 77 14 89 6 68 Sorted data:6 14 23 68 77 89

说明:

程序编译时出现的错误信息是指定义数组a时,数组长度必须是常量,把a[num]改为a[50]即可,重新编译连接没有错误,但是输出结果有误。为了找出程序的问题,关闭运行窗口,准备调试程序。

调试程序的步骤:

(1)设置断点:设置2个断点,具体位置见源程序的注释。

在当前光标所在行

设置或取消断点

(2)点击调试工具栏上的察数组a中的数据正确。

变量 值显示

(3)继续点击

(Go)按钮,输入2个数据:22 ,11;程序运行到第一个断点处停止。观

调试工具栏,可以进行单步执行,终止调试等操作 (Go)按钮,观察a中数据是否正确,直到程序运行到第二个断点:a[1]中的数据有

问题,为什么呢?本来数组真正存储了2个元素,但是后面交换的时a中第2个元素交换了a中的第3个元素,而a中第3个元素是一个随机值,所以结果不正确了。

(4)找出问题后,点击调试工具栏

(Stop Debugging)按钮停止调试,把程序中的“j<=i”改为“j

后,重新编译并运行程序,得到正确结果。

2. 编程:输入长度为10的整型数组并输出;然后将其逆序存放后再输出。例如: Input 10 number: 0 1 2 3 4 5 6 7 8 9 After reversed: 9 8 7 6 5 4 3 2 1 0

3. 编程:输入n个(1

Input n: 5

Input 5 integer: 8 2 5 1 4 max=8 index=0 min=1 index=3 average=4

4. 编程:青年歌手参加歌曲大奖赛,有10个评委对她(他)进行打分,试编程求这位选手的平均得分并输出(去掉一个最高分和一个最低分)。

5. 编程:用两种方法输出斐波那切数列的前40项(参考例6-4)。 要求: (1)方法1:不使用数组; (2)方法2:使用一维数组。

6. 编程:输入n个(1

Input n: 5

Input 5 number: 8.5 2.3 5.1 1.4 4.9 After sorted: 8.50 5.10 4.90 2.30 1.40

7. 在已经排好序的数组(长度不足10)中插入一个数m(键盘输入)后输出,保持数组的降序排列。 提示:已经排好序的数组(长度不足10)可以直接在程序中赋值,而不必从键盘输入。

二、二维数组实验

1. 以下程序功能为:将下列矩阵中的元素向右移动一列,最后一列移至第一列。找出并改正以下源程序中错误,通过调试得出正确的运行结果。

1 4 6 8 10 12

源程序(有错误的程序) #include #define ROW 2 #define COL 3

int main() {

int a[ROW][COL]={1,4,6,8,10,12}; int i,j,temp;

for(i=0;i=0;j--) { a[i][j]=a[i][j+1]; /*调试时设置断点*/ } a[i][0]=temp; /*调试时设置断点*/ }

for(int i=0;i

return 0; }

运行结果(改正后程序的运行结果) 6 1 4 12 8 10

2. 编程:利用二维数组计算并打印一个n行的杨辉三角。例如: Input n: 6 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1

1 5 10 10 5 1

提示:第一列及对角线上的元素都是1,其他元素通过计算得出:

如果用i表示行,j表示列,则第i行j列的元素

pi,j?pi?1,j?1?pi?1,j

3. 编程:通过键盘输入3行4列的二维数组,分别按行和按列输出数组。例如: Input numner: 1 2 3 4 5 6 7 8 9 10 11 0

output by row: 1 2 3 4 5 6 7 8 9 10 11 0 output by col: 1 5 9 2 6 10 3 7 11 4 8 0

4. 编程:输入一个m*n矩阵,求他们的各行元素之和。例如: Input m , n: 2 2 Input 2*2 matrix: 4 5 5 6 sum[0]=9 sum[1]=11

5. 编程:判断一个二维数组是否存在鞍点,若存在,则输出鞍点及其行号和列号;否则输出没有鞍点信息。“鞍点”是指这样的元素:它在本行是最大元素,而在本列是最小的元素。 Input m , n: 2 2

Input 2*2 matrix: 4 5 5 6

i=0, j=1, saddle point: 5

提示:找鞍点需要处理三件事情:(1)找每行中最大值所在的列下标;(2)判断该元素在本列上是否为最小;(3)判断是否找到了鞍点,若找到,输出。

三、字符串实验

1. 以下程序功能为:输入一个字符串,将其逆序输出。找出并改正以下源程序中错误,通过调试得出正确的运行结果。

源代码(有错误的程序) #include #include void main() { int i,j; char s[80],result[80];

printf(\ gets(s); for(i=strlen(s)-1,j=0;i>=0;i--,j++) { result[j]=s[i]; } printf(\ puts(result); }

运行结果(改正后的程序) Enter a string : asdfg

This is the reverse string: gfdsa

2. 编程:任意输一个字符串保存在一维字符数组中,求其长度(不用strlen函数)。例如: Input a string: aadfdg length=6

提示:字符串的有效长度就是有效字符的个数,即数组中第一个‘\\0’前面的字符个数。

3. 编程:任意输入两个字符串分别保存在一维字符数组中,把第二个字符串连接到第一个字符串末尾(不用strcat函数)。例如:

Input two string:

asdfg erty

after strcat: asdfgerty

4. 编程:从键盘读入两个字符串分别保存在一维字符数中,比较两个字符串大小(不用strcmp函数),输出较大的字符串。

5. 编程:任意输入一个字符串保存在一维字符数组中,判断里面数字字符的个数。例如: Input a string: adg4521gadg4adg number: 5

6. 编程:从一个字符串中删除从某个特定字符开始的所有字符。例如原字符串为\,特定字符为'd',删除后的字符串为\。

7. 编程:编写程序,从一个输入的字符串中抽取一部分(从第n个字符开始,抽取m个字符)构成一个新的字符串,并输出。要求:n和m都由用户输入。

8. 编程:利用字符串库函数puts, gets, strcat, strcmp, strcpy, strlen完成下述操作: 提示:字符串库函数strcat, strcmp, strcpy, strlen在教材212页有介绍。

? 读入三个字符串str1,str2,str3 ? 输出这三个字符串

? 分别求出这三个字符串的长度; ? 比较str1和str2的大小;

? 将str2连接到str1之后,并输出连接后的str1; ? 复制str3到str1,并输出复制操作后的str1;

选作题:

输入一个小写字母组成的英文句子,统计该句子有几个英文单词,并统计每个字母出现的次数,并将句子中每个单词的首字母大写后输出。

如:输入: this is a cat!

输出: 4个单词;

每个字母出现次数t:2 h:1 i:2 s:2 a:2 c:1 This Is A Cat!

实验6 数组

一、一维数组实验

2. 编程:输入长度为10的整型数组并输出;然后将其逆序存放后再输出。例如: Input 10 number: 0 1 2 3 4 5 6 7 8 9 After reversed: 9 8 7 6 5 4 3 2 1 0 #include void main() {

int i, j, a[10], t;

printf(\

for(i=0; i<10; i++) /*读入数据*/ scanf(\

printf(\

for(i=0; i<10; i++) /*输出原始数据*/ printf(\

printf(\

for(i=0,j=9; i

t=a[i]; a[i]=a[j]; a[j]= t; }

printf(\输出逆序存放后的数据*/ for(i=0; i<10; i++) printf(\

printf(\

}

3. 编程:输入n个(1

Input n: 5

Input 5 integer: 8 2 5 1 4 max=8 index=0 min=1 index=3 average=4

#include void main() {

int i, n , max, min, a[10], sum; float average;

printf(\ scanf(\

if(1

printf(\输入数据并求累加和*/ for(i=0, sum=0; i

scanf(\ sum+=a[i]; }

average=(float)sum/n; /*求出平均值*/

for(i=0, max=0, min=0; i

if(a[i] > a[max]) max= i;

if(a[i] < a[min]) min= i; }

printf(\ printf(\ printf(\} else

printf(\数据超出范围\

}

4. 编程:青年歌手参加歌曲大奖赛,有10个评委对她(他)进行打分,试编程求这位选手的平均得

分并输出(去掉一个最高分和一个最低分)。

#include

void main() {

int i, max, min; float a[10], ave;

printf(\请输入10个评委的打分:\

for(i=0, ave=0; i<10; i++) /*输入分数并求累加和*/ {

scanf(\ ave+=a[i]; }

for(i=0, max=0 , min=0; i<10; i++) /*求最大、最小值的下标*/ {

if(a[i]>a[max]) max=i;

if(a[i]

ave=ave-a[max]-a[min]; ave=ave/8;

printf(\该选手的评委打分是:\for(i=0; i<10; i++)

printf(\printf(\

printf(\去掉最高分%.2f,去掉最低分%.2f,该选手的平均得分是%.2f\\n\

a[min], ave);

}

5. 编程:用两种方法输出斐波那切数列的前40项(参考例6-4)。 要求: (1)方法1:不使用数组; #include void main() {

int f1=1, f2=1, f3, i;

printf(\ for(i=3; i<=40; i++) {

}

}

f3=f1+f2;

printf(\if(i%5==0)

printf(\f1= f2; f2= f3;

(2)方法2:使用一维数组。 #include void main() {

int i;

int fib[40];

fib[0]=fib[1]=1; }

6. 编程:输入n个(1

Input n: 5

Input 5 number: 8.5 2.3 5.1 1.4 4.9 After sorted: 8.50 5.10 4.90 2.30 1.40 #include void main() {

int i, j, n; float a[10], t;

printf(\ scanf(\

if(n>1 && n<=10) {

for(i=2; i<40; i++) /*计算其余的38个数*/ fib[i]= fib[i-1] + fib[i-2]; for(i=0; i<40; i++) {

printf(\ if((i+1)%5==0) printf(\}

printf(\for(i=0;i

scanf(\

printf(\输出排序前的数据*/ for(i=0; i

printf(\printf(\

for(i=0; i

t=a[j];

a[j]=a[j+1]; a[j+1]=t; }

printf(\输出排序结果*/ for(i=0; i

printf(\ printf(\} else

printf(\数据超出范围\

}

7. 在上题基础上(输入n个float型的数据并保存到数组中,用冒泡法或选择法将它们从大到小排序后输出)完成:在已经排好序的数组(长度不足10)中插入一个数m(键盘输入)后输出,保持数组的降序排列。

程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。

#include void main() {

int i, j, n, p; float a[10], t, m;

printf(\ scanf(\

if(n>1 && n<=10) {

printf(\ for(i=0; i

scanf(\

printf(\输出排序前的数据*/ for(i=0; i

printf(\printf(\

for(i=0; i

t=a[j];

a[j]=a[j+1]; a[j+1]=t; }

printf(\输出排序结果*/ for(i=0; i

printf(\printf(\

printf(\请输入要插入的数据m: \ scanf(\

/*找到插入位置*/

if(m < a[n-1]) /*如果m比最后一个元素小,则直接插入到最后的位置*/ p = n; else {

for(i=0; i a[i]) {

p=i; break; }

for(i=n; i>=p+1; i--) /*将插入位置之后的元素后移*/ a[i]=a[i-1]; }

}

/*插入*/

a[p]=m;

printf(\插入%.2f 后:\输出插入后结果*/ for(i=0; i

printf(\printf(\

else

printf(\数据超出范围\

}

二、二维数组实验

1. 以下程序功能为:将下列矩阵中的元素向右移动一列,最后一列移至第一列。找出并改正以下源程序中错误,通过调试得出正确的运行结果。

1 4 6 8 10 12

源程序(有错误的程序) #include #define ROW 2 #define COL 3

int main() {

int a[ROW][COL]={1,4,6,8,10,12}; int i,j,temp;

for(i=0;i=0;j--) { a[i][j]=a[i][j+1]; /*调试时设置断点*/ //改为a[i][j+1]=a[i][j]; } a[i][0]=temp; /*调试时设置断点*/ } for(int i=0;i

return 0; }

运行结果(改正后程序的运行结果) 6 1 4 12 8 10

2. 编程:利用二维数组计算并打印一个n行的杨辉三角。例如: Input n: 6 1 1 1 1 2 1 1 3 3 1

1 4 6 4 1

1 4 10 10 5 1

提示:第一列及对角线上的元素都是1,其他元素通过计算得出:

如果用i表示行,j表示列,则第i行j列的元素

#include void main() { }

3. 编程:通过键盘输入3行4列的二维数组,分别按行和按列输出数组。例如: Input numner: 1 2 3 4 5 6 7 8 9 10 11 0

output by row: 1 2 3 4 5 6 7 8 9 10 11 0 output by col: 1 5 9 2 6 10 3 7 11 4 8 0

int a[10][10]={0}; //设最多10层 int i, j, n;

printf(\请输入杨辉三角形的层数:\scanf(\if(n>10) {

printf(\层数超出范围\ return; }

for(i=0;i

a[i][0]=1; a[i][i]=1; }

for(i=2;i

a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i

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

printf(\

printf(\}

pi,j?pi?1,j?1?pi?1,j

#include void main() {

int a[3][4],i,j; }

4. 编程:输入一个m*n矩阵,求他们的各行元素之和。例如: Input m , n: 2 2 Input 2*2 matrix: 4 5 5 6 sum[0]=9 sum[1]=11

提示:设计一个一维数组 int s[10],分别保存各行元素之和。

#include void main() {

int a[10][10], s[10]={0}; //设定矩阵最大为10 x 10 int m, n, i, j;

printf(\请输入矩阵的行数和列数:\scanf(\

if(m<0 || m>10 || n<0 || n>10) {

printf(\行或列(1~10)值超出范围\ return; }

printf(\请输入 3 X 4 整数矩阵:\\n\for(i=0; i<3; i++) for(j=0; j<4; j++)

scanf(\printf(\按行输出:\for(i=0; i<3; i++) for(j=0; j<4; j++)

printf(\printf(\

printf(\按列输出:\for(i=0; i<4; i++) for(j=0; j<3; j++)

printf(\

printf(\

}

printf(\请输入 %d*%d 矩阵:\\n\for(i=0; i

scanf(\

//求各行之和并输出 for(i=0; i

for(j=0; j

printf(\}

5. 编程:判断一个二维数组是否存在鞍点,若存在,则输出鞍点及其行号和列号;否则输出没有鞍点信息。“鞍点”是指这样的元素:它在本行是最大元素,而在本列是最小的元素。 Input m , n: 2 2

Input 2*2 matrix: 4 5 5 6

i=0, j=1, saddle point: 5

提示:找鞍点需要处理三件事情:(1)找每行中最大值所在的列下标;(2)判断该元素在本列上是否为最小;(3)判断是否找到了鞍点,若找到,输出。

#include void main() {

int a[10][10]; //设定矩阵最大为10 x 10 int m, n, i, j, col, flag=0; printf(\请输入矩阵的行数和列数:\scanf(\

if(m<0 || m>10 || n<0 || n>10) {

printf(\行或列(1~10)值超出范围\

return; //退出程序 }

printf(\请输入 %d*%d 矩阵:\\n\for(i=0; i

scanf(\for(i=0; i

col=0; //找出第i行中的最大值所在列下标col for(j=1; j

}

if(a[i][col]

for(j=0; ja[j][col]) break;

if(j==m) {

flag=1; //有鞍点

printf(\ } }

if(flag==0)

printf(\

三、字符串实验

1. 以下程序功能为:输入一个字符串,将其逆序输出。找出并改正以下源程序中错误,通过调试得出正确的运行结果。

源代码(有错误的程序) #include #include void main() { int i,j; char s[80],result[80]; printf(\ gets(s); for(i=strlen(s)-1,j=0;i>=0;i--,j++) { result[j]=s[i]; } result[j]='\\0'; //必须给字符串加上串结束标志 printf(\ puts(result); }

运行结果(改正后的程序) Enter a string : asdfg

This is the reverse string: gfdsa

2. 编程:任意输一个字符串保存在一维字符数组中,求其长度(不用strlen函数)。例如: Input a string: aadfdg length=6

提示:字符串的有效长度就是有效字符的个数,即数组中第一个‘\\0’前面的字符个数。

#include void main() {

int i, len=0; char s[80];

printf(\请输入字符串,以回车键结束:\gets(s);

for(i=0; s[i]!='\\0'; i++) len++;

printf(\字符串%s的长度为:%d\\n\}

3. 编程:任意输入两个字符串分别保存在一维字符数组中,把第二个字符串连接到第一个字符串末尾(不用strcat函数)。例如:

Input two string:

asdfg erty

after strcat: asdfgerty

#include void main() {

int i,j;

char s1[80], s2[80];

printf(\请输入字符串1以回车键结束:\\n\gets(s1);

printf(\请输入字符串2以回车键结束:\\n\gets(s2);

for(i=0; s1[i]!='\\0'; i++) ; /* 定位第一个字符串的结束标志*/ for(j=0; s2[j] && i<80; i++, j++ ) /*将s2接到s1后*/ s1[i]=s2[j];

s1[i]='\\0';

printf(\两个串连接后:%s\\n\}

4. 编程:从键盘读入两个字符串分别保存在一维字符数中,比较两个字符串大小(不用strcmp函数),输出较大的字符串。

#include void main() {

int i;

char a[80], b[80];

printf(\请输入字符串1以回车键结束:\\n\

gets(a);

printf(\请输入字符串2以回车键结束:\\n\gets(b);

//逐个比较直到两个字符不同或其中一个字符串结束 for(i=0; a[i] && b[i] ; i++) {

if(a[i]!=b[i]) break; }

if (a[i]>b[i])

printf(\第一个字符串%s大!\\n\else if (a[i]==b[i])

printf(\两字符串相同!\\n\else

printf(\第二个字符串%s大!\\n\

}

5. 编程:任意输入一个字符串保存在一维字符数组中,判断里面数字字符的个数。例如: Input a string: adg4521gadg4adg number: 5

#include void main() {

int i, n=0; char s[80];

printf(\请输入一个字符串以回车键结束:\\n\gets(s);

for(i=0 ; s[i]; i++)

if(s[i]>='0' && s[i]<='9') n++;

printf(\字符串中包含的数字个数为:%d\\n\}

6. 编程:从一个字符串中删除从某个特定字符开始的所有字符。例如原字符串为\,特定字符为'd',删除后的字符串为\。

#include void main() {

int i, flag=0; char c, s[80];

printf(\请输入一个字符串以回车键结束:\\n\gets(s);

printf(\请输入特定字符:\c=getchar();

for(i=0 ; s[i]; i++) if(s[i]==c) {

s[i]='\\0'; flag=1; break; } if(flag==0)

printf(\输入字符中没有特定字符!\\n\ else

puts(s); }

7. 编程:编写程序,从一个输入的字符串中抽取一部分(从第n个字符开始,抽取m个字符)构成一个新的字符串,并输出。要求:n和m都由用户输入。

#include #include void main() {

unsigned int i, j, m, n; char s1[80], s2[80];

printf(\请输入一个字符串以回车键结束:\\n\gets(s1);

printf(\请输入子串的起始位置和长度:\scanf(\

if( n>0 && n<=strlen(s1) ) {

if (m>0 && n+m <= strlen(s1)+1 ) {

for(i=n-1,j=0; s1[i] && i< n+m-1 ; i++, j++) s2[j]=s1[i];

s2[j]='\\0'; puts(s2); } else

printf(\长度超出范围!\\n\} else

}

printf(\起始位置超出范围!\\n\

8. 编程:利用字符串库函数puts, gets, strcat, strcmp, strcpy, strlen完成下述操作:

? 读入三个字符串str1,str2,str3 ? 输出这三个字符串

? 分别求出这三个字符串的长度; ? 比较str1和str2的大小;

? 将str2连接到str1之后,并输出连接后的str1; ? 复制str3到str1,并输出复制操作后的str1; #include #include void main() {

char str1[80], str2[80], str3[80];

printf(\请输入字符串str1以回车键结束:\\n\gets(str1);

printf(\请输入字符串str2以回车键结束:\\n\gets(str2);

printf(\请输入字符串str3以回车键结束:\\n\gets(str3);

printf(\三个字符串分别是:\\n\printf(\printf(\printf(\

printf(\三个字符串的长度分别是:\\n\

printf(\printf(\printf(\if(strcmp(str1, str2)>0)

printf(\字符串str1大于str2\\n\else if(strcmp(str1, str2)==0) printf(\字符串str1等于str2\\n\else

printf(\字符串str1小于str2\\n\

strcat(str1,str2);

printf(\连接到str1之后: %s\\n\strcpy(str1,str3);

printf(\复制str3到str1: %s\\n\}

选作题:

输入一个小写字母组成的英文句子,统计该句子有几个英文单词,并统计每个字母出现的次数,并将句子中每个单词的首字母大写后输出。

如:输入: this is a cat!

输出: 4个单词;

每个字母出现次数t:2 h:1 i:2 s:2 a:2 c:1 This Is A Cat!

#include void main() {

char s[80];

1

{

j=s[i]-'a'; // 计算该字母在26个字母中的序号 count[j]++; }

{

wordnum++; //单词个数增加1 s[i]=s[i]-32; //小写换大写 flag=0; }

else if(s[i]==' ' && s[i+1]>='a' && s[i+1]<='z')

flag=1;

//当前是空格,但下一个字符是字母,则该字母一定是单词的起始字母flag=1。 //即判断一个单词的起始字符,单词间用空格区分,这里考虑了单词间多个空格的情

}

printf(\句子中有%d个单词;\\n\printf(\每个字母出现的次数:\for(i=0; i<26; i++)

if(i==0 && s[i]!=' ' || flag==1) //句首单词及每个单词第一个字母的处int count[26]={0}; //与26个字母对应,统计各个字母出现的次数 int i, j, wordnum=0, flag=0;

printf(\请输入一个英文句子(小写字母)以回车键结束:\gets(s);

for(i=0; s[i]; i++) {

if(s[i]>='a' && s[i]<='z') //逐个字母判断,使其对应的出现次数增加

{

if(count[i]!=0)

printf(\}

printf(\

printf(\每个单词首字母大写后:\ puts(s); }

实验七 函数——参考程序

一、程序调试方法实验

1.找出并改正以下源程序中错误,得出正确的运行结果。 源程序如下:

#include

//函数声明 int add(int a, int b); void main() { int a,b; scanf(\ printf(\ }

void add(int a,b) //改为int add(int a, int b) { return a+b; }

2.找出并改正以下源程序中错误,得出正确的运行结果,其中max函数的功能是得到数组中最大元素的值。 源程序如下:

#include

#define N 10; //去掉尾部分号 float max(float a[], int n) //尾部加上分号 void main() { float data[N]; int i; for(i=0;i

float max(float a[], int n) { int i,result; //改为 int i;

float result; //增加result=a[0]; for(i=0;i result) result = a[i]; } return result; }

3.找出并改正以下源程序中错误,得出正确的运行结果,其中

converse函数的功能是逆序输出

n个字符。

解题思路:已知字符串的长度,逆序输出字符串 如果只有1个字符,直接输出该字符后结束

否则:输出后面的所有字符之后,再输出该字符

源程序如下: #include

void main() { int i=5; void converse(int n); printf(\ converse(i); printf(\ }

void converse(n); //改为void converse(int n) 并去掉分号 { char next; if(n>=1) //改为 if(n= =1) { next=getchar(); putchar(next); } else { next=getchar(); converse(n-1); putchar(next);

}

}

四、编写程序

1、编写一个函数,其功能是判断形式参数是否为小写字母,若是,返回其对应的大写字母,否则返回原字符。然后在main函数中输入一个字符,调用该函数得到其大写字母并输出

#include char isLow(char ch) {

if(ch >= 'a' && ch <= 'z') return ch - 32; else

return ch; }

void main(void) {

char ch;

printf(\请输入一个字符:\\n\ scanf(\

printf(\}

2、编写函数reverse(int number),它的功能是将number逆序输出,在main函数中输入一个整数,调用该函数得到逆序的数并输出。例如reverse(11233)的返回值为33211。

#include int reverse(int n) {

int rev=0,num;

do {

num=n ;

rev = rev*10 + num; n=n/10; }while(n); return rev; }

void main(void) {

int num,revnum;

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

revnum = reverse(num);

printf(\逆序后整数为:%d\\n\}

3、编写函数完成如下功能:将长整型数中数字为偶数的数依次取出,构成一个新数返回,例如,当s中的数为:87653142时,则返回的数为:8642。

提示:依次取出长整型数的每一位数字,如果是偶数,则放入新数中。在main函数中输入一个长整型数,调用该函数得到新的数,并输出结果。

#include \long func(long s); void main() {

long a;

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

printf(\}

long func(long n) {

long result=0;

int num, weight=1 ; // weight表示数位的权值(即个、十、百,。。。。)

while ( n != 0 ) {

num = n; //得到最低位 if (num % 2==0) {

result= num * weight + result; //重新组织成新的数 weight=weight * 10; }

n/=10; //去掉最低位 }

return (result); }

4、编写一个函数sort,实现数组元素的升序(或降序)排列。在main函数中输入数组元素,调用该函数进行排序,最后输出排序后的结果。

#include #define N 10

void sort(float a[], int n) //无返回值,在原数组上排序并带回 {

int i,j; float temp;

for(i=0;ia[j]) {

temp = a[i]; a[i] = a[j]; a[j] = temp; } }

void main(void) {

float a[N]; int i;

printf(\请输入%d个数值:\\n\ for(i=0;i

scanf(\

sort(a, N);

printf(\升序排序后的数组为:\\n\ for(i=0;i

printf(\ printf(”\\n”); }

5、编写函数求出二维整型数组中元素的最大值及其下标号。

提示:这里至少需要返回二维数组元素的行,列两个值,而函数只能返回1个值(无法返回2个值),所以只能通过数组作为参数的方法将值带回来。在main函数中输入一个二维整型数组,调用该函数得到最大值所在的下标,并输出最大值及其下标号。

#include

void max_value(int array[][4], int index[])

//没有返回值的函数,结果通过与index对应的数组带回

{

int i,j,max;

max=array[0][0]; for(i=0; i<3; i++) for(j=0; j<4; j++)

if(max < array[i][j]) {

index[0] = i; index[1] = j;

max = array[i][j]; } }

void main() {

int a[3][4]={{18,2,3,4}, {8,7,6,5},

{9,10,11,12}}; int maxindex[2]={0};

//定义数组maxindex以保存最大值的行、列下标,因为函数无法返回2个值,只能通过数组带回来

int i, j; max_value(a, maxindex); i=maxindex[0]; j=maxindex[1];

printf(\}

6、编写函数,统计给定字符串中各个字母出现的次数,不区分大小写。在main函数中输入一个字符串,调用该函数进行计算,然后输出统计结果。

提示:统计结果可以保存到一个数组中,如int count[26],分别存储每个字母出现的次数,初值0,然后将数组作为函数参数将值带回来。

#include \

void fun(char s[], int a[]) //将统计26个字母的结果存放在与数组a对应的实参中 {

int i, j;

for(i=0; s[i]; i++) {

if(s[i] >= 'A' && s[i] <= 'Z')

j = s[i]-'A'; //得到该字母在26个字母中的序号 else if(s[i] >= 'a' && s[i] <= 'z') j = s[i]-'a';

a[j]++; //对应字母的个数加1 } }

int main(void) {

char str[80];

int count[26]={0}, i; //count数组26个元素分别存储每个字母出现的次数,初值0

printf(\请输入一串字符以回车键结束:\\n\

gets(str);

fun(str, count);

//输出统计结果

for(i=0; i<26; i++) if(count[i]!=0) }

printf(\或%c出现的次数为:%d\\n\

7、编写函数substring(char [], char sub[]),查找sub串在字符串s中第一次出现的下标位置。 提示:若找到,函数返回对应下标,否则返回-1。例如s串为“abcdefg”,sub串为“def”,则返回值为4。在main函数中输入主串和子串,调用该函数并输出结果。

#include #include

int substring(char s[], char sub[])

//查找sub在s中第一次出现的位置,若找到返回对应下标,否则返回-1

{

int end, i, j;

end = strlen(s) - strlen(sub); /* 计算结束位置*/

if ( end > 0 ) /* 子串sub小于字符串s */ {

for ( i = 0; i <= end; i++ ) /* 用循环从首字符开始依次比较 */ {

for ( j = 0; sub[j]; j++ ) {

if(s[i+j] != sub[j]) break; }

if ( sub[j] == '\\0' ) /* 找到(即sub中所有字符都匹配),返回位置 */ return i + 1; } }

return -1; /*未找到,返回-1*/ }

void main(void) {

char string[100]; char substr[100]; int result;

printf(\请输入字符串: \

gets(string); /* 读取字符串*/ printf(\请输入要搜索的子字符串 ==> \

gets(substr); /* 读取子字符串*/

result = substring(string,substr); /* 定位子字符串*/

if ( result > 0 )

printf(\子字符串 %s 位置在 %d\\n\ else

printf(\没有找到子字符串 %s\\n\}

8、请编一个函数fun,其中n所指存储单元中存放了数组中元素的个数。函数的功能是:删除所有值为y的元素。已在主函数中给数组元素赋值,y的值由主函数通过键盘读入。注意:部分源程序已给出,请勿改动主函数和其他函数中的内容,仅在函数fun的指定的部位填入你编写的若干语句。

源程序如下:

#include #define M 20

int fun(int bb[],int n, int y) {

int i,j;

for(i=0;i

if(bb[i]==y) //当某个元素等于y时,把i后的元素顺次往前挪动一个位置 {

for(j=i;j

return n; }

void main() { int aa[M]={1,2,3,3,2,1,1,2,3,4,5,4,3,2,1}, n=15, y, k; printf(\ for(k=0; k

printf(\ for(k=0; k

第七课后习题7、8、9参考程序

7、/* 在字符串中插入子串 */

#include #include

void insert(char s1[], char s2[], int pos) {

int len1, len2, i, j, k;

len1=strlen(s1); /*计算字符串1的长度*/ len2=strlen(s2); /*计算字符串2的长度*/ if(pos>len1) /*插入位置是字符串的尾部*/ pos=len1;

else if(pos<0) /*插入位置是字符串的头部*/ pos=0;

k=len1+len2; /*计算新字符串的长度*/

for(i=len1-1, j=k-1; i>=pos; j--, i--) /*将插入点后字符移至串1尾部*/ s1[j]=s1[i]; s1[k]='\\0';

for(i=pos, j=0; s2[j]; i++, j++) /*将字符串2插入到字符串1中*/ s1[i]=s2[j]; }

void main(void) {

char s1[80], s2[20]; //假定输入时串1不超60字符,串2不超20字符 int pos;

printf(\请输入字符串1: \\n\gets(s1);

printf(\请输入字符串2: \\n\gets(s2);

printf(\请输入将字符串2插入字符串1的位置: \\n\scanf(\insert(s1, s2, pos-1);

printf(\插入字符串2后的字符串1为: %s\\n\}

8、/*输出字符串中最长的单词*/

#include #include

void longword(char s1[], char s2[]) {

}

char word[100]={0}; /*初始化为空字符*/ int i=0,j=0,k=0,m=0,n=0; for(i=0; s1[i]; i++) {

if(s1[i]!=' ') /*单词之间用空格隔开*/ {

word[j]=s1[i]; /* word记录当前考查的单词*/ j++; /* j 记录当前考查单词的长度*/ }

if(s1[i]==' ') /*新单词*/ {

if(j>n) /* word记录的单词长度超过最长单词 */ {

word[j]='\\0';

strcpy(s2,word); /*最长单词赋给s2*/ n=j; /*n记录最长单词的长度*/ }

strcpy(word,\字符数组重新初始化为空串*/ j=0; /* j 记录新单词的长度*/ } }

if(j>n) /*与最后一个单词比较*/ {

word[j]='\\0'; strcpy(s2,word); }

void main(void) {

char setence[100],max[100]; /*max记录最长单词*/ printf(\请输入一串单词\\n\gets(setence);

longword(setence, max);

printf(\最长单词为:\ puts(max); }

9、/*逆序打印字符*/

#include \void reverseprint() {

char ch;

ch = getchar();

if(ch!='\\n')

reverseprint();

putchar(ch); }

void main(void) {

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

实验八 指针及其应用——参考程序

【实验内容】 二、 编程题:

1. 编写程序,用指针实现读入一行数列,求数列的和,平均值,最大值、最小值,并且打印它们。

#include \#include \void main() {

int array[80], *p;

int n, i, sum=0, max=INT_MIN, min=INT_MAX;

/*符号常量INT_MIN和INT_MAX分别表示int型的最小值和最大值,在limits.h中定义*/

printf(\请确定要输入的整数个数n \ scanf(\

printf(\请输入%d个整数\ p=array; for(i=0; i

scanf(\ if(*p>max) max= *p; if(*p

sum=sum + *p; p++; }

printf(\输入的%d个整数为\输出所有整数*/ p=array;

for(i=0; i

printf(\ putchar('\\n');

printf(\以上整数的累加和为%d\\n\ printf(\以上整数的平均值为%.2f\\n\ printf(\以上整数的最大值为%d\\n\ printf(\以上整数的最小值为%d\\n\

}

2. 编写字符串插入函数char *strins(char *s1, char *s2),将字符串s2的内容插入到字

符串s1之前,参数s1, s2为指向字符串的指针。函数执行后,返回值为结果字符串的首地址(即s1),参数s1为结果字符串中原来子串s1的首地址,参数s2不变。例如:s1=”world”, s2=”hello”, 结果字符串为”helloworld”,s1指向字符‘h’。

在main函数中输入两个字符串,调用该函数完成字符串的插入,并输出结果。

#include \

char *strins(char *s1, char *s2) {

int len1=0, len2=0; char *p1, *p2;

p1=s1;

while(*p1++) //计算s1的长度 len1++; p2=s2;

while(*p2++) //计算s2的长度 len2++;

//把s1中的每个字符顺次向后移动len2个位置,包括结束符'\\0' p1=s1+len1; //指向s1的结束符'\\0' do {

*(p1+len2)= *p1;

} while(p1--!=s1); /*至少要移动一次,因此用do~while循环*/

//把s2拷贝插入到s1的前面 p1=s1; p2=s2;

while(*p2)

*p1++=*p2++;

return s1; }

void main() {

char str1[80],str2[80], *p;

printf(\ gets(str1);

printf(\ gets(str2);

printf(\原来的字串s1:\ puts(str1);

p=strins(str1,str2);

printf(\插入后的字符串:\puts(str1);

/*这里puts(str1)和puts(p)的输出结果一样,因为p指针实际上就是指向str1的第一个元素*/ puts(p); }

3. 编写字符串函数char *substr(char *str1, char *str2),判断字符串str2是否为str1的子串,如果是,则返回str1中首次出现子串str2的起始位置,否则,返回NULL值。例如:str1=”I am a student”,str2=”stu”,函数执行后,返回值指向字符‘s’,参数s1, s2不变。