这个作业属于哪个课程 | C语言程序设计II |
这个作业要求在哪里 | 2019年春季学期第七周作业 |
我在这个课程的目标是 | 我希望能够通过学习C语言的知识,编写程序 |
这个作业在哪个具体方面帮助我实现目标 | 这个作业让我知道了掌握数组名作为函数参数的用法,理解指针和数组可以实现相同的操作 |
参考文献 | 字母大小写转换, C 结构体 |
一、本周完成的作业
题目1. 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).实验代码
void fun( char *p ) { for(int i = 0;p[i] != '\0'; i ++) { if(p[i] == ' ') p[i - 1] = p[i - 1] - 32; } }
2). 设计思路
3).本题调试过程碰到问题及解决办法
遇到的问题:答案错误,在编译器上发现运行结果和输入一样,通过调试发现是循环的条件错了
解决的办法:询问助教,发现在循环时可用p[i] != '\0'作为循环终止的条件
4).运行结果截图
题目2.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> struct { int amount; char Name[15]; int Value; }sold[10] = { {0, "Table-water", 1}, {0, "Table-water", 1}, {0, "Table-water", 1}, {0, "Coca-Cola", 2}, {0, "Milk", 2}, {0, "Beer", 3}, {0, "Orange-Juice", 3}, {0, "Sprite", 3}, {0, "Oolong-Tea", 4}, {0, "Green-Tea", 4} }; int main() { int single = 0, Total = 0, TotalPrice = 0; while (single != -1) { scanf("%d", &single); if(single > 0) Total += single; } single = 0; while (single != -1) { scanf("%d", &single); if (single > 0) { sold[single - 1].amount++; TotalPrice += sold[single - 1].Value; } } if (TotalPrice > Total) printf("Insufficient money"); else { printf("Total:%dyuan,change:%dyuan\n", Total, Total - TotalPrice); for (int i = 0; i < 10; i++) { if (sold[i].amount != 0) printf("%s:%d;", sold[i].Name, sold[i].amount); } } return 0; }
2). 设计思路
3).本题调试过程碰到问题及解决办法
遇到的问题:答案错误,通过编译器调试发现只有第一排的数字被输入了,
解决的办法:通过和助教一起调试,发现了single在进行第二个循环算总价值时为-1,不符合循环条件,所以将其在第二个循环前赋值为0
4).运行结果截图
题目3. 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 str[], char c); int main(void) { int repeat; char str[1000], c, temp; scanf("%d%c", &repeat, &temp); int i = 0, j = 0; for (j = 0; j < repeat; j++) { i = 0; while (1) { scanf("%c", &str[i]); if (str[i] == '\n') break; i++; } str[i] = '\0'; scanf("%c%c", &c, &temp); delchar(str, c); } return 0; } void delchar(char str[], char c) { printf("result: "); for (int i = 0; str[i] != '\0'; i++) { if (str[i] != c) printf("%c", str[i]); } printf("\n"); }
2). 设计思路
3).本题调试过程碰到问题及解决办法
遇到的问题:编译错误,本题在写时由我提供思路,助教再将我的思路进行修改,由于助教用的是c++,所以在编译时出现了一些不兼容的状况
解决的办法:如"%d\n"需要改为"%d%c"
4).运行结果截图
题目1. 挑战作业
接着上周的挑战作业继续,本周, 我们需要考虑如果 “子数组” 并不要求是一个矩形, 而是联通的元素即可 (上下或左右相邻即视为联通), 那解法会是怎么样呢?
具体要求请参看邹欣老师博客 现代程序设计作业
1).设计思路
第一步 输入二维数组
第二步 循环进行相邻(上下或左右)的元素的比较(难点),用双for循环比较相邻的元素
第三步 循环比较大小的同时也不断将最大的元素的地址存储在另一个数组中
第四步 输出最大矩形子数组的和
二、学习进度条
周/日期 | 这周所花的时间 | 代码行数 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|
3/2-3/8 | 20h | 300行 | 数组,指针的大致意义,文件入门 | 数组串的使用,指针 |
3/9-3/15 | 25h | 400行 | 二维数组,文件与数组的结合运用 | 双for循环的流程图(再不上课,光自学感觉太艰难了) |
3/16-3/22 | 22h | 450行 | 一维数组,二维数组,几种数组排序法 | 字符串使用 |
3/23-3/29 | 20h | 350行 | 字符串的定义及其使用 | 指针的具体使用 |
3/30-4/5 | 15h | 340行 | 指针变量的定义,使用,初始化及其基本运算,指针作为函数参数的作用;使用指针实现函数调用返回多个值 | 指针在运行时内存的变化 |
4/6-4/12 | 13h | 400行 | 数组名作为函数参数的用法,理解指针、数组和地址之间的关系,指针和数组可以实现相同的操作,结构体的定义,使用 | 结构体的具体使用,结构体的流程图 |
三、学习感悟
心得:
(1) 学习内容:
1. 掌握数组名作为函数参数的用法
2. 理解指针、数组和地址之间的关系
3. 理解指针和数组可以实现相同的操作
4.结构体的定义,使用
收获:
(2) 难点: 结构体是一个新的知识点,第一次学习有点难接受
解决的方法:努力理解,通过看书和看 C 结构体 来学习。
四、结对编程
1.结对编程过程
本次的随机分配的搭档依旧没看到人,上一个搭档学委也参加比赛去了╥﹏╥,所以我只能找助教当我的搭档了。在本次结对编程中,助教教了我一个新的知识点,结构体,并且在本次作业中也有使用到。本次结对主要就是在理解,学习并使用新的知识点了。
2.结对编程的优缺点
优点:1.可以将自己知道而搭档不知道的知识教给搭档。
2.提供不同的思路
3. 一起找错效率更高
缺点: 助教实在是tql,我的思路被超速优化,脑子有点转不过来,不过这也是我自己的问题,只能让自己努力去接受新知识了。
完成作业的消耗时间:12h
来源:https://www.cnblogs.com/LILI6/p/10684366.html