C博客作业--指针

一、PTA实验作业(5分)

题目1:过滤字符串只保留串中的字母字符

1. 本题PTA提交列表(要提交列表,不是结果)

2. 设计思路(伪代码或流程图)

3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)

4.本题调试过程碰到问题及PTA提交列表情况说明。

一开始把i++判断下一个字符的循环放在外面了,没有考虑判断到不是字母字符时前移的时候的第一个字符也可能不是字母字符,导致没有对4进行判断删除,把i++放到字母字符的判断条件内答案正确。

题目2:求子串在母串中最后一次出现的地址

1. 本题PTA提交列表(要提交列表,不是结果)

2. 设计思路(伪代码或流程图)


  定义变量i,j,k控制循环,num存放子串在母串中最后一次出现的首字母下标,flag用来判断是子串是否在母串中出现,flag=0
  for i=0 to *(s+i)
      for j=0,k=0 to *(s+j)==*(t+k)
           如果t指针能循环到达结束字符'\0',则说明找到子串在母串最后一次出现位置flag=1;
           num存放最后一次出现的首字母下标
  end for
  如果flag==0  返回空指针
  否则  
     k=0,num--防止越过最后地址的第一个字符
     while(*(s+(num++)))
            将num下标后的s字符串内容复制给t字符串
     返回t字符串

3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)

4.本题调试过程碰到问题及PTA提交列表情况说明。


一开始这样写,没注意num加了两次,后来改成
,发现这样写会漏掉第一个a,开始用于判断的num++越过了第一个字母,所以加了个num--,结果正确

题目3:字符串串动变化

1. 本题PTA提交列表(要提交列表,不是结果)

2. 设计思路(伪代码或流程图)

	定义变量i,j,k控制循环,num存放最后一个次出现地址下标,flag=0,flag用于标记是否有子串
	for  i=0  to *(s+i)
		for  j=i,k=0   to  *(s+j)==*(t+k)
			如果循环能到达t数组最后一个字符,flag=1,说明有子串
			num存放下标i
	end for
	如果flag==0  返回空指针
	否则
		k=0
		num--防止越过第一个字符 
		当s数组不是结束符时
			将最后地址后字符串放入t数组中 
		返回字符串t

3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)

4.本题调试过程碰到问题及PTA提交列表情况说明。

刚开始做的时候不知道怎么比较ASCII码值,后来问了下舍友说直接比较就可以了,仔细思考后做出来了。

二、截图本周题目集的PTA最后排名。(2分)

三、阅读代码(2分)

1.说反话加强版

#include <stdio.h>
#include<string.h> 
int main()
{
    char s[500001];
    gets(s);
   int i=strlen(s)-1,count=0;
   char *p;
   while(i>=0)
   {
       if(s[i]==' '){
           if(s[i+1]!=' '&&s[i+1]!='\0'){
               p=s+i+1;
               count++;
               if(count>1) printf(" ");
               printf("%s",p);
           }
           s[i]='\0'; 
       }
       else if(i==0&&s[i]!=' '){
       	p=s;
       	if(count>=1)printf(" ");
       	printf("%s",p);
	   }
     

       i--;
   } 
      return 0;
}

功能:将句中所有单词的顺序颠倒输出
优点:在还没学指针的时候这题可能就卡住了,不懂如何分别存储多个单词再输出,同学代码巧妙的通过指针找出每个单词的首字母的位置并输出该单词,将平常的flag标志换成count来判断是否为首个单词的做法也很巧妙,思路清晰,往后要多练习指针的操作,感觉指针和数组虽然之间是通的,但有些题可能用指针更方便。

2.判断括号使用是否合法

#include<stdio.h>
int main()
{
	char s[111111];
	int count_1=0,count_2=0,n,flag=1;
	
	scanf("%d ",&n);
	gets(s);
	
	for(int i=0;s[i]&&flag;i++){
		if(  s[i]=='('  ) count_1++;
		else if(  s[i]=='{'  ) count_2++;
		else if(  s[i]==')'  ) count_1--;
		else if(  s[i]=='}'  ) count_2--;
		if(count_1<0||count_2<0) flag=0;
		if((s[i]=='('&&s[i+1]=='}')||s[i]=='{'&&s[i+1]==')') flag=0;
	}
	
	if(flag) printf("True\n");
	else printf("False\n");
	return 0;
}

功能:判断括号是否合法
优点:思路清晰、巧妙,代码量少,我只考虑了‘(’‘)’要组合,“{”“}”要组合,还有很多情况没有考虑到,而同学就通过两种情况:1.前后括号分别代表减一加一来看左右括号哪个括号在前,2.“{”“(”跟的符号判断 就解决了,这种做法可读性高又简洁,很值得学习。

四、本周学习总结(1分)
1.自己总结本周学习内容。
熟悉了指针的基本操作,感受到了指针的优点:

  • 1.利用指针的移动可以代替数组的下标,同时指针在函数传参中只传递了地址,提高了运行效率。
  • 2.运用指针有时还能减少代码量。
  • 3.运用指针进行函数调用时通过对指针形参地址的操作可以直接改变实参,不需要返回值,相比数组更方便
  • 4.字符串可以直接赋值给指针变量,像char *p=“string”;这个字符串叫做字符串常量。

2.罗列本周一些错题。


阅读代码能力还需要加强。。

posted @ 2017-12-16 17:47  evfun  阅读(301)  评论(3编辑  收藏  举报