实验三 选择结构程序设计
二、程序调试方法实验
上机题目:编程实现求分段函数的值。
?x2?2x?11??x?10 y??
0 其它? 找出并改正以下源程序中错误,得出正确的运行结果。
#include
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
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
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
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 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 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 int sum=0,i=1; do { sum=sum+i; i++; } while(i<=50); printf(\} (3)for循环 #include int sum=0,i; for(i=1;i<=50;i++) sum=sum+i; printf(\} 2、编程,输入10个整数,求其中正数的个数及其平均值(精确到小数点后两位)。 #include 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 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 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 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 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 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 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 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 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 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 int i,j; for(i=1;i<=9;i++) { for(j=1;j<=9;j++) printf(\ printf(\ } } (2) #include int i,j; for(i=1;i<=9;i++) { for(j=1;j<=i;j++) printf(\ printf(\ } } (3) #include 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 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 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 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 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 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 { 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 int main() { int a[ROW][COL]={1,4,6,8,10,12}; int i,j,temp; for(i=0;i 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 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 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 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 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 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 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 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 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 int main() { int a[ROW][COL]={1,4,6,8,10,12}; int i,j,temp; for(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 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 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 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 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; j if(j==m) { flag=1; //有鞍点 printf(\ } } if(flag==0) printf(\ 三、字符串实验 1. 以下程序功能为:输入一个字符串,将其逆序输出。找出并改正以下源程序中错误,通过调试得出正确的运行结果。 源代码(有错误的程序) #include 运行结果(改正后的程序) Enter a string : asdfg This is the reverse string: gfdsa 2. 编程:任意输一个字符串保存在一维字符数组中,求其长度(不用strlen函数)。例如: Input a string: aadfdg length=6 提示:字符串的有效长度就是有效字符的个数,即数组中第一个‘\\0’前面的字符个数。 #include 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 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 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 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 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 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 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 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 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 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 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 void sort(float a[], int n) //无返回值,在原数组上排序并带回 { int i,j; float temp; for(i=0;i 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 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 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 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 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不变。