第七周作业

?

这个作业’属于那个课程C语言程序设计ll
这个作业‘要求在哪里https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2935
我在这个课程的目标是理解指针与数组的关系
这个作业‘在那个具体方面帮助我实现目标运用指针解决问题
参考文献https://www.bilibili.com/video/av8302677/?p=21

6-2 每个单词的最后一个字母改成大写 (10 分)

函数fun的功能是:将p所指字符串中每个单词的最后一个字母改成大写。(这里的“单词”是指由空格隔开的字符串)。

函数接口定义:
void fun( char *p );
其中 p 是用户传入的参数。函数将 p所指字符串中每个单词的最后一个字母改成大写。

裁判测试程序样例:

#include <stdio.h>
void fun( char *p );
int main()
{
 char chrstr[64];  int d ;
  gets(chrstr);
  d=strlen(chrstr) ;
  chrstr[d] = ' ' ;
  chrstr[d+1] = 0 ;
  fun(chrstr);
  printf("\nAfter changing:   %s\n", chrstr);
return 0;
}

//请在这里填写答案 ‘

输入样例:

my friend is happy

输出样例:

After changing: mY frienD iS happY

1.完整代码:

#include <stdio.h>
#include <string.h>
//本题中题目未给出,俺自行添加的‘
void fun( char *p );
int main()
{
 char chrstr[64];  int d ;
  gets(chrstr);
  d=strlen(chrstr) ;
  chrstr[d] = ' ' ;
  chrstr[d+1] = 0 ;
  fun(chrstr);
  printf("\nAfter changing:   %s\n", chrstr);
return 0;
}

// 请在这里填写答案 ’

void fun (char *p)
{
    int i = 0;
    while(*(p+i) != '\0')
    {
        i++;
        if(*(p+i) == ' ')
        *(p+i-1) = *(p+i-1) - 32;
        
    }
}

2.设计思路:

1581679-20190412191820785-1324256402.jpg

3.本题调试中遇到的问题及解决办法

本题没什么问题,理解指针与数组的关系就好

4.运行截图

正确截图:
1581679-20190412154653224-1600685053.png


7-2 自动售货机 (30 分)

如图所示的简易自动售货机,物品架1、2上共有10样商品,按顺序进行编号分别为1-10,标有价格与名称,一个编号对应一个可操作按钮,供选择商品使用。如果物架上的商品被用户买走,储物柜中会自动取出商品送到物架上,保证物品架上一定会有商品。用户可以一次投入较多钱币,并可以选择多样商品,售货机可以一次性将商品输出并找零钱。

1581679-20190410233732652-1430593015.png

用户购买商品的操作方法是:

(1)从“钱币入口”放入钱币,依次放入多个硬币或纸币。钱币可支持1元(纸币、硬币)、2元(纸币)、5元(纸币)、10元(纸币),放入钱币时,控制器会先对钱币进行检验识别出币值,并统计币值总额,显示在控制器显示屏中,提示用户确认钱币放入完毕;

(2)用户确认钱币放入完毕,便可选择商品,只要用手指按对应商品外面的编号按钮即可。每选中一样商品,售货机控制器会判断钱币是否足够购买,如果钱币足够,自动根据编号将物品进行计数和计算所需钱币值,并提示余额。如果钱币不足,控制器则提示“Insufficient money”。用户可以取消购买,将会把所有放入钱币退回给用户。

输入格式:

先输入钱币值序列,以-1作为结束,再依次输入多个购买商品编号,以-1结束。

输出格式:

输出钱币总额与找回零钱,以及所购买商品名称及数量。

输入样例:

1 1 2 2 5 5 10 10 -1
1 2 3 5 1 6 9 10 -1

输出样例:

Total:36yuan,change:19yuan
Table-water:2;Table-water:1;Table-water:1;Milk:1;Beer:1;Oolong-Tea:1;Green-Tea:1;

1.代码

#include<stdio.h>
#include<string.h>
int main (void)
{
    int total = 0, p = 0, i = 0, sum;
    int n, num[11] = {0}, price[11]={0,1,1,1,2,2,3,3,3,4,4};
    char a[11][20]={" ","Table-water","Table-water","Table-water","Coca-Cola","Milk","Beer","Oolong-Juice","Sprite","Oolong-Tea","Green-Tea"};

    while(1)  //计算钱币总额 ’
    {
        scanf("%d", &n);
        
        if(n == -1)
        break;
            
        total += n;
    
    }   

    while(1)   //用于统计各个商品的数量‘
    {
        scanf("%d", &n);
        
        if(n == -1)
        break;
        
        num[n]++;  
    }
    
    for(i = 1;i < 11;i++)
    {
        p += price[i] * num[i];      //计算已用价格’
    }
    
    if(p > total)     //判断钱是否足够‘
    {
        printf("Insufficient money");
        
        return 0;  //余额不足直接结束’ 
    }
    
    printf("Total:%dyuan,change:%dyuan\n", total, total - p);
       //输出放入钱币的总价,剩余钱数 ‘
    
    for(i = 1;i < 11;i++)   //输出商品以及购买的数量’
    {
        if(num[i] != 0)
        {
            printf("%s:%d;", a[i], num[i]);
        }
    }
    
    return 0;
}
//kuonaidegirl‘

2.设计思路:

1581679-20190412191803640-929920178.jpg

3.本题调试中遇到的问题及解决办法

