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\n");
    else
        printf("No\n");
    printf("%s\n", 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!=‘\0’改成用字符数判断循环是否结束
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)='\0';                    //结束符// 
       puts(exp);
       putchar('\n');
随机生成的运算式子分部存放在字符数组中
  • 代码截图
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)='\0';                    //结束符// 
       puts(exp);
       putchar('\n');
  }
  • 函数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\n",result) ;
    printf("再接再砺,加油!\n");
  }
   printf("\n下一关:输入1;须要作足准备,退出程序:输入0");
   printf("\n");
   scanf("%d",&choice);              //判断choice的数值决定是否继续测试// 
   while(choice!=1&&choice!=0){
    printf("请输入正确选项\n");
    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()就能完成的,或许是对指针知识的掌握不够透彻,认为指针型的大做业相对于以前大做业在编写时更加麻烦。数组

相关文章
相关标签/搜索