可能由于以前数组那块儿的做业拖得过久了,以致于我以为指针学的好快,还没反应过来就教完了,而后一开始作题的时候,就是一脸懵逼得状态。而后前段时间也都在不数组的做业,指针也没好好看看书,也就上课的时候听听老师讲课,而后后面作题,一不会就去翻书,一来二去的虽然仍是不很明白指针到底怎么回事,可是大概的题目也都会作了。而后如今我把指针跟结构体的题目集都刷完了,也该好好补补指针的知识点了。
PTA总分:110
反话-增强版 给定一句英语,要求你编写程序,将句中全部单词的顺序颠倒输出。
定义整型变量:i、j、k=0、count=0、length、temp 定义字符型指针:ch ch=(char *)malloc(500001*sizeof(ch));//经过malloc把较大的数组放到堆区,防止爆栈 输入字符串ch 经过strlen函数获得字符串ch的长度 temp=length-1 //解决末尾为空格的状况 while length-- do while ch[k]为空格 do //解决前面有连续空格的状况 k++ end while if length=0 且 ch[0]!=' ' then for j=0 to count do putchar(*(ch+j)) //输出开头不为空格时的单词 end for end if if ch[length] 不为空格 then count++ else if ch[length]为空格 且 ch[length+1]不为空格 且 length不是字符串尾 then for i=1 to count do putchar(*(ch+length+i)) end for if length+1!=k then printf(" ") end if count=0 else if ch[length]为空格 且 ch[length+1]为空格 或者 ch[length]为空格 then continue end if end while
在函数那章,咱们已经实现小学四则运算这份做业,如今要求你们把以前设计函数升级改造,原来的函数你们都是用全局变量实现不一样函数参数传递,此次做业要求改地址传递,减小全局变量的使用。算法
题目有3个难度级别,分别为:数组
**char CreateExp(char *exp,char level);**框架
定义整型变量num、op(获取随机数)、i,字符型数组str[10](用于整型转字符型存放) srand(time(NULL)) //获取随机数种子 if level=='1' then i=3 //一级运算数及运算符的总和 while --i do if i为偶数 then num=rand()%10; itoa(num,str,10)//将整型变量num转化为字符型变量存入数组str中 strcat(exp,str);//将str数组中的字符串接在exp数组后 else op=rand()%4; switch(op)//随机获取运算符,并接在数组exp后 case 0: strcat(exp,"+");;break; case 1: strcat(exp,"-");break case 2: strcat(exp,"*");break; case 3: strcat(exp,"/");break; end if end while else//当level为2或3时 i=5 //二(三)级运算数及运算符的总和 while --i do if i为偶数 then if level=='2' then num=rand()%100 else num=rand()%1000 end if itoa(num,str,10)//将整型变量num转化为字符型变量存入数组str中 strcat(exp,str);//将str数组中的字符串接在exp数组后 else op=rand()%4; switch(op)//随机获取运算符,并接在数组exp后 case 0: strcat(exp,"+");;break; case 1: strcat(exp,"-");break end if end while end if strcat(exp,"=")//将等号接在表达式后 if 表达式合法 then 输出表达式 else 返回CreateExp(exp,level)函数,从新建立表达式 return *exp//返回指针*exp
char CreateExp(char *exp,char level)//构造字符数组存放算术表达式 { int num,i; int op; char str[10]; srand(time(NULL)); if(level=='1') { i=3;//运算数及运算符的总和 do { if(i%2) { num=rand()%10; itoa(num, str, 10); strcat(exp,str); } else { op=rand()%4; switch(op) { case 0: strcat(exp,"+");;break; case 1: strcat(exp,"-");break; case 2: strcat(exp,"*");break; case 3: strcat(exp,"/");break; } } }while(--i); } else { i=5;//运算数及运算符的总和 do { if(i%2) { if(level=='2') num=rand()%100; else num=rand()%1000; itoa(num, str, 10); strcat(exp,str); } else { op=rand()%2; switch(op) { case 0: strcat(exp,"+");break; case 1: strcat(exp,"-");break; } } }while(--i); } strcat(exp,"="); if(IsExp(exp,level))//判断表达式是否合法 printf("\n\t\t\t\t%s",exp); else return CreateExp(exp,level);//表达式不合法时返回CreateExp(exp,level)函数,从新建立表达式 return *exp; }
**int IsExp(char *exp,char level);**函数
if 等级为2、三级 then //二三等级不含除法,即不存在表达式不合法状况 return 1; 定义整型变量m=0,sum=0,i=0、字符型变量c=exp[i],oldc='+' while c!='=' do c=exp[i] if c为数字 then m=10*m+c-'0'//将字符型数字转化为整型数字 else if oldc=='+' then sum+=m else if oldc=='/' then if m==0 或者 sum%m!=0 then //不合法状况,即除数为零、不能整除 return 0 end if end if m=0//初始化 ,用于下一轮转化整型变量 oldc=c end if i++ end while return 1
int IsExp(char *exp,char level)//表达式是否合法 { if(level=='2'||level=='3')//二三等级不含除法,即不存在表达式不合法状况 return 1; int m=0, sum=0,i=0; char c, oldc='+'; do { c = exp[i]; if( c<='9'&&c>='0' ) m = 10*m + c - '0'; else { if( oldc == '+' ) sum += m; else if(oldc == '/') { if(m==0 || sum%m!=0)//不合法状况,即除数为零、不能整除 return 0; } m = 0; oldc = c; } i++; } while(c!='='); return 1; }
**int ComputeExp(char *exp);**学习
定义整型变量m=0,sum=0,i=0、字符型变量c=exp[i],oldc='+' while c!='=' do c=exp[i] if c为数字 then m=10*m+c-'0'//将字符型数字转化为整型数字 else if oldc是+ then sum+=m else if oldc是- then sum-=m else if oldc是* then sum*=m else if oldc是/ then sum/=m end if m=0//初始化 oldc=c end if i++ end while return sum
int ComputeExp(char *exp)//表达式运算 { int m=0, sum=0,i=0; char c, oldc='+'; do { c = exp[i]; if( c<='9'&&c>='0' ) m = 10*m + c - '0';//将字符型数字转化为整型数字 else //计算表达式 { if( oldc == '+' ) sum += m; else if(oldc == '-') sum -= m; else if(oldc == '*') sum*=m; else if(oldc == '/') sum/=m; m = 0;//初始化 oldc = c; } i++; } while(c!='='); return sum; }
void NumberGet() { if(levelChoice=='1') { srand(time(NULL)); number1=rand()%10; number2=rand()%10; } else if(levelChoice=='2') { srand(time(NULL)); number1=rand()%100; number2=rand()%100; number3=rand()%100; } else { srand(time(NULL)); number1=rand()%1000; number2=rand()%1000; number3=rand()%1000; } } void OperatorGet() { if(levelChoice=='1') { srand(time(NULL)); operator_ch1=rand()%4; switch(operator_ch1) { case 0:ch1='+';break; case 1:ch1='-';break; case 2:ch1='*';break; case 3:ch1='/';break; } } else { srand(time(NULL)); operator_ch1=rand()%2; operator_ch2=rand()%2; switch(operator_ch1) { case 0:ch1='+';break; case 1:ch1='-';break; } switch(operator_ch2) { case 0:ch2='+';break; case 1:ch2='-';break; } } } //函数void GameBegin()中的一部分 if(levelChoice=='1') { NumberGet(); //获取随机数 OperatorGet(); //随机获取运算符 printf("%.0f %c %.0f = ",number1,ch1,number2); scanf("%lf",&yourAnswer); rightAnswer=Calculate(); if(yourAnswer==rightAnswer) { printf("\n\t\t\t\tGood job!^_^\n"); i++; } else { printf("\n\t\t\t\t回答错误!>_<\n"); printf("\n\t 正确答案是:%.0f %c %.0f = %.2lf\n",number1,ch1,number2,rightAnswer); j++; } } else { NumberGet(); //获取随机数 OperatorGet(); //随机获取运算符 printf("%.0f %c %.0f %c %.0f = ",number1,ch1,number2,ch2,number3); scanf("%lf",&yourAnswer); rightAnswer=Calculate(); if(yourAnswer==rightAnswer) { printf("\n\t\t\t\tGood job!\n"); i++; } else { printf("\n\t\t\t\t回答错误!>_<\n"); printf("\n\t\t\t\t正确答案是:%.0f %c %.0f %c %.0f = %.0lf\n",number1,ch1,number2,ch2,number3,rightAnswer); j++; } }
· 改造后的代码(如上char CreateExp(char *exp,char level);函数)测试
1.原函数中,随机数与随机运算符的获取分装为两个函数,表达式的输出也只是由一个简单的printf()输出 而改进后的代码,将随机数与随机运算符的获取再加上表达式的整合放在同一个函数中,使代码更加简洁 2.原代码中,屡次调用随机数和随机运算符的获取函数,在效率上拖慢了程序的运行,而改进后的代码则不存在屡次重复调用的状况出现
而后其他的函数基本都大同小异设计