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


    1.本章学习总结

    1.1 思维导图

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

    1.2.1 学习体会##

    通过学习指针,再利用指针处理数组的题目,发现指针相对于数组代码量减少,例如做字符型数组时需要遍历每个字符比较大小并调换位置,之前做法是通过两个for循环以及多个if语句判断完成,在学习指针后,学到了许多有用的函数,例如字符型函数strcpy(用于赋值)、strcat(用于连接两个字符串)、strcmp(用于比较两个字符串的大小)等,通过这些函数并结合指针的运用,大大减少了使用数值时出现的重复、需要考虑多次、代码量较大的问题。指针贯穿了数组和之后学习的结构体和文件,在之后的学习中指针都是必不可少,当然在学习指针时也遇到许多问题,例如指针的指向问题,相关表达式的理解。
    

    1.2.2 代码累计##

    2.PTA总分

    2.1截图PTA的排名得分##

    2.2 我的总分:105

    3.PTA实验作业

    3.1 PTA题目1##

    本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。
    

    3.1.1 算法分析##

    定义n存放字符串中的字符数
    if n%2==0 字符串类型为xyzzyx型
    for i=0 to(n-1)/2
    if(s[i]==s[n-1-i])  判读对称字符是否相等
    continue;
    else
    返回  false
    end if
    end for
    else  n%2!=0  字符串类型为xyzyx型
    for i=0 to n/2
    if(s[i]==s[n-1-i])  判读对称字符是否相等
    continue;
    else
    返回  false
    end if
    end for
    return ture ;
    

    3.1.2 代码截图##

    #include <stdio.h>
    #include <string.h>
    
    #define MAXN 20
    //typedef enum {false, true} bool;
    
    bool palindrome( char *s );
    
    int main()
    {
        char s[MAXN];
    
        scanf("%s", s);
        if ( palindrome(s)==true )
            printf("Yes
    ");
        else
            printf("No
    ");
        printf("%s
    ", s);
    
        return 0;
    }
    bool palindrome( char *s )
    {
    	int i,n;
    	n=strlen(s);    //计算字符串字符数// 
    	if(n%2)               //判断字符数为奇数或偶数// 
    	{                      //偶数执行以下语句// 
    		for(i=0;i<(n-1)/2;i++)
    		{
    			if(s[i]==s[n-1-i])          //判断前半部分的每个字符对应后半部分字符是否相等// 
    			continue;
    			else
    			return false;                  //出现不想等情况,直接返回false// 
    		}
    	}
    	else
    	{
    		for(i=0;i<n/2;i++)
    		{
    			if(s[i]==s[n-1-i])
    			continue;
    			else
    			return false;
    		}
    	}
    	return true;
    }
    

    3.1.3 测试数据##

    3.1.4 PTA提交列表及说明##

    q1:只有一个字符输出结果: no
    a1:改变for循环中的判断条件:*t!=‘’改为用字符数判断循环是否结束
    q2:但字符数为奇数 输出结果错误
    a2:将sizeof()函数改为strlen()函数,输出结果正确
    

    4.大作业

    4.1.函数关系图##

    4.2.函数功能介绍##

    • 函数1: void CreateExp(char *exp,int level)
    • 伪代码介绍函数思路
      定义j随机生成运算符,定义字符s,t存放不同难度下的运算符
      srand(time(NULL))  获取随机种子 
    switch(level)
           {
                   case 1:*exp=rand()%10+'0';             //生成表达式 // 
    			          *(exp+2)=rand()%10+'0';
    			          *(exp+3)='=';
    			          退出
                   case 2:*exp=rand()%100+'0';
    			          *(exp+2)=rand()%100+'0';
    			          *(exp+3)='=';
    			         退出
                   case 3:*exp=rand()%1000+'0';
    			          *(exp+2)=rand()%1000+'0';
    			          *(exp+3)='=';
    			          退出
           } 
           if level=1 do
    	   随机生成运算符:'+','-','*','/';    
    	   else do
    	    随机生成运算符:'+','-';
    	    switch(level)
           {
           	case 1:一级难度的运算符s存入*(exp+1)中;退出 
           	case 2:二级难度的运算符t存入*(exp+1)中;退出 
           	case 3:三级难度的运算符t存入*(exp+1)中;退出  
    	   }
    	   *(exp+4)='';                    //结束符// 
           puts(exp);
    	   putchar('
    ');
    随机生成的运算式子分部存放在字符数组中
    
    • 代码截图
     void CreateExp(char *exp,int level)
      { 
          int j;
          char s,t;
          srand(time(NULL));           //时间函数,用于之后求随机数// 
          switch(level)
           {
                   case 1:*exp=rand()%10+'0';             //生成表达式 // 
    			          *(exp+2)=rand()%10+'0';
    			          *(exp+3)='=';
    			          break;
                   case 2:*exp=rand()%100+'0';
    			          *(exp+2)=rand()%100+'0';
    			          *(exp+3)='=';
    			          break;
                   case 3:*exp=rand()%1000+'0';
    			          *(exp+2)=rand()%1000+'0';
    			          *(exp+3)='=';
    			          break;
           }
          if(level==1)                    //将运算符单独表示,避免表达式输出顺序错误// 
          {
          	j=rand()%4;
          	switch(j)
          	{
          		case 0:s='+';break;
          		case 1:s='-';break;
          		case 2:s='*';break;
          		case 3:s='/';break;
    		  }
    	  }
    	  else
    	  {
    	  	j=rand()%2;
    		  switch(j)
    		  {
    		  	case 0:t='+';break;
          		case 1:t='-';break;
    		   } 
    	  }
           switch(level)
           {
           	case 1:*(exp+1)=s;break;
           	case 2:*(exp+1)=t;break;
           	case 3:*(exp+1)=t;break;
    	   }
    	   *(exp+4)='';                    //结束符// 
    	   puts(exp);
    	   putchar('
    ');
      }
    
    • 函数2:int ComputeExp(char *exp)
    • 伪代码介绍函数思路
    doubel 定义result,answer表示正确答案和用户输入答案
    int 定义choice表示用户结束计算后的选择
      switch(*(exp+1))                                 //根据*(exp+1)的运算符计算// 
      {
      	case '+':result=(*exp-'0')+(*(exp+2)-'0');break;     字符转换为对应的数字        
      	case '-':result=(*exp-'0')-(*(exp+2)-'0');break;
      	case '*':result=(*exp-'0')*(*(exp+2)-'0');break;
      	case '/':result=(*exp-'0')/(*(exp+2)-'0');break;
      }
      if result=answer do
      输出 鼓励语句   全局变量right自增用于计算正确率
      else do
      输出   正确答案与鼓励语句
       输出choice决定是否继续
       while 输入数据错误 do 
       提示重新输入正确选项choice 
       if choice=1  返回主函数1  表示继续使用程序
       else  返回0   表示退出程序 
    
    • 代码截图
    iint ComputeExp(char *exp)
    { 
        double result,answer;
        int choice;
    	printf("请输入您的答案: ");
      scanf("%lf",&answer);
      switch(*(exp+1))                                 //根据*(exp+1)的运算符计算// 
      {
      	case '+':result=(*exp-'0')+(*(exp+2)-'0');break;            
      	case '-':result=(*exp-'0')-(*(exp+2)-'0');break;
      	case '*':result=(*exp-'0')*(*(exp+2)-'0');break;
      	case '/':result=(*exp-'0')/(*(exp+2)-'0');break;
      }
      if(answer==result) 
      {
      printf("你真聪明!");
      right++;                                         //答案正确,用于计算正确次数的全局变量自增// 
      } 
      else 
      {
      	printf("正确答案:%lf
    ",result) ;
      	printf("再接再厉,加油!
    ");
      }
       printf("
    下一关:输入1;需要做足准备,退出程序:输入0");
       printf("
    ");
       scanf("%d",&choice);              //判断choice的数值决定是否继续测试// 
       while(choice!=1&&choice!=0){
       	printf("请输入正确选项
    ");
    	scanf("%d",&choice);
    	}
       if(choice==1)
       return 1;                      //选择继续,返回1or返回0// 
       else 
       return 0;	 
    }
    

    4.3 与原有函数代码比较##

    • 1.void CreateExp(char *exp,int level)
      与原代码比较,输出表达式与判断是否计算正确拆分乘两个函数分别输出与计算,并且运用了指针去存放随机生成的表达式。
      优点:其实与原先的函数相比在代码上没有太大变换,只是用指针存放随机数与随机运算符,相对原函数,生成随机式子比较简单省时,不需要根据难度分开求随机数
    • 2int ComputeExp(char *exp)
      相对于原函数,多了一步字符型转换为double型
      优点:不再时在这个函数中计算正确率,以及中途退出的选项,而是通过返回值 的不同来判断是否继续以及计算正确率

    4.4 改进大作业总结##

    通过运用指针对大作业的改造,发现指针确实方便,而且解决了之前的随机式子重复的问题;但是在修改代码时也发现出现了许多与原代码不相同的地方:全局变量的定义次数减少了,随机式子的输出不再是简单的printf()就能完成的,或许是对指针知识的掌握不够透彻,认为指针型的大作业相对于之前大作业在编写时更加麻烦。

  • 相关阅读:
    java编写socket使用bufferedReader.readLine()问题研究
    stage3D基础五-----Working with 3D cameras(转)
    stage3D基础四----Stage3D和透视投影的使用(转)
    stage3D基础三------什么是AGAL(转)
    stage3D基础二-----顶点和片段着色器(转)
    stage3D基础一-----Stage3D如何工作(转)
    OpenGL/GLSL数据传递小记(3.x)(转)
    OpenGL/GLSL数据传递小记(2.x)(转)
    Away3D引擎学习笔记(二)CameraController相机控制的应用
    I-team 博客全文检索 Elasticsearch 实战
  • 原文地址:https://www.cnblogs.com/455j/p/9941382.html
Copyright © 2020-2023  润新知