可能由于这两周进度的加快,感到比较吃力,知识点比较抽象,不那么容易理解,也可能最近由于被准备考试,写论文等事情追赶着,对C语言、PTA这方面有所懈怠(个人错。。。T_T)。总之,在指针方面还存在不少不足,有的知识点没有及时掌握,还要课后花时间看课本,对一些用法或者须要注意的地方还不够熟悉,但愿经过以后的时间能够抓紧时间,掌握不熟练或者遗漏的知识点,多加练习,掌握这方面的知识。算法
125分数组
给定一句英语,要求你编写程序,将句中全部单词的顺序颠倒输出。函数
定义 i,统计count=0; 定义 字符数组s[500001],指针*p; gets(s); //输入英语 i=strlen(s)-1;//取字符串长度 for i=strlen(s)-1 to 0 do if s[i]==' ' then if s[i+1]!=' '&&s[i+1]!='\0' //出现单词 p=s+i+1; count++; if count>1 then printf(" ");//控制输出最后一个单词没有空格 printf("%s",p); end if s[i]='\0'; end if else if i==0&&s[i]!=' ' then//单独判断最后一个 p=s; if count>=1 then printf(" "); end if printf("%s",p); end end for
-Q1:刚开始在输出方面没有什么思路
-A1:后来去请教了同窗
-Q2:一开始没有发现最后单词没有空格
-A2:经过count控制学习
函数CreateExp(char *exp,int level) 定义整型变量 题量number,答题次数times,统计count=0;item,temp; 定义整型变量 i,j,符号sign,数字个数k,位数m,运算符种类n,a; static char str[100],ch[5]; static char yourAnswer[10];//定义字符数组 字符str[100],运算符ch[5],yourAnswer[10]并初始化 static int num[5];//定义整型数组 数字num[5]并初始化 提示并输入题量; for i=1 to number do memset(exp,0,100*sizeof(char));//每次输出后将存放表达式的指针的内容清空 if level=1 then k=2;m=9;n=4;a=1;break; else if level=2 then k=3;m=90;n=2;a=10;break; else if level=2 then k=3;m=900;n=2;a=100;break;//根据级别,赋予对应的参数 num[0]=level;//将存放数字的数组的首位存放级别 for j=1 to k do num[j]=rand()%m+a;//生成随机数字 for j=1 to k-1 do sign=rand()%n+1; switch(sign) case 1:ch[j]='+';break; case 2:ch[j]='-';break; case 3:ch[j]='*';break; case 4:ch[j]='/';break; //随机生成运算符,并储存在数组中; Select(num,ch);//判断数字是否知足条件 for j=1 to (k*4) do if j==1 or j==5 or j==9 then itoa(num[temp],str,10);//将数字转换为字符 temp++; else if j==3 or (j==7 and level!=1) then *str=ch[j/3]; else if j==(k*4)-1 then *str='='; else *str=' '; strcat(exp,str); memset(str,0,100*sizeof(char));//清空 *str 输出算式,并提醒用户输入答案; count=Check(num,yourAnswer,ch);//调用函数校对答案 询问是否中途退出; Rate(count,times)*100);//调用函数计算正确率
我使用了memset函数来清空指针里的内容
void memset(void s, int ch, size_t n);头文件在<string.h>中,将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s3d
函数Select(int *num,char *ch) 定义整型变量 change,result; if num[1]<num[2] and ch[1]=='-' 经过变量change将二者进行交换//使1位数运算结果为正数 if ch[1]=='/' then while num[1]%num[2]!=0 从新生成两个运算数//将除法定义为整除运算 if num[0]!=1 then 计算前两个数字运算结果 while result<num[3] if ch[2]=='+' then break; switch(num[0]) case 2: num[3]=rand()%90+10;break; case 3: num[3]=rand()%900+100;break;// 使2位数和3位数运算结果为正数
关于这个函数,由于考虑到除数不能为0,及一位数运算数据中出现0的无心义性,因此只随机产生1~9;
考虑到小学运算不涉及有关负数运算及除法不整除的状况,因此增长了些条件进行判断;指针
函数Check(int *num,char *yourAnswer,char *ch,int count)//计算正确率 定义整型变量 答案answer; static char str[10];//定义字符串str并初始化 switch(ch[1]) 根据符号进行计算; switch(ch[2]) 根据符号进行计算; default: break;//若只有1步计算则break itoa(answer,str,10);//将正确答案转为字符; if strcmp(str,yourAnswer)==0 then 输出答案正确 count++; else 提示答案错误并输出正确答案 return count;
由于以前筛选环节比较特殊,因此定义存放数字和运算符的两个数组,因此在判断正误函数,直接经过传递两个数组的地址来计算正确答案code
由于改造后函数一、2的功能在改造前函数是封装在3个函数中,因此就一块儿比较blog
改造前的函数一、2
字符串
改造后的函数一、2
get
不一样:
1.函数封装的不一样,改造前将级别一、级别2&3和符号生成的函数是依次分开,而改造后的是封装成生成运算式和判断运算式是否合理两个函数;
2.在生成运算式这一块,是定义多个变量,每一个变量对应一个值,而改造后是存放在数组中
优势:
1.改造前将级别一、级别2&3是分开的,许多语句是重复的,不利于阅读,改造后将一些重复的语句删除;
2.经过指针,取消了全局变量
缺点:
改造后将以前的几个函数功能封装在一块儿,语句可能过于复杂
改造前的函数3
改造后的函数3
不一样:
1.改造后传递的输入答案为字符串;
2.改造后经过传递数组计算正确答案
优势:
1.改造后传递的输入答案为字符串,完善了以前输入字符串时程序会直接结束的bug
第二次进行改良的时候明显就困难多了,不只要进一步完善程序,并且还要运用新的知识,修改的时候可能由于新知识掌握的不够熟练,仍是练习的不够,显得有些慌乱。不只要修改以前隐藏的bug,还要解决修改过程当中出现的新的问题,并且还要面临从新封装函数或者从新构造函数的问题,因此我的认为改代码要比从头开始写代码可贵多。但好在其余同窗的帮助下,完成了此次修改,但我的认为还须要多多练习,提升打代码时的熟练度。