C博客作业--指针
一、PTA实验作业
题目1:6-6 输出月份英文名
1. 本题PTA提交列表
2. 设计思路
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
答案错误:其中有一个月份的英文名的首字母大小写出现问题。
题目2:6-8 使用函数实现字符串部分复制
1. 本题PTA提交列表
2. 设计思路
定义整形变量i
for(i=0;i<m-1;i++)
执行m次循环将t的地址推到要求地方
while(*t)
*(s++)=*t; 把值赋给s
t++
循环结束也结束s
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
答案错误:开始就把t的地址赋给s,导致错误。
解决方法:认真查看代码,发现开始的这一步有异常。尝试删除后正确。
题目3:6-10 字符串串动变化
1. 本题PTA提交列表
2. 设计思路
定义字符变量Max为‘ ’,定义数组a
定义整形变量i=0,count=0,index
for(i=0;*(p+i);i++){
如果*(p+i)大于Max,Max=*(p+i),index=i
count++}
把p[index]赋给a[0]
for(i=0;i<index;i++)
把p中index前的值赋给a
for(i=index+1;i<count;i++)
把p中index后的值赋给a
for(i=0;i<count;i++)
把a的值赋给p
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
开始这一块是这样循环,导致p的地址发生了改变,所以最后答案一直有问题,
经过调试发现了问题,询问同学,帮忙找出了错误。对循环体进行了改善使p的地址不变
二、截图本周题目集的PTA最后排名。
三、阅读代码
- IP地址转换
一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制
格式表示的IP地址输出
#include<stdio.h>
int main()
{
char s[33],c;
int sum=0,put[4],cnt=0;
for(int i=1;i<=32;i++){
c=getchar();
sum=sum*2+c-'0';
if(i%8==0){
put[cnt++]=sum;
sum=0;
}
}
printf("%d.%d.%d.%d",put[0],put[1],put[2],put[3]);
return 0;
}
该代码利用ip地址规定的4个二进制转十进制的数定义了数组put来存放
用一句sum=sum*2+c-'0'直接实现字符和整形的转换和二进制和十进制的转换
在8个字符后重新赋值sum。代码很巧妙,所以很简短。
- 课堂派指针
给定程序中,函数fun的功能是:将形参s所指字符串中的所有数字字符顺序前移,
其他字符顺序后移,处理后新字符串的首地址作为函数值返回。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
char *Fun(char *s);
int main()
{
char s[80];
printf("Please input: ");
scanf("%s",s);
printf("\nThe result is: %s\n",Fun(s));
}
char *Fun(char *s)
{
int i, j, k, n;
char *p, *t;
n=strlen(s)+1; /* 字符串的长度,包括结束符标志 */
t=new char[n];
p=s;
j=0; k=0;
for(i=0; i<n; i++)
{
if(isdigit(s[i])) /* 如果是数字 */
p[j++]=s[i];
else
t[k++]=s[i];
}
p[j]=t[k]='\0';
strcat(p,t);
return p;
}
该代码用了两个数组,设置一个循环判断是否为数字,一个数组专门存放
数字。遍历完数组后用库函数strcat把两个数组结合,数字数组放前面就可以了
方法很简单,用库函数问题直接变简单了
四、本周学习总结
1.自己总结本周学习内容
- 指针与数组共通,定义的指针如int *p,把p拿出来p[]就可以变成数组
- 定义的指针需要初始化,不然会出现问题。
- 定义一个指针指向另一个指针,对该指针进行赋值等操作,由于地址内容变化
只要有关该地址的指针都会变化 - 题目中要注意指针的地址问题,地址发生改变,还是对原地址操作会发生错误
2.罗列本周一些错题
- 原回答:fun(a,n)
*n++; - 正确答案:fun(a,&n)
n=n+1
该函数定义的是指针,所以传递过去的应该是地址,所以n前要加&
*n++表示地址加,而该题表示一个个数值所以是*n=*n+1
数组名是地址常量不能变
- 我的回答 Fun(a,x,&n)
break;
j>=i;
a[*n+1}='\0' - 正确答案 Fun(a,x,&n)
break;
j>i;
n=n+1
循环个数没有判断好,应该是j>i
最后要加上n=n+1;
才能跳出循环