本题开始看着感觉有点慌,不知道怎么联系上,看了其他博主的代码,更加觉得好长一串。这个代码是参考助教的,根据他的思路编写,遇到了挺多问题。’

问题:见下图
1581679-20190412154944294-642257464.png

尝试编写将二维数组的空格去掉,发现会有很多错误出现,它会影响最后一个for循环,但其实可以改成不需要空格的,但相较于这个代码来说感觉更麻烦,因为商品的号码是从1-10,所以为了方便对应数组下标,这种会更简单‘

注:看了很多博主的代码写的是用上个学期学习的switch语句,理解起来的话都一个意思,但是用二维数组的方式显得更简洁,但是我一开始并没有想到。’
由于这周比较忙,所以写作业的时间不是很长,这个题目我还会再去思考改善的

4.运行截图

1581679-20190412163030135-799544667.png

7-1使用函数删除字符串中的字符 (10 分)

输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:

输入一个字符串 str,再输入一个字符 c,将字符串 str 中出现的所有字符 c 删除。‘

要求定义并调用函数delchar(str,c), 它的功能是将字符串 str 中出现的所有 c 字符删除,函数形参str的类型是字符指针,形参c的类型是char,函数类型是void。’

输入输出示例:括号内为说明,无需输入输出

输入样例:

3               (repeat=3)
happy new year  (字符串"happy new year")
a               (待删除的字符'a')
bee             (字符串"bee")
e               (待删除的字符'e')
111211          (字符串"111211")
1               (待删除的字符'1')

输出样例:

result: hppy new yer    (字符串"happy new year"中的字符'a'都被删除)
result: b               (字符串"bee"中的字符'e'都被删除)
result: 2               (字符串"111211"中的字符'1'都被删除)

1.完整代码

#include<stdio.h>
void delchar(char a[1000],char c);
int main()
{
    int repeat, i;
    char str[100];
    char c;

    scanf("%d\n",&repeat);  
    
    for(i = 0; i<repeat; i++)
    {
        gets(str);  //输入字符串 ‘
        scanf("%c",&c);   //输入要删除的字符 ’
        printf("result: ");
        delchar(str,c);//调用函数 ‘
    }

    return 0;
}

void delchar(char *str,char c)
{

    while(*str != '\0') 
    {
        if(*str != c)
        {
            putchar(*str);  //输出字符 ’
        }
        str ++;
    }
}

2.设计思路:

本题由于题目给的信息挺多的,我需要思考的就是需要定义一个函数出去一个单词中待删除的字符
利用putchar语句将单个字符输出的特点实现去除待删除字符‘
1581679-20190412191747885-1959042652.jpg

3.本题调试中遇到的问题及解决办法

这个题目我开始写的时候是没有用指针的,考虑了一下最近在学习指针就改了一下’
但是很奇怪的是无论我用哪一种写用devc++编译出来都不对,但是PTA显示是正确的,也不知道是不是我输入的方式不对’

#include<stdio.h>
void delchar(char a[1000],char c);
int main()
{
    int repeat, i;
    char str[100];
    char c;

    scanf("%d\n",&repeat);  
    
    for(i = 0; i<repeat; i++)
    {
        gets(str);  //输入字符串 ‘
        scanf("%c",&c);   //输入要删除的字符 ’
        printf("result: ");
        delchar(str,c);//调用函数 ‘
    }

    return 0;
}

void delchar(char str[100],char c)
{
    int i = 0;
    while(str[i] != '\0') 
    {
        if(str[i] != c)  //字符不相等 ’
        {
            putchar(str[i]);  //输出字符 ‘
        }
        i++;
    }
}

4.运行截图

用指针:
1581679-20190412163333978-1292792843.png

用数组:
1581679-20190412163403114-1367506045.png

虽然同样正确,但是用指针的内存会比直接用数组的内存要小

二,学习进度条

周/日期这周所花时间代码行数学到的知识点目前比较迷惑的问题
第一题4/8-4/113h26行简单的理解指针与数组容易用着用着就分不清指针怎么用
第二题4/9-4/12三天55行指针与数组容易用着用着就分不清指针怎么用
第三题4/9-4/12两天33行用到的putchar容易用着用着就分不清指针怎么用

折线图:

1581679-20190412192208960-896336885.png

时间累计代码行数累计博客字数’
第一周511144
第二周432009
第三周922968
第四周1194566
第五周635976
第六周1098545
第七周11411321

三,学习感悟

本周学习的依旧是指针数组,渐渐的也有些熟悉了,但是真的特别容易用着用着我自己就混乱了。
完全联系不起来一个题要不要用指针去写,很多时候都需要很多提示去写一个题目,不然就会绕挺多弯路。打个比方,第二题的自动售货机,如果不是参考了其他博主的代码,我就不会注意到二维数组的初始化第一行是空格。说起来应该算是逻辑思维能力不强吧,革命尚未成功,同志还需努力‘。本周还没预习接下来的内容,打算周末预习。

四,结对编程感悟:

因为我的室友就是结对编程的搭档,所以虽然这周三去开会了,没有去教室结对编程,但是我们会在寝室讨论,会思考要不要换另一种方法再去编写,但是目前我们两还没敲出来。就说第二题,我之所以想把二维数组空格去掉就是因为我的小伙伴问到了我,为什么要多一个空格,其实这也是结对编程的一大好处,她问的可能是你们想到的,二她问到了你就会开始去思考’.

转载于:https://www.cnblogs.com/surenjiesu/p/10697772.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值