第七周作业
😀
这个作业’属于那个课程 | 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 |
三,学习感悟
本周学习的依旧是指针数组,渐渐的也有些熟悉了,但是真的特别容易用着用着我自己就混乱了。
完全联系不起来一个题要不要用指针去写,很多时候都需要很多提示去写一个题目,不然就会绕挺多弯路。打个比方,第二题的自动售货机,如果不是参考了其他博主的代码,我就不会注意到二维数组的初始化第一行是空格。说起来应该算是逻辑思维能力不强吧,革命尚未成功,同志还需努力‘。本周还没预习接下来的内容,打算周末预习。
四,结对编程感悟:
因为我的室友就是结对编程的搭档,所以虽然这周三去开会了,没有去教室结对编程,但是我们会在寝室讨论,会思考要不要换另一种方法再去编写,但是目前我们两还没敲出来。就说第二题,我之所以想把二维数组空格去掉就是因为我的小伙伴问到了我,为什么要多一个空格,其实这也是结对编程的一大好处,她问的可能是你们想到的,二她问到了你就会开始去思考’.