程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总Word格式.docx
《程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总Word格式.docx》由会员分享,可在线阅读,更多相关《程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
str[i]<
Z'
)
{num_large++;
}
else
{if('
a'
z'
{num_small++;
}
else
{if('
0'
9'
{num_digit++;
}
else
{if('
'
==str[i])
{num_blank++;
}
else
{num_other++;
}//当前字符比较判断完成
i++;
}
大写字母共%d个\n"
num_large);
小写字母共%d个\n"
num_small);
数字字符共%d个\n"
num_digit);
空格字符共%d个\n"
num_blank);
其他字符共%d个\n"
num_other);
}
/*5-1,5-1_for方式1,5-1_for方式2解决的固定数组方式,这样定义一个数组charstr[101]存放字符串,
这样我们只有输入100个字符的时候,才能充分有效的使用charstr[101]使用的空间,但实际情况是有许多
情况下我们输入的字符串不正好是100个字符,当输入的字符个数小于100个时,则字符数组有多余的空间,浪费!
当输入的字符个数大于100个时,则字符数组空间又不够存放,不行!
所以数组大小只有在运行时才能定义,也就是动态定义
*/
//此处注意我的程序说明的两种方式
stdlib.h>
{char*str;
//定义char型指针
intcharnum;
//字符的个数
请输入你将输入的字符串的字符个数:
scanf("
%d"
&
charnum);
str=(char*)malloc(sizeof(char)*(charnum+1));
//思索sizeof(char)*(charnum+1)为什么是这样的
if(str==NULL)
{printf("
申请内存识别,程序无法执行,只好退出!
else
输入一个字符串,按Enter键结束:
//注意此处没有(最多100个字符)提示了
gets(str);
//如果此处只用一个gets(str)会是怎样效果,我们可讨论
for(i=0;
*(str+i)!
;
i++)//'
{//比较判断当前数组元素(即当前字符)是什么
if('
=*(str+i)&
*(str+i)<
{num_large++;
{num_small++;
{num_digit++;
{if('
==*(str+i))
{num_blank++;
}
else
{num_other++;
}//当前字符比较判断完成
printf("
if(str!
=NULL)
{free(str);
2题
{inti,j,k,*p1,*p2,*p3;
inttemp;
输入三个数据(用逗号分隔):
%d,%d,%d"
i,&
j,&
k);
p1=&
i;
p2=&
j;
p3=&
k;
temp=*p1;
*p1=*p2;
*p2=*p3;
*p3=temp;
i=%d,j=%d,k=%d\n"
i,j,k);
\n"
3题
#defineN10
#defineM3
{charstr[M][N]={"
abcdef"
"
123456789"
123456"
};
char*ss;
inti,maxrow,maxlen,curlen;
maxlen=-1;
maxrow=-1;
for(i=0;
i<
M;
i++)
{ss=str[i];
curlen=strlen(ss);
if(maxlen<
curlen)
{maxlen=curlen;
maxrow=i;
ss=str[maxrow];
最大字符串是:
%s,行号是:
ss,maxrow);
4题
{charstr[]={"
asdasasdfgasdaszx67asdmklo"
charsubstr1[]={"
as"
//根据题目定义的长度为2,即2个字符的字符数组
charsubstr2[]={"
//准备存放从str字符串数组中取2个字符
inti,j,num=0,slen;
intsubchars;
//定义子字符串的字符个数
slen=strlen(str);
//计算字符串的长度,即字符个数
subchars=strlen(substr1);
//计算子字符串的长度,本题目明知是2,但这样写是为了便于程序的通用,
=slen-subchars;
i++)//逐个字符开始,但直到倒数第slen-subchars开始
{for(j=0;
j<
subchars;
j++)
{substr2[j]=str[i+j];
//从第i个字符开始,取subchars个字符
substr2[subchars]='
//最后增加'
是为形成字符串数组
if(strcmp(substr1,substr2)==0)
{num++;
%s字符串中共有%d个%s子字符串。
str,num,substr1);
5题
{intabc[M][M]={{1,2,3},{4,5,6},{7,8,9}};
int*p,sum;
sum=0;
p=&
abc[0][0];
i++)
{sum=sum+*(p+i*M+i);
对角线的元素和是:
%d。
sum);
7题
#defineN5
{intabc[N][N]={{1,1,1,1,1},{0,2,3,4,5},{0,0,3,3,0},{0,0,0,4,6},{0,0,0,0,5}};
int*p;
inti,j,yesno;
//准备,即设置初始值
yesno=1;
//假定当前矩阵是上三角,只要在下三角区有一个元素不是0,就不是上三角矩阵,就不需再判断其余的了
//开始判断
N;
{if(*(p+i*N+j)!
=0)
{yesno=0;
break;
if(yesno==0)
{break;
//break只能终止所在的循环
//输出矩阵
{printf("
%5d"
*(p+i*N+j));
//输出结论
if(yesno==1)
该矩阵是上三角!
该矩阵不是上三角!
8题
#defineM4
#defineN6
{intabc[M][N]={{10,85,85,87,90,88},{11,70,40,55,90,90},{12,70,30,45,90,88},{13,90,100,87,99,100}};
//第0列是学号,其余列是成绩
inti,j,sum,students,kcs;
//students表示学生数,kcs表示课程数
//计算第5门功课的平均成绩
{sum=sum+*(p+i*N+N-1);
第5门功课的平均成绩是:
%.1f\n"
1.0*sum/4);
//找出2名学生至少有两门课不几个
students=0;
{kcs=0;
for(j=1;
j++)//
{if(*(p+i*N+j)<
60)
{kcs++;
if(kcs==2)
{break;
if(kcs==2)
{students++;
printf("
第%d位两门不及格的学生学号是%d\n"
students,*(p+i*N+0));
sum=0;
for(j=1;
{printf("
第%d门课程成绩:
%d\n"
j,*(p+i*N+j));
sum=sum+*(p+i*N+j);
平均成绩是:
(float)sum/(float)(N-1));
if(students==2)
//找到两个有两门以上课不及格就不再找了
//第3个问题
{kcs=1;
//kcs=1假定该生的每门课程成绩是85以上
sum=0;
j++)
85)//判断有没有1门课程成绩在85分一下
{kcs=0;
sum=sum+*(p+i*N+j);
if(sum>
=90*(N-1)&
kcs==1)
学号%d的同学的平均成绩在90分以上,且每门课程成绩在85分以上。
*(p+i*N+0));
{if(sum>
=90*(N-1))
学号%d的同学的平均成绩在90分以上。
{if(kcs==1)
{printf("
学号%d的同学的每门课程成绩在85分以上。
=90*N)//说明该生平均成绩在90分以上
平均成绩:
%.1f,\n"
1.0*sum/(N-1));
if(kcs==1)
{for(j=1;
9题
#defineM10
{intabc[M]={1,2,3,4,5,6,7,8,9,10};
//是10个人的编号
inti,j;
//数组下标
intpersons;
//人数
inttimes;
//计数,1、2、3
intcount;
//思路:
按题目要求每次数到3时,第3个单元删除,即后面元素前移一个位置,当剩下1个时,即persons=1,游戏结束,输出剩下的元素内容
//用指针方式解决
p=abc;
persons=M;
count=0;
times=0;
i=1;
//从第1个人开始数起
while(persons!
=1)
{times++;
//输出变化状态
count++;
第%3d次,数到%d的人的编号是%d,此时人的编号序列是:
count,times,*(p+i-1));
for(j=0;
persons;
%d"
*(p+j));
//输出完毕
if(times==3)//数到3了
{//第1步操作:
进行前移操作
for(j=i;
{*(p+j-1)=*(p+j);
//第2步操作:
调整剩余人数
persons--;
//第3步操作:
重新计数
times=0;
{//没有数到3,调整下一个人
i++;
if(i>
persons)//数过了最后一个人,需从第1个人再重新开始数
{i=1;
指针方式:
剩下的最后1个人是%d号\n"
*p);