C语言博客作业05--指针

1.本章学习总结 1476101-20181217201635121-1072495289.jpg

1.1 思维导图

1476101-20181217214827427-349209929.png

1.2 本章学习体会及代码量学习体会

1.2.1 学习体会

可能因为这两周进度的加快,感到比较吃力,知识点比较抽象,不那么容易理解,也可能最近因为被准备考试,写论文等事情追赶着,对C语言、PTA这方面有所懈怠(我的错。。。T_T)。总之,在指针方面还存在很多不足,有的知识点没有及时掌握,还要课后花时间看课本,对一些用法或者需要注意的地方还不够熟悉,希望通过之后的时间可以抓紧时间,掌握不熟练或者遗漏的知识点,多加练习,掌握这方面的知识。

1.2.2 代码累计

1476101-20181223173028035-847974.png

2.PTA总分1476101-20181217201704561-1815162813.jpg

2.1截图PTA中指针题目集的排名得分

1476101-20181223171258485-617370145.png

2.2 我的总分:

125分

3.PTA实验作业1476101-20181217201722926-1116568227.jpg

3.1 PTA题目

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

3.1.1 算法分析

定义 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  

3.1.2 代码截图

1476101-20181223185300622-286296469.png

3.1.3 PTA提交列表及说明

1476101-20181223184658966-1928756722.png

-Q1:刚开始在输出方面没有什么思路
-A1:后来去请教了同学
-Q2:一开始没有发现最后单词没有空格
-A2:通过count控制

4.大作业1476101-20181217201744161-404611364.jpg

题目:实现小学四则运算。

4.1.改造函数介绍

4.1.1 函数

函数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 替换并返回 s

1476101-20181222184946533-1561409458.png
1476101-20181222173742958-1127541845.png

4.1.2 函数

函数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;
考虑到小学运算不涉及有关负数运算及除法不整除的情况,所以增加了些条件进行判断;

1476101-20181222174359229-1226566413.png

4.1.3 函数

函数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;

因为之前筛选环节比较特殊,所以定义存放数字和运算符的两个数组,所以在判断正误函数,直接通过传递两个数组的地址来计算正确答案

1476101-20181222185055384-422689160.png

4.2 与原有函数代码比较

改造前函数1、2和改造后的函数1、2

因为改造后函数1、2的功能在改造前函数是封装在3个函数中,所以就一起比较

  • 改造前的函数1、2
    1476101-20181223183233073-663756493.png
    1476101-20181223183450316-183042827.png
    1476101-20181223183338647-19176520.png
    1476101-20181223183731525-1219613845.png
    1476101-20181223183549018-884504735.png

  • 改造后的函数1、2
    1476101-20181222184946533-1561409458.png
    1476101-20181222173742958-1127541845.png
    1476101-20181222174359229-1226566413.png

不同:
1.函数封装的不同,改造前将级别1、级别2&3和符号生成的函数是依次分开,而改造后的是封装成生成运算式和判断运算式是否合理两个函数;
2.在生成运算式这一块,是定义多个变量,每个变量对应一个值,而改造后是存放在数组中
优点:
1.改造前将级别1、级别2&3是分开的,许多语句是重复的,不利于阅读,改造后将一些重复的语句删除;
2.通过指针,取消了全局变量
缺点:
改造后将之前的几个函数功能封装在一起,语句可能过于复杂

改造前函数3和改造后的函数3

  • 改造前的函数3
    1476101-20181222193101860-1682724760.png

  • 改造后的函数3
    1476101-20181222185055384-422689160.png

    不同:
    1.改造后传递的输入答案为字符串;
    2.改造后通过传递数组计算正确答案
    优点:
    1.改造后传递的输入答案为字符串,完善了之前输入字符串时程序会直接结束的bug

4.3 改进大作业总结

第二次进行改良的时候明显就困难多了,不仅要进一步完善程序,而且还要运用新的知识,修改的时候可能因为新知识掌握的不够熟练,还是练习的不够,显得有些慌乱。不仅要修改之前隐藏的bug,还要解决修改过程中出现的新的问题,而且还要面临重新封装函数或者重新构造函数的问题,所以个人认为改代码要比从头开始写代码难得多。但好在其他同学的帮助下,完成了这次修改,但个人认为还需要多多练习,提高打代码时的熟练度。

转载于:https://www.cnblogs.com/qq1191834402/p/10127790.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值