第七周作业

😀

这个作业’属于那个课程 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.设计思路:

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

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

4.运行截图

正确截图:


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

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

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

(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.设计思路:

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

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

问题:见下图

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

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

4.运行截图

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语句将单个字符输出的特点实现去除待删除字符‘

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.运行截图

用指针:

用数组:

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

二,学习进度条

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

折线图:

时间 累计代码行数 累计博客字数’
第一周 51 1144
第二周 43 2009
第三周 92 2968
第四周 119 4566
第五周 63 5976
第六周 109 8545
第七周 114 11321

三,学习感悟

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

四,结对编程感悟:

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

posted @ 2019-04-12 18:27  俗人皆俗  阅读(281)  评论(1编辑  收藏  举报