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;
posted @ 2017-12-15 19:36  晴天*  阅读(292)  评论(5编辑  收藏  举报