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()就能完成的,或許是對指針知識的掌握不夠透徹,認爲指針型的大做業相對於以前大做業在編寫時更加麻煩。數組

相關文章
相關標籤/搜索