C语言博客作业05--指针

1.本章学习总结(2分)

1.1 思维导图

1.2 本章学习体会及代码量学习体会

1.2.1学习体会

学习体会:光阴似箭,转眼间一个月又过去了,学习更加坦然了。这好比下棋,下棋少的人步步惊心很在乎输赢,下棋多的人不断到时觉得不是那么重要了,大概这是一种坦然。打代码总是有解不出来的题,一个人也有状态不好的一天,如果真的要在乎那么多,人生会变得很累。学习体会说说具体的,1.采用我自创的新的学习方法,开始跟上课堂进度了。2.指针数组这块内容不是特别难,只要用心一般都能跟上。3.学习了一些指针的知识,时间还是安排不过来,没有花太多时间复习,原因有几点,第一点是不知道要花多长时间复习,第二点是就算花了时间复习也很容易遗忘,第三点是知识还难以灵活应用,做习题时还是要查书。
不懂得地方:二维数组的指针还是不清楚,pta的一些题目用起指针很牵强,很想不用指针做,总的来说是不流畅。指针方面的思维还未建立。

1.2.2代码量

2.PTA总分

2.1截图PTA中题目集的排名得分

2.2我的总分:110

3.PTA实验作业

3.1PTA题目1

给定一句英语,要求编写程序,将句中所有单词的顺序颠倒输出。

3.1.1算法分析

