C语言程序设计课后参考答案_第1页
C语言程序设计课后参考答案_第2页
C语言程序设计课后参考答案_第3页
C语言程序设计课后参考答案_第4页
C语言程序设计课后参考答案_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章C语言概述一.选择题序号123456789101112答案ACBABACDBABC二.填空题序号1234567答案函数main函数scanf、printf数据结构操作数值运算、非数值运算循环条件、循环体三.编程题1、【算法提示】直接应用多个printf()语句来实现多行字符串的输出。【参考程序】main(){printf(“********************************”);printf(“\n”);printf(“WelcometoCProgram\n”);printf(“\n”);printf(“********************************”);}2、【算法提示】输入的整数可以直接用变量符值的方式产生,结果用printf()语句输出。【参考程序】#include<stdio.h>voidmain(){inta,b,c;a=3;b=4;printf(“b-a=%d\n”,b-a);}3、【算法提示】输入的整数可以直接用变量符初值的方式产生,用if语句两两比较,将小值存入一变量中,最后用printf()语句输出该小值。【参考程序】#include<stdio.h>voidmain(){inta,b,c,min;scanf(“%d,%d,%d”,&a,&b,&c);if(a>b)min=b;elsemin=aif(min>c)min=c;printf(“°min=%d\n”,min);}4、【算法提示】在一个for()循环中用scanf()函数输入其十个数,输入的第一个数放入一变量中,用if语句判断其输入的值与变量中的值,输入的值小,则替换变量中的值,直到十个数输完,最后输出变量中的值,即为输入的最小数.【参考程序】#include<stdio.h>intmain(){inta,i,min;//输入第一个数,并存入到min中scanf("%d",&min);//输入剩下的九个数,与min比较,较小数放到min中。for(i=1;i<10;i++){scanf("%d",&a);if(a<min)min=a;}printf("十个数中最小值为:%d",min);}5、【算法提示】用循环实现其计算【参考程序】#include<stdio.h>intmain(){inta,i;a=1;//初始化存放阶乘的变量//计算6的阶乘for(i=1;i<7;i++)a=a*i;printf("6!的值为:%d",a);}6、【算法提示】参考相关课本中有关于素数的数学特征来设计本例的算法。【参考程序】#include<stdio.h>#include<math.h>intmain(){intn,k,i,t;for(n=1;n<=500;n+=2){k=(int)sqrt(n);for(i=2;i<=k;i++)if(n%i==0)break;if(i>=k+1)printf("%3d\n",n); }return0;}7、【算法提示】用循环来实现其计算。【参考程序】#include<stdio.h>intmain(){inti,sum=0;for(i=1;i<=100;i++)sum+=i;printf("其和为:%d\n",sum);return0;}第2章数据类型、运算符与表达式一.选择题序号1234567891011121314151617答案BBDABBDBDCAAA,DADCA二.填空题序号123456789答案252137-30y%2!=003-12x+=12,2序号10111213答案ABCIsay"Howareyou?"\Cprogram\Turbo'C'total=37.500000,ch1=dx=30三.求表达式的值序号123答案2.53.5(1)0(2)0(3)0四.编程题1、编写一个程序,要求输入一个ASCII码值(如66),然后输出相应的字符。【算法提示】C语言中的字符数据既可以当字符使用,也可以当整数(对应的ASCII码值)使用,编程时只用不同的格式符即可。【参考程序】#include<stdio.h>intmain(void){charc1;printf("请输入一个整数:");scanf("%d",&c1);printf("其对应的字符为:");printf("%c\n",c1);return0;}2、编写一个程序,要求输入您的生日,然后计算并输出已过去的天数。【算法提示】要考虑闰年和非闰年的情况;起止月份不一样,还要考虑相差的月份内的天数也不同。【参考程序】#include<stdio.h>intRunNian(inty)//判断某个年份是否为闰年{ if((y%4==0&&y%100!=0)||y%400==0) return1; else return0;}intNianZhong(intyear,intmon,intday)//计算年中某天相对于1月1号是第几天{ intm[13],sum=0,i; m[1]=31,m[2]=28,m[3]=31,m[4]=30,m[5]=31,m[6]=30; m[7]=31,m[8]=31,m[9]=30,m[10]=31,m[11]=30,m[12]=31; if(mon>2)m[2]=m[2]+RunNian(year); for(i=1;i<mon;i++)sum=sum+m[i]; sum=sum+day; returnsum;}intmain(void){ intyear1,month1,day1,year2,month2,day2; intm[13],sum=0,y; m[1]=31,m[2]=28,m[3]=31,m[4]=30,m[5]=31,m[6]=30; m[7]=31,m[8]=31,m[9]=30,m[10]=31,m[11]=30,m[12]=31;printf("请输入您的出生日期(年月日用逗号隔开):");scanf("%d,%d,%d",&year1,&month1,&day1);printf("请输入今天的日期(年月日用逗号隔开):");scanf("%d,%d,%d",&year2,&month2,&day2); if(year2>year1) { sum=365+RunNian(year1)-NianZhong(year1,month1,day1); for(y=year1+1;y<year2;y++) { sum=sum+365+RunNian(y); } sum=sum+NianZhong(year2,month2,day2); } elseif(year2==year1) { sum=NianZhong(year2,month2,day2)-NianZhong(year1,month1,day1); if(sum==0) { printf("恭喜,您今天出生了!\n"); return0; } elseif(sum<0) { printf("输入的年份不对,您好像还没出生呢!\n"); return0; } } else { printf("输入的年份不对,您好像还没出生呢!\n"); return0; }printf("恭喜,您已经活了%d天!\n",sum);return0;}3、编写一个程序,将“Glmre”进行解密。解密的规则是:用原来的字母前面第4个字母代替原来的字母,例如:字母”E“前面的字母是”A“,用“A”代替“E”。因此“Glmre”应解密为“China”。请编一程序,用赋初值的方法使c1,c2,c3,c4,c5五个变量的值分别为’G’、’l’、’m’、’r’、’e’经过运算,是c1,c2,c3,c4,c5分别变成‘C’、‘h’、‘i’、‘n’、‘a’,并输出。【算法提示】定义5个变量并赋值,要将原字母转变为前面第4个字母,只需要将字符减去4即可,依次改变这5个变量,然后输出。【参考程序】#include<stdio.h>intmain(void){ charc1='G',c2='l',c3='m',c4='r',c5='e'; c1=c1-4; c2=c2-4; c3=c3-4; c4=c4-4; c5=c5-4; printf("%c%c%c%c%c\n",c1,c2,c3,c4,c5); return0;}第3章简单的程序设计-顺序程序设计一.选择题BCACBDABCD二.填空题1、220.0000002、b3、884、10,30,05、1B6、127、2618、09、2,110、6.611、scanf("%d%f%f%c%c",&a,&b,&x,&c1,&c2);36.512.6aA(注意在输入字符时,中间不能以空格作为间隔符)12、c:dec=120,oct=170,hex=78,ASCII=x13、x=2y=1*sum*=314、4.415、0三.编程题1、设圆半径r=2.5,圆柱高h=5,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要有文说明,取小数点后2位数字。请编程实现。【算法提示】(1)要包含数学库的头文件“math.h”;(2)在计算的过程中要用的值,可先定义一变量如pi=3.14159,计算时直接带入pi即可;(3)计算时注意把数学的表达式转换成符合C的语法规则。【参考程序】#include<stdio.h>intmain(){floats1,s2,v1,v2,l,r,h;floatpi=3.1415;//定义π,并赋值scanf("%f%f",&r,&h);l=2*pi*r;//计算圆周长s1=pi*r*r;//计算圆面积s2=4*pi*r*r;//计算圆球面积v1=3.0/4*pi*r*r*r;//计算圆球体积,注意区分3.0/4和3/4的区别v2=s1*h;//计算圆柱体积printf("圆周长=%.2f,圆面积=%.2f,圆球表面积=%.2f,圆球体积=%.2f,圆柱体积=%.2f\n",l,s1,s2,v1,v2);return0;}2、输入一个华氏温度,要求输出摄氏温度,公式为c=5/9(F-32),输出要有文字说明,取2位小数。【算法提示】(1)注意数据类型,除法5/9与5.0/9的区别;(2)计算时注意把数学的表达式转换成符合C的语法规则。【参考程序】#include<stdio.h>#include<math.h>intmain(){floata,c;//定义实型的变量scanf("%f",&a);c=5.0/9*(a-32);printf("%.2f\n",c);//输出保留两位小数return0;}3、已知三角形的两边a,b及其夹角,求第三边c及其面积S。【算法提示】(1)要包含数学库的头文件“math.h”;(2)把输入的角度转换为弧度进行处理,要考虑的使用,可参考第1题中算法提示(2)。【参考程序】#include<stdio.h>#include<math.h>intmain(){doublea,b,angle,c,s,hudu;doublepi=3.1415;printf("请输入两条边的长度和角的大小(数据以空格隔开):\n");scanf("%lf%lf%lf",&a,&b,&angle);//要求输入的边长及角度为正值 hudu=pi*angle/180;//把角度转换为弧度c=sqrt(a*a+b*b-2*a*b*cos(hudu));//利用余弦定理求第三边s=0.5*a*b*sin(hudu);//面积公式printf("第三边长为%lf,面积为%lf\n",c,s);return0;}4、编程输入一个数字字符(‘0’-‘9’),将其转换为相应的整数后显示出来。【算法提示】(1)定义一个字符型变量接收数字字符;(2)输出的数据以整型的形式显示。【参考程序】#include<stdio.h>intmain(){charc;printf("请输入‘0’-‘9’间的字符");scanf("%c",&c);//定义一个字符型变量printf("%d\n",c);//以整型的数据输出return0;}第4章选择结构程序设计一.选择题CAABBACCCCDADAB二、填空题1、45992、213、-44、a=1,b=0,c=05、2006、102007、38、!x!=09、58585810、passwarn11、612、0三、编程题1、分别用if和switch语句完成下列功能的实现。输入一个学生的成绩。若成绩在60-69则打印“及格”,70-79“中等”,80-89“良好”,90-100“优秀”,60分以下“不及格”。多次运行本程序,每次输入不同分数段的成绩,查看相应的运行结果。【算法提示】(1)可将输入的成绩先进行判定是否属于0-100合理的分数范围;(2)若在合理的范围内,可将成绩进行与10相除取其商处理,根据商的值判定成绩的等级,注意break语句的使用。(3)使用if语句时,注意逻辑关系。【参考程序1】#include<stdio.h>//用if语句实现intmain(){intnum;chargrade;scanf("%d",&num);if(num<0||num>100){printf("inputthenumiserror");}elseif(num<60)grade='E';elseif(num<70)grade='D';elseif(num<80)grade='C';elseif(num<90)grade='B'; elsegrade='A';printf("Grade=%c\n",grade);return0;}【参考程序2】对问题直接进行分段描述)#include<stdio.h>//用if语句实现intmain(){intnum;chargrade;scanf("%d",&num);if(num<0||num>100){printf("inputthenumiserror\n");}if(num>=90&&num<100)grade='A';if(num>=80&&num<90)grade='B';if(num>=70&&num<80)grade='C';if(num>=60&&num<70)grade='D';if(num>=0&&num<60)grade='E'; printf("Grade=%c\n",grade);return0;}【参考程序3】#include<stdio.h>//用switch语句实现intmain(){intnum;chargrade;scanf("%d",&num);num/=10;switch(num){case10:case9:grade='A';break;case8:grade='B';break;case7:grade='C';break;case6:grade='D';break;default:grade='E';break;}printf("%c",grade);return0;}2、用if语句完成下列功能的程序。当从键盘输入字符’a’或’A’,输出’America’;当从键盘输入字符’b’或’B’,输出’Brtain’;当从键盘输入字符’c’或’C’,输出’China’;当从键盘输入其他字符时,则输出’France’。【算法提示】(1)根据输入的字符进行开关选择,注意break语句的使用。#include<stdio.h>intmain(){charop;//定义一个字母scanf("%c",&op);switch(op){case'A':printf("America");break;case'b':case'B':printf("Brtain");break;case'c':case'C':printf("France");break;default:break;return0;}}3、某市不同车牌的出租车3km的起步价和计费分别为:夏利7元,3km以外1.5元/km;雪铁龙8元,3km以外1.8元/km;桑塔纳9元,3km以外2.4元/km。编程实现:从键盘输入乘车的车型及行车公里数,输出应付车费。【算法提示】分别对三种品牌车进行编号并规定其起步价,当输入里程数后,根据车型及里程数进行选择计费。【参考程序】#include<stdio.h>intmain(){intpai,km;floatmoney;printf("请输入车型号(1夏利2雪铁龙3桑塔纳):");scanf("%d",&pai);printf("请输入里程:");scanf("%d",&km);switch(pai){case1:money=7;if(km>3)money=(km-3)*1.5+money;break;case2:money=8;if(km>3)money=(km-3)*1.8+money;break;case3:money=9;if(km>3)money=(km-3)*2.4+money;break;}printf("应付的费用为:%.2f\n",money);return0;}4、分别用if和switch语句完成下列功能的实现。编程实现以下功能:读入两个操作数(data1和data2)及一个运算符(op),计算表达式data1opdata2的值,其中op可以为+,-,*,/。【算法提示】(1)将运算符(op)定义一个字符型变量;(2)考虑除法运算时,结果会出现小数,故应将两个操作数(data1和data2)定义为实型数据。【参考程序】#include<stdio.h>intmain(){charop;//定义一个运算符doubledata1,data2,r;printf("请输入算术式如3*15\n");scanf("%lf%c%lf",&data1,&op,&data2);switch(op){case'+':r=data1+data2;break;case'-':r=data1-data2;break;case'*':r=data1*data2;break;case'/':if(data2!=0)//当除数为0时 r=data1/data2; else printf("数据出错");break;//当除数为0时处理}printf("%.0lf%c%.0lf=%.2lf\n",data1,op,data2,r);}5、企业发放的奖金根据利润提成,利润用I表示,奖金用P表示。当利润低于或等于10万元时,奖金可提成10%;当利润在10万到20万元之间时,高于10万元的部分,可提成7.5%;当利润在20万到40万之间时,高于20万元的部分,可提成5%,其他如前;当利润在40万到60万之间时高于40万元的部分,可提成3%,其他如前;当利润在60万到100万之间时,高于60万元的部分,可提成1.5%,其他如前;当利润高于100万元时,超过100万元的部分按1%提成,其他如前.【算法提示】(1)注意定义时需把奖金定义为长整型;(2)在计算时要用到百分比,可将具体的百分数转换成小数形式。【参考程序】#include<stdio.h>voidmain(){longinti;intbonus1,bonus2,bonus4,bonus6,bonus10,bonus;printf("请输入企业奖金:");scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;elseif(i<=200000)bonus=bonus1+(i-100000)*0.075;elseif(i<=400000)bonus=bonus2+(i-200000)*0.05;elseif(i<=600000)bonus=bonus4+(i-400000)*0.03;elseif(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);}第5章循环控制一.选择题DAABCCBABBBCAD二、填空题1、52、89213、194、05、a=12y=12a=16y=286、0111227、368、329、4,410、1711、s=25412、无结果13、314、0112315、5(题目补上b=b/2;)三、编程题1、输入两个正整数m和n,求其最大公约数和最小公倍数。【算法提示】可利用辗转相除法:设两数为a、b(b<a),求它们最大公约数(a、b),

