C博客作业--指针
一、PTA实验作业
题目1:6-3 统计大于等于平均分人数
1. 本题PTA提交列表
2. 设计思路(伪代码或流程图)
int fun ( float *s, int n, float *aver )
定义整型变量i,j;浮点型变量sum=0,ave
遍历数组 sum=sum+*(s+i)
求平均分 ave=sum/n*1.0
n=0;
遍历数组,若大于等于ave,n++
*aver=ave
返回n值
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 一开始计算平均分ave的时候,用i-1作为个数,用Dev c验证的时候,答案是正确的,但是提交PTA时总是答案错误,想不明白为什么;
- 后面找舍友帮忙解决,发现传过来的形参中n就表示成绩的个数,改用n后,答案依然正确,PTA提交也正确,和舍友讨论了很久,用i来表示的话最后值会莫名加1,本来i应该等于n的,但是用i答案错误,i-1答案正确,但PTA过不了,所以只能用n;
题目2:6-5 判断回文字符串
1. 本题PTA提交列表
2. 设计思路(伪代码或流程图)
定义一个指针*a=s,定义i=0,j=0,k=0;
遍历数组 i++,a++;i,j都为数组长度
a--;
while(*s!='\0')
如果*s==*a k++;
否则 返回FALSE;
s++;a--;
如果k==i 表示对称,返回TRUE
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 这一题遇到了一个很头疼的问题,在编译器上调试的时候,主函数编译不过去,提交PTA显示编译错误,但是我觉得代码是没问题的,可是没法调试了,这很尴尬,想了很久没想出什么问题;
- 后来在q群上发求助,同学说把typedef enum {false, true} bool;里面的false、true、bool都改成大写,返回值也用大写,而且在PTA里函数之前还要重新写这段代码,编译才过得去;
题目3:6-10 字符串串动变化
1. 本题PTA提交列表
2. 设计思路(伪代码或流程图)
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 这题虽然在PTA上面一次提交正确,但是在编译器上有过错误,主要是后移时j的初值取错了,应该是j=index,我开始用i=index-1;是一个不该犯的错误
- 测试后重新看下代码,立马就发现问题了
二、截图本周题目集的PTA最后排名
三、阅读代码
1.吴军霖古风排版代码
#include<stdio.h>
int main()
{
int n,m,sum;
static char s[1111];
scanf("%d ",&n);
gets(s);
for(sum=0; s[sum]; sum++);
m=sum/n+(sum%n>0);
for(int r=1;r<=n;r++){
//n行m列.
for(int c=m;c;--c){
if(s[n*(c-1)+r-1]) printf("%c",s[n*(c-1)+r-1]);
else printf(" ");
}
printf("\n");
}
return 0;
}
- 这题代码量很少,但是方法很巧妙,也有点难理解,定义sum,用循环求出排版需要的列数m,m=sum/n+(sum%n>0)是最巧妙的地方,随后用嵌套循环逐列从右到左输出字符,这里巧妙的找到了行、列的值与下标之间的关系,遇到结束符输出空格,直到最后一行最后一列;
2.删除字符子串的代码
#include<stdio.h>
int main()
{
char s[81],sub[81];
gets(s);
gets(sub);
int i,j;
do{
for(i=0,j=0;s[i];i++){
if(s[i]=sub[0]){
for(int u=1;sub[u];u++) if(s[i+u]!=sub[u]) break;
if(sub[u]='\0') i=i+u;
}
}
s[u++]=a[i++];
}while(u!=i);
puts(s);
return 0;
}
- 利用三个循环,对数组进行重新构建,遍历母串,如果找到一个字符等于子串的第一个字符,判断接下去的字符是否都跟子串对应相等,如果不等,跳出循环,都相等,i就跳过一个子串的长度,s[u++]=a[i++]为构建数组的操作,不断循环判断,直到u==i;
四、本周学习总结
1.自己总结本周学习内容
(1) 用指针表示数组,可以通过指针对数组进行操作;
int a[10];
int *p;
p=a;
//可以通过指针p对数组赋值,*(p+1)=1;即a[1]=1
(2)将指针作为形参传入函数,可以在函数里用指针,对对应的实参进行操作,而且操作保留,可以返回多个值,例如;
void fun(int *p,int *q);
int main()
{int a,b;
scanf("%d%d",&a,&b);
fun(&a,&b);
printf("%5d%5d\n",a,b);
return 0;
}
void fun(int *p,int *q)
{
int m,n;
m=*p%100;
n=*q%100;
*p=*p/100*100+n;
*q=*q/100*100+m;
}
(3)初步了解了结构,结构大概就是自己定义的一个数据类型,里面可以包含很多成员,成员的类型也可以多种;
(4)如何定义结构类型(struct是关键字+结构名)
struct point{
double x;
int y;
};
(5)结构的嵌套定义:
struct date{
int year,month,day;
};
struct student{
int num;
char name[10];
int computer,english,math;
double average;
struct date addr;
};
(6)在main函数中可以定义结构变量,结构变量通过结构成员操作符“.”对某个成员进行引用,如果两个结构变量类型相同,也可直接赋值;如:
struct student{
int num;
char name[10];
int computer,english,math;
double average;
};
int main(){
struct student s1,s2;
s1.num=2;
s1,average=60.5;
s1=s2;
(7)上周第一次做流程图,一些简单的代码懂得用流程图来表示了,也学会了一些作图软件的基本操作;
2.罗列本周一些错题
- 这题主要对指针的运用还是不太熟练,指针p应该指向s,还有后面返回值应该返回p,a完全是我捏造出来的;
- 调用函数需要一个返回值,所以要将结果赋给变量sum;
- 这题对题目没有理解,导致都错了
- 做得太急,这个函数不需要返回值,最后n=n-1表示删除后的最后一个元素;
- 形参传的应该是n的地址,n表示地址,n++便是地址加1,应该用n=n+1;