void Fun(char*p,int g)
   begin 
        g=g-1
    	while(1)
    		while((*(p+g)=='
')且(g>=0))
    		   g--;
    		if(g<0)then return;
    		for(i=g;(*(p+i)!='
')且(i>=0);i--)//由后往前寻找单词第一个字母的位置 
    		   n1=i;
    		for(j=n1;(*(p+j)!='
')&&(j<=g);j++)//输出单词 
    		    输出*(p+j)
    		    g=i;
    		if(g<=0)  then return;
    		while((*(p+g)=='
')且(g>=0))
    		   g--;
    		if(g>=0)
    		   输出空格
  	 end while
   end
主函数
  	定义字符数组  a[500001];
  	gets(a);
  	g=strlen(a);
  	for i =0 to g-1//除去重复的空格 
  	    if a[i]为空格
    		   then  a[i]='
';
               end if
        end for
  	Fun(a,g); 
end

3.1.2代码截图

3.1.3PTA提交列表及说明

Q1:这道题开始时审题不明,没有注意到需要是倒着输出字符串同时不能有重复的空格。
A1:审题清楚后开始作答,有得到一些分数。、
Q2:虽然得到了大部分分数,但是还有三个测试点没过。
A2:是格式错误,最后都会出现空格,这点我修改了条件,在循环语句开始时加入了一个判断,如果数组到了开头,不用输出空格。

4.大作业(5分)

4.1.改造函数介绍

1.函数1、

int Stage1()
{
	定义数组number1
	输入题目数
	while(1)
	{
		getchar();
		if输入的数据合法 then break  
                end if
		system("cls"); 
		getchar();
		输出"输入20000结束游戏,输入10000重新开始游戏
"
		输出“请按正确的格式输入题目数
"
	}
	system("cls");  //清屏
	if(number==20000)return 0;//输入20000结束游戏
	if(number==10000)return 3;//输入10000重新开始
 	for i=1to number
	       number1[0]=rand()%10+'0';
		number1[2]=rand()%10+'0';
		number1[3]='=';
		switch(rand()%4)//生成运算 
		{
			case 0:number1[1]='*';result=Result(number1);break;
			case 1:
			if(number1[2]=='0')
		
		          then     number1[2]='/';
		    
		      else
		    	  number1[1]='/';//转换为小数点后两位 
		    	   r esult=Result(number1);
		    	  result=(int)((result+0.005)*100);
		    	   result=(double)result/100;
	            end if
			break;
			case 2:number1[1]='+';result=Result(number1);break;
			case 3:number1[1]='-';result=Result(number1);break;
                 end  switch
		if(number1[2]==0且number1[1]=='/')i--;
		else
			输出"输入20000结束游戏,输入10000重新开始游戏
"
			if (number1[1]=='/') then printf("如果答案超过两位小数则四舍五入保留两位小数,输入结果
");
                        end  if
			else printf("请输入结果
");
			printf("%s",number1);
		    while(1)
		            if  输入数据合法 then break
                            end  if
					system("cls");
					getchar();
					printf("输入20000结束游戏,输入10000重新开始游戏
") ;
					printf("请按正确的格式输入结果!
");
					printf("%s",number1);;
			end while
			if(scanResult==20000)  then  return 0;
			else if(scanResult==10000)   then   return 3;
			else if(scanResult==result)
				  	if(number1[1]=='/')
				             then  printf("答案是%.2f
",result);
				        else printf("答案是%.0f
",result);
                                        end if
				       IfRight();
				       right++;
                               else
                                           if(number1[1]=='/')
				                then printf("答案是%.2f
",result);
				         else printf("答案是%.0f
",result);
                                         end  if
				        IfWrong();
			 	        wrong++;
                                end if
	    system("pause"); 
	    system("cls");  
    }
    return 1;
}



2.函数2

double Result(char*p)
  begin
	for(;*p>='0'&&*p<='9';p++)//转换为十进制数 
	   sum=sum*10+*p-'0';
        end for
	   while(1)
		note=*p;//转换符号 
		if(note=='=')//返回结果 
		  then  return sum;
                end  if
		p++;
		for(;*p>='0'&&*p<='9';p++)
		    number1=number1*10+*p-'0';
		 end for
		switch(note)//运算 
			case '+':sum=sum+number1;break;
			case '-':sum=sum-number1;break;
			case '*':sum=sum*number1;break;
			case '/':sum=1.0*sum/number1;break;
	        end switch
		number1=0;//初始化
          end while
    end

3.函数3

int main()
begin
  int k;
  while(1)
		 void print();
		  int stage;//表示难度等级 
		  srand(time(0));//生成随机数 
		 
		        print();
			    printf("输入等级:");//等级判断 
			    while(scanf("%d",&stage)==0||((stage!=1)&&(stage!=2)&&(stage!=3)&&(stage!=10000)&&(stage!=20000)))
			{
				system("cls");    
			    getchar();//getchar( )用于吸收系统储存的数据 
			    print();  
				printf("请按正确的格式输入等级
");
				printf("输入等级:");
			 }
			    
             switch(stage)
			{
			   case 1:k=Stage1();break;
			   case 2:k=Stage2();break;
			   case 3:k=Stage3();break;
			   case 20000:printf("游戏结束");return 0;
			   case 10000: system("cls"); continue; 
			}	
		  if(k==0)//对数据进行判断 
		   {
		   		printf("游戏结束");
		   		return 0;
		   }
		   if(k==1)
                        then
		        CorrectRate();
		         system("pause");
				 printf("输入20000结束游戏,输入10000重新开始游戏") ;  	
				 while(1)
	            	system("cls");      
	            	printf("输入20000结束游戏,输入10000重新开始游戏") ;
	            	printf("
输入:");
					getchar(); 
	            	scanf("%d",&k);
	            	if(k==10000||k==20000)break;
		        end if
				   if(k==20000)
			            then
			   		printf("游戏结束");
			   		return 0;
			           end if
			  if(k==10000)
			             then
					  system("cls");    
					  continue; 
					  stage=0;
			  end  if
		    end if
		   if(k==3)
		           then 
			   system("cls");
			   right=0;
			   wrong=0;    
			   continue; 
			   stage=0;//结果清零 
		  end if
       end while
  return 0;
end



4.3 与原有函数代码比较

1.函数1中,原代码采用定义两个数来储存数据,在当前代码中运算,新代码采用数组储存数据,调用函数进行运算。新代码显得更简洁,整个算式更完整,同时运用指针,传输速度快。
2.函数2的变化不大,和原来的代码相比运用了switch函数,整体框架更强。
3.函数3为新增函数,于原来的代码相比数据的完整性更强,可以处理字符型运算。

4.4 改进大作业总结

1.关于审题,我一开始一直不明白代码要怎么改,老师的题目看了很多遍,最后明白需要运用指针,传输字符串,通过字符串运算。
2.在设计新函数的过程中总是出错,发现自己遗忘了一些以前的知识比如switch函数要使用break。还用就是对循环语句及指针的移动把握不准,很容易犯边界错误。
3.时间安排不够,对大作业的完成时间不清楚,导致后面一直赶作业。
原文地址:https://www.cnblogs.com/1112wlt/p/10127147.html