经过学习指针,再利用指针处理数组的题目,发现指针相对于数组代码量减小,例如作字符型数组时须要遍历每一个字符比较大小并调换位置,以前作法是经过两个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()就能完成的,或许是对指针知识的掌握不够透彻,认为指针型的大做业相对于以前大做业在编写时更加麻烦。数组