a÷b,令r为所得余数(0≤r<b)。若r=0,算法结束;b即为答案。

最小公倍数=两数之积除以最大公约数。【参考程序】#include<stdio.h>voidmain(){inta,b,num1,num2,temp;printf("pleaseinputtwonumbers:\n");scanf("%d,%d",&num1,&num2);if(num1<num2){temp=num1;num1=num2;num2=temp;}a=num1;b=num2;while(b!=0)/*利用辗除法,直到b为0为止*/{temp=a%b;a=b;b=temp;}printf("gongyueshu:%d\n",a);printf("gongbeishu:%d\n",num1*num2/a);}2、输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。【算法提示】(1)利用while语句进行字符输入是否结束的判定,一般情况以回车键作为结束标识;(2)利用if语句对每个输入的字符进行判定,满足条件,就进行计数处理。【参考程序】#include<stdio.h>intmain(){//输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。charch;intchar_num=0,kongge_num=0,int_num=0,other_num=0;while((ch=getchar())!='\n')//回车键结束输入,并且回车符不计入{if(ch>='a'&&ch<='z'||ch<='A'&&ch>='Z')char_num++;elseif(ch=='')kongge_num++;elseif(ch>='0'&&ch<='9')int_num++;elseother_num++;}printf("字母=%d,空格=%d,数字=%d,其他=%d\n",char_num,kongge_num,int_num,other_num);return0;}3、一个三位数,其各位数字立方和等于该数本身。【算法提示】(1)利用for语句进行循环控制(2)对每个三位数分别求出其百位、十位及个位上的数字(2)利用if语句进行条件判定。【参考程序】#include<stdio.h>intmain(){intn,a,b,c;for(n=100;n<=999;n++){a=n/100;//计算百位上的数字b=n%100/10;//计算十位上的数字c=n%10;//计算个位上的数字if(a*a*a+b*b*b+c*c*c==n)printf("%d\n",n);}return0;}4、求1!+2!+3!+4!+...+20!(提示:数据类型设置时防止溢出,应设置合适的数据类型)【算法提示】(1)计算阶层和时数据较大,为防止数据溢出,可将其变量设为long整型(2)利用for语句进行循环控制。【参考程序】#include<stdio.h>intmain(){inti;floatn=1,sum=0;for(i=1;i<=20;i++){n=n*i;sum=sum+n;}printf("\n%f",sum);return0;}5、有一分数序列2/1,3/2,5/3,8/5,13/8,21/13…..求出这个数列的前20项。(提示:当分子分母均为整数时,如何正确得到分式的值?)【算法提示】这组分数序列的规律:从第二个数开始,分子=前一个数的分子+分母,分母=前一个数的分子;可对第一个数初始化为x=2,y=1;从第二个数开始,分子x=x+y分母y=x,用for语句进行循环控制。【参考程序1】#include"stdio.h"intmain(){floati,x,y,a;floatsum=0;x=2;y=1;for(i=1;i<=20;i++){sum+=(x)/y;a=x;x=x+y;y=a;}printf("%.6f\n",sum);return0;}【参考程序2】#include"stdio.h"intmain(){intn,t,number=20;floata=2,b=1,s=0;for(n=1;n<=number;n++){s=s+a/b;t=a;a=a+b;b=t;//这部分是程序的关键}printf("sumis%.6f\n",s);return0;}把100~200之间的不能被3整除的数输出。【算法提示】(1)考虑一个数能否被3整除,可借用“%”求余运算进行处理,仅当余数为零时,说明可以被整除(2)用for语句进行循环控制,注意continue的巧妙使用。【参考程序】#include<stdio.h> intmain(){inti;for(i=100;i<=200;i++)if(i%3==0)continue;elseprintf("%5d",i);return0;}7、若口袋里有12个球,其中3个红球,3个白球,6个黑球,从中任取8个球,编程球有多少种不同的取法。【算法提示】可设定三个变量分别控制红球、白球、黑球的数量,利用for语句进行循环控制,并利用if语句进行条件判定。设任取的红球个数为i,白球个数为j,黑球的个数为k,根据题意红球和白球个数的取值范围是0~3,黑球的个数的取值范围是0~6在满足i+j+k=8的条件下,求出i,j,k,的取值。【参考程序】#include<stdio.h>intmain(){inti,j,k,count=1;printf("redballwhiteballblackball\n");printf("..................................................\n");for(i=0;i<=3;i++)//循环控制变量i控制任取红球个数0~3for(j=0;j<=3;j++)//循环控制变量j控制任取白球个数0~3for(k=0;k<=6;k++)//循环控制变量k控制任取黑球个数0~6if((i+j+k)==8)printf("%2d:%d%d%d\n",count++,i,j,k);}第6章数组一.选择题序号1234567891011121314答案CCDCABCCBACDDD序号151617181920答案BBDCDB二.填空题序号123456789答案abcbcc92&a[i]、a[i]1371512305600958s[i++]HelloABC6789序号101112答案14abc"BBB"三.编程题1、【算法提示】(1)定义一个存放20个元素的数组;(2)通过for循环输入20个无序的数;(3)应用冒泡法或选择法对20个数进行排序(比较数的大小,决定是否交换);(4)输出该排序后的数组内容(20个有序的数)。【参考程序】方法1---用选择法对10个整数从小到大排序#include<stdio.h>intmain(){inti,j,a[10],t,min;//定义变量和数组//数组元素从键盘输入for(i=0;i<10;i++)scanf("%d",&a[i]);//选择法排序for(i=0;i<9;i++) {min=i;for(j=i;j<=9;j++) { if(a[j]<a[min]) min=j; } //只交换一次 t=a[i]; a[i]=a[min]; a[min]=t; }//输出排序后的结果,以验证排序是否正确for(i=0;i<10;i++) printf("%5d",a[i]);return0;}//方法2---用冒泡法对10个整数从小到大排序#include<stdio.h>intmain(){//定义变量和数组inti,j,a[10],t;//数组元素从键盘输入for(i=0;i<10;i++)scanf("%d",&a[i]);//冒泡法排序for(j=1;j<10;j++)for(i=0;i<=9-j;i++)if(a[i]>a[i+1]) {t=a[i+1];a[i+1]=a[i];a[i]=t;}//输出排序后的结果,以验证排序是否正确for(i=0;i<10;i++) printf("%5d",a[i]);return0;}2、【算法提示】(1)定义一个存放10个元素的整形数组;(2)通过for循环输入10个整数;(3)用两个变量保存该数组中的最大值与最小值;(4)输出该最大值、最小值。【参考程序】#include<stdio.h>intmain(){inti,a[10],max,min; scanf("%d",&a[0]);max=min=a[0];for(i=1;i<=9;i++){scanf("%d",&a[i]); if(a[i]>max)max=a[i];if(a[i]<min)min=a[i];}printf("min=%d,max=%d\n",min,max);return0;}3、【算法提示】(1)定义一个二行三列的二维整形数组;(2)通过双重for循环输入6个值(其值和特征为,起始值为2,每次递增2)的整数;(3)用双重for循环输出该6个数值。【参考程序】#include<stdio.h>voidmain(){intnum[2][3];inti=0,j=0;for(i=0;i<2;i++){for(j=0;j<3;j++)num[i][j]=2*((3*i)+j+1);}for(j=0;j<3;j++)for(i=0;i<2;i++)printf("%d,",num[i][j]);}4、【算法提示】(1)定义一个存放n个元素的整形数组;(2)通过for循环输入n个整数;(3)扫描数组,记下序列中的最大值与最小值在数组中的位置;(4)将最大值位置的数与第一个元素交换,将最小值位置的数与第后一个元素交换;(5)输出该有序序列。【参考程序】#include<stdio.h>main(){inti,a[10],max,min,m,n;for(j=0;j<10;j++)scanf("%d",&a[i]);max=min=a[0];for(i=1;i<=9;i++){ if(a[i]>max) { m=i; max=a[i]; } if(a[i]<min) { n=i; min=a[i]; }}if(m!=9) { a[m]=a[9];a[9]=max; }if(n!=0) { a[n]=a[0];a[0]=min; }for(i=0;i<=9;i++)printf("a[%d]=%d\n",i,a[i]);}5、【算法提示】(1)定义一个存放n个元素的整形数组a[n],并初始化;(2)将a[n-1]存入临时变量temp中,使a[n-1]=a[n-2],直到a[0]=temp,完成序列后移一位;(3)重复m次,完成序列后移m个位置;(4)输出该序列。【参考程序】#include<stdio.h>voidmain(){intn,m;inti;inta[100]={10,20,30,40,50,60},array_end;printf("请输入你要的数组长度:\n");scanf("%d",&n);printf("输入你要交换的数组:\n");for(i=0;i<n;i++)scanf("%d",&a[i]);printf("输入你要交换的数字个数:\n");scanf("%d",&m);for(;m>0;m--){ array_end=a[n-1];for(i=n-1;i>0;i--)a[i]=a[i-1];a[i]=array_end;}for(i=0;i<n;i++){printf("%d",a[i]);}printf("\n");}6、【算法提示】(1)二维方阵a[m][m]对角线元素的特征为:主对角线行列值为:行值=列值;次对角线行列值为:列值=m-行值-1,行值取值范围为0至(m-1)。(2)根据要求,将行列值作为数组下标,提取数组元素进行计算,得到所需要的结果。【参考程序】main(){inti=0,j=0,a[3][3],s1,s2;for(i=0;i<3;i++)for(j=0;j<3;j++) scanf("%d",&a[i][j]);s1=a[0][0]+a[1][1]+a[2][2];s2=a[0][2]+a[1][1]+a[2][0];printf("s1=%d,s2=%d\n",s1,s2);}或main(){staticinti,j,s1,s2,a[3][3];for(i=1;i<=3;i++)for(j=1;j<=3;j++)scanf("%d",&a[i][j]);s1=a[1][1]+a[2][2]+a[3][3];s2=a[1][3]+a[2][2]+a[3][1];printf("%d,%d\n",s1,s2);}7、【算法提示】(1)定义一个二维字符数组a[3][80],用来存入输入的字符。(2)用判断语句来确定字符的类型,'A'-'Z'为大写字符,'a'-'z'为小写字符,'0'-'9'为数字,''为空格,有一个记数器来记录各种字符的个数,初始值为0。(3)输出其对应的统计结果。【参考程序】#include<string.h>#include<stdio.h>main(){inti,j=0,k=0,l=0,m=0,n=0;charstr0[301],str1[100],str2[100],str3[100];gets(str1);gets(str2);gets(str3);strcpy(str0,str1);strcat(str0,str2);strcat(str0,str3);for(i=0;str0[i]!='\0';i++){if(str0[i]>=65&&str0[i]<=90)j++;elseif(str0[i]>=97&&str0[i]<=122)k++;elseif(str0[i]>=48&&str0[i]<=57)l++;elseif(str0[i]==32)m++;elsen++;}printf("DaxieXiaoxieShuziKonggeQita\n");printf("%5d%7d%5d%6d%4d\n",j,k,l,m,n);}8、【算法提示】((1)定义两个字符数组a[80]、b[30],并初始化。(2)设i为数组下标,利用while语句,用条件a[i]!=‘\0’来查找a数组的结束符位置。(2)用j为数组下标,利用while语句,用条件b[j]!=‘\0’来查找b数组的结束符位置。将字符串b的内容,按字符符值的方式,复制到a数组i开始的位置,直到b数组结束。(3)输出a字符串。【参考程序】//方法1--将两个字符串的内容合并放置到第3个串中#include<stdio.h>#include<string.h>intmain(){ //定义变量 inti,j;//定义字符数组,注意第3个串的长度要足够大 charstr1[50],str2[50],str3[100]; //从键盘输入2个字符串 gets(str1); gets(str2); //将str1的内容逐个字符,逐个字符的复制到str3 for(i=0;str1[i]!='\0';i++) str3[i]=str1[i]; //再将str2的内容逐个字符,逐个字符的复制到str3 for(j=0;str2[j]!='\0';j++) str3[j+i]=str2[j]; //给str3设置一个字符串结束符str3[j+i]='\0'; //输出3个串的值printf("%s\n%s\n%s\n",str1,str2,str3); return0;}//方法2--将第2个字符串的内容连接到第1个串尾部#include<stdio.h>#include<string.h>intmain(){ //定义变量 inti,m,n;//定义字符数组,注意第1个串的长度要足够大 charstr1[100],str2[50]; //从键盘输入2个字符串 gets(str1); gets(str2); //计算2个串的长度 m=strlen(str1); n=strlen(str2); //再将str2的内容(n个字符,还包含1个字符串结束符),逐个字符的复制到str1中, for(i=0;i<=n;i++) str1[m+i]=str2[i]; //输出2个串的值printf("%s\n%s\n",str1,str2); return0;}第7章函数一.选择题序号1234567891011121314答案BBCADA和DDBBCABDB二.填空题序号123456答案24-38-510158,173025ABCabc123三.编程题1、编写一个程序,分别求两个整数的最大公约数和最小公倍数。【算法提示】(1)编写两个函数,分别求两个整数的最大公约数和最小公倍数;(2)编写主函数作为测试函数,调用这两个函数,并输出结果,两个整数由键盘输入。【参考程序】#include<stdio.h>//利用辗除法或其它方法求得最大公约数inthcf(inta,intb){intr=0;while(b!=0){r=a%b;a=b;b=r;}return(a);}//最小公倍数等于两数之积除以最大公约数intlcd(intu,intv){return(u*v/hcf(u,v));}intmain(){intu,v,h,l;printf("Pleaseenter2numbers:");scanf("%d%d",&u,&v);//键盘输入任意两个数h=hcf(u,v);//调用最大公约数函数printf("最大公约数=%d\n",h);//输出最大公约数l=lcd(u,v);//调用最小公倍数函数printf("最小公倍数=%d\n",l);//输出最小公倍数 return0;}2、编写一个程序,实现一组无序整数的排序。【算法提示】(1)排序算法可以采用冒泡排序、选择法排序、快速排序各种方法;(2)分别将排序前、后的数输出,方便验证比较;(3)排序功能用一个函数实现。【参考程序】#include<stdio.h>#defineN20voidbubblesort(inta[],intcount)//冒泡排序函数,其结果升序排序{inti,j,inttmp;for(i=0;i<count;i++) for(j=0;j<count-1;j++) if(a[j]>a[j+1]) { tmp=a[j];a[j]=a[j+1];a[j+1]=tmp;}}intmain(){inta[N],i;printf("PleaseenterNnumbers:\n");//输入20个数for(i=0;i<N;i++) scanf("%d",&a[i]);printf("\nBeforesortting,thesenumbersare:\n");//输出排序前的数据for(i=0;i<N;i++) printf("%5d",a[i]);bubblesort(a,N);//调用排序函数printf("\nAftersortted,thesenumbersare:\n");//输出排序后的数据for(i=0;i<N;i++) printf("%5d",a[i]);}3、编写一个程序,实现给定的一个二维数组(3×4)的转置(即行列互换),其输入、转置、输出分别用函数实现。【算法提示】(1)要分别设2个数组,一个3×4,另一个4×3;(2)函数的参数使用数组名,达到双向传递的效果;【参考程序】#include<stdio.h>#defineM3#defineN4intmain(){inta[M][N],b[N][M];//分别设2个数组,一个3×4,另一个4×3voidinput(inta[M][N]);//输入函数的声明voidreverse(inta[M][N],intb[N][M]);//转置函数的声明voidoutput(intb[N][M]);//输出函数的声明input(a);//调用输入函数,输入二维数组(3×4)的值reverse(a,b);//调用转置函数,函数的参数使用数组名,达到双向传递的效果output(b);//调用输出函数,输出转置后的二维数组(4×3)的值return0;}voidinput(inta[M][N])//输入函数的定义{inti,j;printf("PleaesenterArraya:");for(i=0;i<M;i++)for(j=0;j<N;j++)scanf("%d",&a[i][j]);}voidreverse(inta[M][N],intb[N][M])//转置函数的定义{inti,j;for(i=0;i<M;i++)for(j=0;j<N;j++)b[j][i]=a[i][j];}voidoutput(intb[N][M])//输出函数的定义{inti,j;printf("\nArraybis:\n");for(i=0;i<N;i++){for(j=0;j<M;j++)printf("%d",b[i][j]);printf("\n");}}4、写一函数,输入一个4位数字,要求输出4个数字字符,但每两个数字间有一个空格。如输入2012,应输出“2012”。【算法提示】(1)要分别将这4个数分离开;(2)每个数要分别输出,再输出一个空格。【参考程序】#include<stdio.h>#include<math.h>intmain(){inta;inti;loop://输入合法的数据scanf("%d",&a);if(a<999||a>10000) {printf("Dataisnotbetween1000and9999,inputagain!"); gotoloop; }for(i=0;i<4;i++)//分离数据并输出{printf("%d",a/((int)pow(10,3-i)));//从高至低,逐位分离每一位数字,并输出, a=a%(int)(pow(10,3-i));//从高至低,分离高位的数字}printf("\n");return0;}第8章指针一.选择题序号123456789101112131415161718答案CACDDADCDCDCBDBAAC二.填空题序号1234答案p=(double*)malloc(sizeof(double));*tbcdefgha(1)str+strlen(str)-1(2)!t(3)huiwen(str)序号567答案a[k][i]*sumx,&s9876876s=p+32三.编程题1、利用指针编写求字符串长度的函数strlen()。【算法提示】(1)不能在所定义的函数中直接使用库函数strlen;(2)依次扫描字符数组中的各字符,采用一个计数器进行计数即可。【参考程序】#include<stdio.h>intMyStrlen(char*s){ char*p=s; intlen=0,i=0; for(;p[i++]!='\0';)len++; returnlen;}intmain(void){ char*str="Hello"; intlen; len=MyStrlen(str);//调用自定义函数MyStrlen() printf("字符串str的长度为%d。\n",len); return0;}2、利用函数和指针编写一个程序,在main函数中输入10个字符并存入数组中,定义一个名称为DeleteDup的函数,将此数组中后面出现的重复元素删除,最后把剩下的元素全部显示出来,要求对数组的操作用指针来实现。【算法提示】在DeleteDup函数中,分别考察各个元素,在后面的元素中查找与该元素值相同的元素,如果存在就将其值改为一个特定的值(即标记为空元素),最后通过一重循环将所有的空元素删除。【参考程序】#include<stdio.h>#include<string.h>intDelete(char*s,intn,inti)//删除长度为n的字符串s中的第i个字符。{ if(i>=n)return0; for(;i<=n;i++)s[i-1]=s[i]; return1;}intmain(void){charstr[]="Hellotheworld112323"; inti,j,len=strlen(str);printf("原字符串str为:%s\n",str); for(i=0;i<len-1;i++) { for(j=i+1;j<len;j++) { if(str[i]==str[j]) { Delete(str,len,j+1); } } }printf("删除后字符串str为:%s\n",str); return0;}3、利用函数和指针编写一个程序,从键盘输入三个字符串,并按由小到大的顺序显示出来。【算法提示】(1)可以采用3个函数来表示各个部分的功能:输入、处理、输出,然后在主函数中依次进行调用;(2)对3个字符串进行比较大小时,可以采用3个指针变量指向各字符串的开始位置,利用strcmp函数对字符串进行比较,根据比较结果交换指针变量的值,最后按指针变量原有的顺序输出即可。【参考程序】#include<stdio.h>#include<string.h>//比较两个字符串,如果s1>s2返回1,否则返回0。intStringCompare(char*s1,char*s2){ intlen1=strlen(s1); intlen2=strlen(s2); intlen=len1>len2?len2:len1;//取较小的表长 inti; for(i=0;i<=len;i++) if(s1[i]>s2[i])return1; elseif(s1[i]<s2[i])return-1; return0;//完全相同}intmain(void){char*str1="Hello,theworld!";char*str2="I'mastudent.";char*str3="Apple"; char*tp; printf("原字符串为:\n%s\n%s\n%s\n",str1,str2,str3); if(StringCompare(str1,str2)) { tp=str1;str1=str2;str2=tp; } if(StringCompare(str1,str3)) { tp=str1;str1=str3;str3=tp; } if(StringCompare(str2,str3)) { tp=str2;str2=str3;str3=tp; } printf("\n现字符串为:\n%s\n%s\n%s\n",str1,str2,str3); return0;}第9章结构体与共用体一.选择题序号12345678910111213答案CDABCDBCCBABB二.填空题1.if(a&0x10==0x10)2.s=(high&0xffff0000)|(low&0x0000ffff)3.04.304【说明】此题考查的是结构体类型变量分配的空间,结构体变量a所需的空间是各成员之和,成员num占6个字节,成员s是数组,占16个字节,成员ave占8个字节。结构体指针变量p在内存所占字节数是4个字节,用于存放相同类型的地址。5.80【说明】共用体类型STU定义的数组分配的是一块连续的存储空间,其长度为数组长度×共用体最大成员空间=5×16.6.No:1001Name:WangzhenBirthday:1990/12/9三.编程题1、定义一个结构体变量(包括年、月、日),计算该日在本年中是第几天。【程序分析:】以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。【程序源代码:】#include<stdio.h>struct{intday;intmonth;intyear;}date;intmain(){intdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//每月的天数从下标为1开始intsumdays=0,leap;printf("\npleaseinputyear,month,day\n");scanf("%d,%d,%d",&date.year,&date.month,&date.day);//计算正常年份month月以前的天数for(inti=1;i<date.month;i++)sumdays+=days[i];sumdays+=date.day;//再加上当月的天数if(date.year%400==0||(date.year%4==0&&date.year%100!=0))/*判断是不是闰年*/leap=1;elseleap=0;if(leap==1&&date.month>2)/*如果是闰年且月份大于2,总天数应该加一天*/sumdays++;printf("Itisthe%dthday.",sumdays);}2、针对【例9.11】做修改,对任意班级学生的基本信息和成绩进行管理,学生的基本信息包括:学号、姓名、3门课的成绩,要求编写用户函数分别实现学生基本信息输入、总成绩计算、最高分学生的查找、学生信息排序(按学生总成绩从高到低)、输出最高分学生的信息,输出所有学生的信息功能。【算法提示】(1)将学生的数据定义成结构体,成员除了学号、姓名、3门课的成绩外,还增设一个3门课总平均成绩成员项;(2)查找总分最高分学生,只要返回学生的序号;(3)学生信息的排序,可选择任一排序算法对学生总成绩从高到低排序;【程序源代码:】#defineN5#include<stdio.h>structstudent{charnum[6];charname[8];intscore[3];inttotal;};voidinput(structstudentstu[N]){//输入模块inti,j;for(i=0;i<N;i++){printf("Pleaseenternum:"); gets(stu[i].num);printf("Pleaseentername:"); gets(stu[i].name);printf("Pleaseenter3score:");for(j=0;j<3;j++)scanf("%d",&stu[i].score[j]); getchar();printf("\n");}}voidsum(structstudentstu[N]){//总分计算模块inti,j;for(i=0;i<N;i++){stu[i].total=0;//先赋初值for(j=0;j<3;j++)stu[i].total+=stu[i].score[j];//计算总分}}intsearchMax(structstudentstu[N]){//查找总分最高分学生模块inti,k=0,max=stu[0].total;//假设第1个学生的总分为最高分 for(i=1;i<N;i++)//与余下的学生总分进行比较if(stu[i].total>stu[k].total) k=i;returnk;}voidprint(structstudentstu[N]){//输出模块inti,j;printf("\nNO.namescore1score2score3\n");for(i=0;i<N;i++){printf("%5s%10s",stu[i].num,stu[i].name);for(j=0;j<3;j++)printf("%9d",stu[i].score[j]);printf("\n");}}voidprintMax(structstudentstu[N]){//输出总分最高分的学生的数据模块inti,j; i=searchMax(stu);//调用查找总分最高分学生的函数printf("\nNO.namescore1score2score3\n");printf("%5s%10s",stu[i].num,stu[i].name);for(j=0;j<3;j++)printf("%9d",stu[i].score[j]);printf("\n");}voidsortScore(structstudentstu[N]){//冒泡排序inti,j;structstudentt; for(i=0;i<N-1;i++) for(j=i+1;j<N-1;j++) if(stu[j].total<stu[j+1].total) {t=stu[j];stu[j]=stu[j+1];stu[j+1]=t;}//2个结构体数组元素的交换}voidprintAll(struct

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论