资源描述
课后习题1答案
一、选择题
1、A 2、D 3、C
二、编程题
1.
#include <stdio.h>
int main()
{
printf("****************************\n");
printf("* Hello World! *\n");
printf("****************************\n");
return 0;
}
2.
#include <stdio.h>
int main()
{
printf(" *\n");
printf(" ***\n");
printf(" *****\n");
printf("*******\n");
return 0;
}
课后习题2答案
一、选择题
1-5、 DDBAB
6-10、 DDABA
11-15、CAABA
16、 B
二、填空题
1、54,146,255
2、字母,数字,下划线
3、(换行字符)换行,(退格字符)移动到当前行的前一个位置,(反斜杠字符)产生反斜杠字符
4、float,double,char
5、(10101010)2,(00010000)2
6、(11111011)2,(373)8,(fb)16
7、0000000010011101, 0000000010011101,
1000000010011001,1111111101100111
课后习题3答案
一、选择题
1-5、 CB DACD
6-10、 CCBAC
11-15、CADDB
16-17、CD
二、填空题
1、-16
2、12,4
3、m/100,m/10%10,m%10
4、(注:□表示空格)
□□□□12##
12□□□□##
□□3.1415926000##
3.1415926000□□##
5、55,A,B
三、编程题
1.
#define PI 3.14
#include <stdio.h>
#include <math.h>
int main()
{
float r,s,l;
scanf("%f",&r); /*输入圆的半径*/
s= PI*r*r; /*计算圆的面积*/
l=2*PI*r; /*计算圆的周长*/
printf("r=%4.1f,s=%4.1f,l=%4.1f\n",r,s,l);
return 0;
}
运行结果:
3↙
r= 3.0,s=28.3,l=18.8
2.
#include <stdio.h>
int main()
{
float x,y,z,s,v;
scanf("%f%f%f",&x,&y,&z); /*输入长方体的长、宽和高*/
s=2*(x*y+x*z+y*z); /*计算长方体的表面积*/
v=x*y*z; /*计算长方体的体积*/
printf("Area=%.2f,Volume=%.2f\n",s,v);
return 0;
}
运行结果:
3 4 5↙
Area=94.00,Volume=60.00
3.
#include <stdio.h>
#include <math.h>
int main()
{
float x1,y1,x2,y2,x3,y3,a,b,c,p,s;
/*输入3个顶点的坐标*/
scanf("%f%f%f%f%f%f",&x1,&y1,&x2,&y2,&x3,&y3);
/*求第一条边的长度*/
a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
/*求第二条边的长度*/
b=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
/*求第三条边的长度*/
c=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
p=(a+b+c)/2;
/*求三角形的面积*/
s=sqrt(p*(p-a)*(p-b)*(p-c));
printf("Area=%f\n",s);
return 0;
}
运行结果:
5 6 3 8 0 23↙
Area=12.000013
课后习题4答案
一、选择题
1-5、 CCCCC
6-8、 DBB
二、填空题
1、0
2、y%2或y%2==1
3、(x<0 && y<0 && z>0) || (x<0 && y>0 && z<0) || (x>0 && y<0 && z<0)
4、0
5、x>2 && x<3 || x<-10
6、13
7、①c=c+5
②c=c-21
8、①a+b>c && a+c>b && b+c>a
②a==b && b==c
③a==b || a==c || b==c
9、0.600000
10、①x>=0
②x<amin
11、①4-i
②2*i-1
12、####
###*
##**
#***
13、a=16,y=60
三、编程题
1.
#include <stdio.h>
int main()
{
int a,b,num;
scanf("%d,%d",&a,&b);
if(a*a+b*b>100)
num=(a*a+b*b)/100;
else
num=a+b;
printf("%d",num);
return 0;
}
运行结果:
(1)测试数据一:
3 4↙
7
(2)测试数据二:
9 5↙
1
2.
#include <stdio.h>
int main()
{
int x;
float y;
scanf("%d",&x);
if(x<=0)
y=0;
else if(x<=10)
y=x;
else if(x<=20)
y=10;
else if(x<40)
y=-0.5*x+20;
printf("%f\n",y);
return 0;
}
3.
#include<stdio.h>
int main()
{
int score;
char grade;
scanf("%d",&score); /*输入百分制成绩*/
switch(score/10)
{
case 10:
case 9:
grade='A';
break;
case 8:
grade='B';
break;
case 7:
grade='C';
break;
case 6:
grade='D';
break;
default:
grade='E';
}
printf("%c\n",grade);
return 0;
}
运行结果:
96↙
A
4.
#include<stdio.h>
int main()
{
int i;
for(i=1;i<=99;i++)
if(i*i%10==i || i*i%100==i)
printf("%d\n",i);
return 0;
}
运行结果:
1
5
6
25
76
5.
#include<stdio.h>
int main()
{
int n,i,j;
printf("请输入行数:");
scanf("%d",&n);
/*外层循环控制输出的行数*/
for(i=1;i<=n;i++)
{
/*输出每行的空格*/
for(j=1;j<=i-1;j++)
printf(" ");
/*输出每行的星号*/
for(j=1;j<=2*n+1-2*i;j++)
printf("*");
/*输出换行符*/
printf("\n");
}
return 0;
}
6.
#include<stdio.h>
#define EPS 1E-7
int main()
{
int n;
double x,an,sum;
printf("input x:");
scanf("%lf",&x);
sum=0;
an=1;
n=1;
do
{
sum+=an;
an*=(-x*x)/((n+1)*(n+2));
n+=2;
}while(fabs(an)>=EPS);
printf("sin(%.4lf)=%.4lf\n",x,sum);
return 0;
}
课后习题5答案
一、选择题
1-5、 DABDC
6-8、 DCB
二、填空题
1、①j=2
②j>=0
2、Search Successful!The index is:5
3、①j+=2
②a[i]>a[j]
4、#&*&%
三、编程题
1.
#include<stdio.h>
#define N 30
int main()
{
int array[N],i,j,sum=0;
float arrAver[6];
for(i=0;i<N;i++)
array[i]=2*(i+1);
for(i=0;i<6;i++)
{
/*按顺序求5个数的和*/
for(j=0;j<5;j++)
sum+=array[5*i+j];
/*求5个数的平均值*/
arrAver[i]=sum/5.0;
}
for(i=0;i<6;i++)
printf("%.2f ",arrAver[i]);
printf("\n");
return 0;
}
运行结果:
6.00 22.00 48.00 84.00 130.00 186.00
2.
#include<stdio.h>
#define M 5
#define N 4
int main()
{
int arr[M][N]={{1,2,3,4},{5,6,7,8},{9,10,11,12},
{13,14,15,16},{0,0,0,0}};
int i,j;
for(j=0;j<N;j++)
for(i=0;i<M-1;i++)
arr[M-1][j]+=arr[i][j];
for(j=0;j<N;j++)
printf("%d ",arr[M-1][j]);
printf("\n");
return 0;
}
运行结果:
28 32 36 40
3.
#include<stdio.h>
#define M 5
#define N 4
int main()
{
int a[M][N];
int i,j,maxj,count=0,flag;
printf("请输入%d*%d阶矩阵A:\n",M,N );
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
for(i=0;i<M;i++)
{
maxj=0;
for(j=1;j<N;j++) /*找到第i行中最大的那个元素的列下标*/
if(a[i][maxj]<a[i][j])
maxj=j;
flag=1;
/*定位第maxj列,看看a[i][maxj]是否是该列中最小的那个元素
如果是不是,则flag为0;如果是,则flag保持为1*/
for(j=0;j<M;j++)
if(a[j][maxj]<a[i][maxj])
flag=0;
if(flag==1)
{
count++;
printf("第%d个鞍点:a[%d][%d]=%d\n",
count,i,maxj,a[i][maxj]);
}
}
if(count==0)
printf("没有鞍点");
return 0;
}
4.
#include<stdio.h>
#define N 40
int main()
{
int i,j=0,iMax,max,count;
char str[N];
char insertStr[5]={'(','m','a','x',')'};//待插入的多个字符“(max)”
printf("输入一个字符串:");
gets(str);
/*用假设法求字符串str中最大的元素max和最大元素所在的下标iMax*/
count=strlen(str);/*字符串str中字符元素的个数*/
max=str[0]; /*假设字符串的第一个字符最大*/
iMax=0; /*字符串中最大字符的下标置为0*/
for(i=1;i<count;i++)
if(str[i]>max)
{
max=str[i];/*字符串中最大的字符存放到max中*/
iMax=i; /*字符串中最大的字符的下标存放到iMax中*/
}
/*字符串最大的字符后的字符依次往后移动5个字符*/
for(i=count-1;i>iMax;i--)
str[i+5]=str[i];
/*字符串最大的字符后插入字符串“(max)”*/
for(i=iMax+1;i<=iMax+5;i++)
{
str[i]=insertStr[j];
j++;
}
/*新串的末尾加上\0*/
str[count+5]='\0';
puts(str);
return 0;
}
运行结果:
MyFriend↙
My(max)Friend
5.
#include<stdio.h>
#define M 40
#define N 20
int main()
{
char strA[M],strB[N],cntB,i=0,j=0;
printf("请输入字符串a:");
gets(strA);
printf("请输入字符串b:");
gets(strB);
cntB=strlen(strB);
/*找到a串的末尾*/
while(strA[i]!='\0')
i++;
if(cntB<5)
{
/*将b串的所有字符都连接到a串末尾*/
while(strB[j]!='\0')
{
strA[i+j]=strB[j];
j++;
}
}
else
{
/*将b串的前5个字符连接到a串末尾*/
while(j<5)
{
strA[i+j]=strB[j];
j++;
}
}
/*新串的末尾加上串结束标志\0*/
strA[i+j]='\0';
puts(strA);
return 0;
}
运行结果:
(1)测试数据一:
请输入字符串a:hubei↙
请输入字符串b:wuhan↙
hubeiwuhan
(2)测试数据二:
请输入字符串a:shanxi↙
请输入字符串b:xian↙
hubeiwuhan
6.略
7.
#include <stdio.h>
#define N 6
int main()
{
/*学生的学号数组*/
char num[N][9]={"99077101","99077102","99077103","99077104",
"99077105","99077106"},tmpNum[9];
/*学生的姓名数组*/
char name[N][8]={"张红","王建","王连","李立","刘虹",
"丁平"},tmpName[8];
/*学生的四门课程数组*/
int score[N][4]={{85,90,92,88},{90,95,95,90},{76,78,80,70},
{56,36,66,97},{78,79,87,89},{89,79,70,87}},tmpScore;
int sum[N],i,j,k;
float aver[N],tmpAver; /*学生平均分数组*/
/*求每个学生4门课程成绩的总分sum和平均分ave*/
for(i=0;i<N;i++)
{
sum[i]=0; /*每个学生4门课程成绩总分置0*/
for(j=0;j<4;j++)
sum[i]+=score[i][j];
aver[i]=(float)sum[i]/4;
}
/*用冒泡排序法将学生信息按升序排序*/
for(i=1;i<N;i++)
for(j=0;j<N-i;j++)
{
if(aver[j]>aver[j+1])
{
/*交换平均成绩*/
tmpAver=aver[j];
aver[j]=aver[j+1];
aver[j+1]=tmpAver;
/*交换学号*/
strcpy(tmpNum,num[j]);
strcpy(num[j],num[j+1]);
strcpy(num[j+1],tmpNum);
/*交换姓名*/
strcpy(tmpName,name[j]);
strcpy(name[j],name[j+1]);
strcpy(name[j+1],tmpName);
/*交换成绩*/
for(k=0;k<4;k++)
{
tmpScore=score[j][k];
score[j][k]=score[j+1][k];
score[j+1][k]=tmpScore;
}
}
}
/*按格式输出学生所有信息*/
printf(" 学号\t 姓名\t 数学\t 物理\t 英语\t计算机\t
平均成绩\n");
for(i=0;i<N;i++)
{
printf("%s\t%s\t",num[i],name[i]); /*输出学号和姓名*/
for(j=0;j<4;j++)
printf("%4d\t",score[i][j]); /*输出4科成绩*/
printf("%6.1f\n",aver[i]); /*输出平均分*/
}
return 0;
}
课后习题6答案
一、选择题
1-5、 DBADB
6-10、 BABBB
二、填空题
1、0 2 4 6 8 10 12 14 16 18
0 2 4 6 8 10 12 14 16 18
2、8,17
3、1010
4、7
三、编程题
1.
#include <stdio.h>
int F(int);
int main()
{
int a;
printf("input a number:");
scanf("%d",&a);
if (F(a)==0)
printf("不是水仙花数。\n");
else
printf("是水仙花数。\n");
return 0;
}
int F(int a)
{
int b,c,d;
b=a/100; /*百位*/
c=a%100/10; /*十位*/
d=a%10; /*个位*/
if (a==b*b*b+c*c*c+d*d*d)
return 1;
else
return 0;
}
2.
#include<stdio.h>
#define N 30
/*函数名:提取str数组中的数字字符,转换成数字存放到num数组中
函数参数:str为字符数组
num为整型数组
返回值:num数组中数字的个数*/
int fun(char str[],int num[])
{
int i,f=0,n=0,j=0;
for(i=0;str[i]!= '\0';i++)/*遍历整个数组str元素 */
{
if(str[i]>='0' && str[i]<='9') /*为数字字符*/
{
num[j]=str[i]- '0'; /*将数字字符转换为数字*/
j++;
}
}
return j; /*返回num数组中有多少个数字*/
}
int main()
{
char string[N];
int number[N];
int n,i;
long sum=0;
gets(string);
n=fun(string,number);/*number数组中有n个数字元素*/
/*将number数组中的数字转换成整数值,存放到sum变量中*/
sum=number[0];
for(i=1;i<n;i++)
sum=sum*10+number[i];
printf("%ld\n",sum);
return 0;
}
3.
(1)递归程序
#include <stdio.h>
int half(int s[],int a,int b,int key)
{
int mid;
if(a==b)
if(key==s[a])
return (a);
else
return (-1);
else
{
mid=(a+b)/2;
if(key<s[mid])
return(half(s,a,mid-1,key));
if(key>s[mid])
return(half(s,mid+1,b,key));
if(key==s[mid])
return (mid);
}
}
(2)非递归程序
#include <stdio.h>
int half(int s[],int a,int b,int key)
{
int left=0;
int right=n-1;
int middle;
while(left<=right)
{
middle=(left+right)/2;
if (x==s[middle])
return middle;
else if (x>s[middle])
left=middle+1;
else
right=middle-1;
}
return -1;
}
课后习题7答案
一、选择题
1-5、 CBDCD
6-10、 CBACA
11-12、DC
二、填空题
1、30
2、12,10,10,12
3、*(p+5)
4、①*p
②p-str
5、4
6、9876876
7、*(p+4*i+j)
8、p[i][j] 或 *(*(p+i)+j) 或 (*(p+i))[j]
9、①p
②q<p+n
③*q>max
④*q<min
三、程序设计题
1.
方法一:
#include <stdio.h>
#include <string.h>
/*函数功能:将字符串str2逆序后放入字符串str1中
函数参数:字符串指针str1
字符串指针str2
函数返回值:void*/
void strreverse(char *str1,char *str2)
{
char *p1,*p2;
int len2;
/*获取str2所指向的字符串的长度*/
len2=strlen(str2);
p1=str1;
p2=str2+len2-1;
/*将str2所指向的字符串其逆序放入str1中*/
while(p2>=str2)
{
*p1=*p2;
p1++;
p2--;
}
/*str1所指向的字符串的末尾增加串结束标志*/
*p1='\0';
}
int main()
{
char str1[20];
char str2[20];
scanf("%s",str2);
strreverse(str1,str2);
printf("逆序后的字符串为:%s\n",str1);
return 0;
}
方法二:
#include <stdio.h>
#include <string.h>
/*函数功能:将字符串str2逆序后放入字符串str1中
函数参数:字符串指针str1
字符串指针str2
函数返回值:void*/
void strreverse(char *str1,char *str2)
{
int len2,i;
char tmp;
/*获取str2所指向的字符串的长度*/
len2=strlen(str2);
/*将str2所指向的数组元素全部逆序*/
for(i=0;i<len2/2;i++)
{
tmp=*(str2+i);
*(str2+i)=*(str2+len2-1-i);
*(str2+len2-1-i)=tmp;
}
/*将str2所指向的数组中的元素依次拷贝到str1所指向的数组中*/
for(i=0;i<len2;i++)
*str1++=*str2++;
/*str1所指向的数组的末尾加\0*/
*str1='\0';
}
int main()
{
char str1[20];
char str2[20];
scanf("%s",str2);
strreverse(str1,str2);
printf("逆序后的字符串为:%s\n",str1);
return 0;
}
运行结果:
abcdefg
逆序后的字符串为:gfedcba
2.
方法一:
#include <stdio.h>
#include <stdio.h>
/*函数功能:将书名按照由大到小的顺序排序
函数参数:书名的二维数组bookName
书的本数n
函数返回值:void*/
void sort(char bookName[][8],int n)
{
char tempName[8];
int i,j;
for(i=1;i<=n-1;i++) /*冒泡法排序*/
{
for(j=1;j<=n-i;j++)
if(strcmp(bookName[j-1],bookName[j])>0)
{
strcpy(tempName,bookName[j-1]);
strcpy(bookName[j-1],bookName[j]);
strcpy(bookName[j],tempName);
}
}
}
/*函数功能:输出各字符串
函数参数:书名的二维数组bookName
书的本书n
函数返回值:void*/
void print(char bookName[][8],int n)
{
int i;
for(i=0;i<n;i++)
printf("%s\n",bookName[i]);
}
int main()
{
char name[][8]={"Java","C","PHP","HTML","Pascal"};
int n=5;
sort(name,n); /*对字符串排序*/
print(name,n); /*输出排序好的各字符串*/
return 0;
}
方法二:
#include <stdio.h>
#include <stdio.h>
/*函数功能:将书名按照由大到小的顺序排序
函数参数:指针数组name
数组元素个数n
函数返回值:void*/
void sort(char *name[],int n)
{
char* temp=NULL;
int i,j;
for(i=1;i<=n-1;i++) /*冒泡法排序*/
{
for(j=1;j<=n-i;j++)
/*name[k]是第k个字符串的起始地址*/
if(strcmp(name[j-1],name[j])>0)
{
temp=name[j-1];
name[j-1]=name[j];
name[j]=temp;
}
}
}
/*函数功能:输出各字符串
函数参数:指针数组name
数组元素个数n
函数返回值:void*/
void print(char *name[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%s\n",name[i]);
}
int main()
{
char *name[]={"Java","C","PHP","HTML","Pascal"};
int n=5;
sort(name,n); /*对字符串排序*/
print(name,n); /*输出排序好的各字符串*/
return 0;
}
课后习题8答案
一、选择题
1-5、 ABDDD
6-10、 CCCCA
11-12、CC
二、填空题
1、(*b).day , b->day
2、ex
3、①2
②3
4、2002Shangxian
5、①char *data;
②struct link *next;
6、①struct list *next;
②int data;
7、x.link=z;
8、13431
9、①(struct list *) malloc(sizeof(struct list));
②(struct list *)malloc(sizeof(struct list));
③return(h); 或 return h;
10、①break;
②pre->next=newp;
③newp->next=suc;
三、编程题
1.
难度系数:★★★★☆
解题思路:用daytab数组存放非闰年和闰年各月份的天数。对于年year,判断其是否为闰年的条件为:
leap=(year%4==0&&year%100!=0||year%400==0);
用一个结构体类型date的变量dt存放用户输入的日期。
程序如下:
#include<stdio.h>
/*数组daytab存放非闰年和闰年各月份的天数*/
int daytab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
/*日期struct date结构体*/
struct date
{
int year;
int month;
int day;
}dt;
/*函数功能:求指定日期是该年的第几天
函数参数:年year
月month
日day
函数返回值:整数第几天day*/
int day_of_year(int year,int month,int day)
{
int i,leap;
/*是闰年leap=1,非闰年leap=0*/
leap=(year%4==0&&year%100!=0||year%400==0);
for(i=1;i<month;i++)
day+=daytab[leap][i];
return day;
}
/*函数功能:由年份year和天数yearday求月份pmonth和日号pday
函数参数:年份year
天数yearday
对应的月份pmonth
对应的日号pday
函数返回值:void*/
void month_day(int year,int yearday,int *pmonth, int *pday)
{
int i,leap;
leap=(year%4==0&&year%100!=0|| year%400==0);
for(i=1;yearday>daytab[leap][i];i++)
yearday-=daytab[leap][i];
*pmonth=i;
*pday=yearday;
}
int main()
{
int k,days;
while(1) /*用户选择:起到菜单的作用*/
{
printf("1:日期→天数\n2:年,天数→日期\n其他:退出\n
请选择:\n");
scanf("%d",&k);
if(k==1)
{
printf("输入日期(年 月 日):\n");
scanf("%d%d%d",&dt.year,&dt.month,&dt.day);
printf("%d年%d月%d日是这一年的第%d天\n",dt.year,dt.month,
dt.day,day_of_year(dt.year,dt.month,dt.day));
}
else if(k==2)
{
printf("输入年份 天数:\n");
scanf("%d%d",&dt.year,&days);
month_day(dt.year,days,&dt.month,&dt.day);
printf("对应日期是%d年%d月%d日\n",
dt.year,dt.month,dt.day);
}
else
break;
}
return 0;
}
运行结果:
2.
难度系数:★★★☆☆
算法设计:
step 1 定义学生链表节点。
step 2 参照教材中的程序8-7,定义创建链表函数create,显示链表节点数据信息函数display,释放链表所有节点内存函数destroy。其中创建链表函数create
展开阅读全文