程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总.docx

上传人:b****5 文档编号:8310319 上传时间:2023-01-30 格式:DOCX 页数:13 大小:18.39KB
下载 相关 举报
程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总.docx_第1页
第1页 / 共13页
程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总.docx_第2页
第2页 / 共13页
程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总.docx_第3页
第3页 / 共13页
程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总.docx_第4页
第4页 / 共13页
程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总.docx

《程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总.docx》由会员分享,可在线阅读,更多相关《程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总.docx(13页珍藏版)》请在冰豆网上搜索。

程序设计基础c语言科学出版社第五章指针教材习题答案详解汇总.docx

程序设计基础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");

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1