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