經過學習指針,再利用指針處理數組的題目,發現指針相對於數組代碼量減小,例如作字符型數組時須要遍歷每一個字符比較大小並調換位置,以前作法是經過兩個for循環以及多個if語句判斷完成,在學習指針後,學到了許多有用的函數,例如字符型函數strcpy(用於賦值)、strcat(用於鏈接兩個字符串)、strcmp(用於比較兩個字符串的大小)等,經過這些函數並結合指針的運用,大大減小了使用數值時出現的重複、須要考慮屢次、代碼量較大的問題。指針貫穿了數組和以後學習的結構體和文件,在以後的學習中指針都是必不可少,固然在學習指針時也遇到許多問題,例如指針的指向問題,相關表達式的理解。
本題要求編寫函數,判斷給定的一串字符是否爲「迴文」。所謂「迴文」是指順讀和倒讀都同樣的字符串。如「XYZYX」和「xyzzyx」都是迴文。
定義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 ;
#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; }
q1:只有一個字符輸出結果: no a1:改變for循環中的判斷條件:*t!=‘\0’改成用字符數判斷循環是否結束 q2:但字符數爲奇數 輸出結果錯誤 a2:將sizeof()函數改成strlen()函數,輸出結果正確
定義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'); }
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; }
2int ComputeExp(char *exp)
相對於原函數,多了一步字符型轉換爲double型
優勢:再也不時在這個函數中計算正確率,以及中途退出的選項,而是經過返回值 的不一樣來判斷是否繼續以及計算正確率算法
經過運用指針對大做業的改造,發現指針確實方便,並且解決了以前的隨機式子重複的問題;可是在修改代碼時也發現出現了許多與原代碼不相同的地方:全局變量的定義次數減小了,隨機式子的輸出再也不是簡單的printf()就能完成的,或許是對指針知識的掌握不夠透徹,認爲指針型的大做業相對於以前大做業在編寫時更加麻煩。數組