题目---改大写及自动售货机及删除指定元素

2019/04/09 23:16
阅读数 21

2019春第七周作业

 

这个作业属于那个课程 C语言程序设计II
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2935
我在这个课程的目标是 熟练运用指针
这个作业在那个具体方面帮助我实现目标 更加熟练使用结构体
参考文献 挑战程序设计

 

 

 

第一题

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

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

函数接口定义:

void fun( char *p );

其中 p 是用户传入的参数。函数将 p所指字符串中每个单词的最后一个字母改成大写。

裁判测试程序样例:

 1 #include <stdio.h>
 2 void fun( char *p );
 3 int main()
 4 {
 5  char chrstr[64];  int d ;
 6   gets(chrstr);
 7   d=strlen(chrstr) ;
 8   chrstr[d] = ' ' ;
 9   chrstr[d+1] = 0 ;
10   fun(chrstr);
11   printf("\nAfter changing:   %s\n", chrstr);
12 return 0;
13 }
14 
15 /* 请在这里填写答案 */

 

输入样例:

my friend is happy

输出样例:

After changing:   mY frienD iS happY


实验代码(自定义函数)

 1 void fun(char * p)
 2 {
 3     int len = strlen(p);
 4     for (int i = 0; i < len; i++)
 5     {
 6         if (p[i + 1] == ' ')
 7             p[i] =p[i]- 32;
 8      }
 9     return;
10 }

 

设计思路

 

 

调试过程中遇到的问题及解决方法

运行结果截图

 

 

 

第二题

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

 

 

实验代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define MAXN 10000
 4 int balance;
 5 
 6 struct shop {
 7     int num = 0;
 8     int price[10] = { 1,1,1,2,2,3,3,3,4,4 };
 9     char str[10][100] = { "Table-water","Table-water","Table-water","Coca-Cola","Milk","Beer","Orange-Juice","Sprite","Oolong-Tea", "Green-Tea" };
10 };
11 
12 
13 int main(int argc, const char * argv[])
14 {
15     struct shop name[11];
16     int sum = 0, change, money, i = 0, number[MAXN];
17 
18     while (1) { scanf("%d", &money); if (money == -1)break; sum += money; }
19     balance = sum;
20     while (1) { scanf("%d", &number[i++]); if (number[i - 1] < 0)break; }
21 
22 
23     for (int j = 0; j < i; j++) {
24         if ((balance - name[number[j] - 1].price[number[j] - 1] >= 0) && number[j] != -1) {
25             balance -= name[number[j] - 1].price[number[j] - 1];
26             name[number[j] - 1].num++;
27         }
28         if (balance - name[number[j] - 1].price[number[j] - 1] < 0) { cout << "Insufficient money" << endl; return 0; }
29         if (number[j] == -1) { break; }
30     }
31 
32 
33     cout << "Total:" << sum << "yuan,change:" << balance << "yuan" << endl;
34     for (int j = 0; j < 10; j++)
35     {
36         if (name[j].num != 0)cout << name[j].str[j] << ":" << name[j].num << ";";
37     }
38 
39 
40     return 0;
41 }

 

设计思路

本题调试过程中遇到的问题及解决方法

这道题我被坑惨了,先是题意,上面说每当判断一个商品就会看余额够不够,不够就输出“Insufficient money”,我一开始一为是假如第一个商品钱够,第二个不够,就会输出 XXX(商品):1;然后换行输出“Insufficient money”,结果是只要其中有一个钱不够,就输出“Insufficient money”,太坑了!然后是第二点是我自己坑自己,商品名称,我把“-”号打成“_”然后一直错误错误,发现结果是错了名字之后想拍死自己,各位一定要认真看变量名啊啊啊啊啊啊!!!

 

运行结果截图

 

第三题

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

 

实验代码

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 
 6 void delchar(char * arr, char zf) {
 7     int len = strlen(arr);
 8     int count=0;
 9     vector<char> str;
10     str.clear();
11     for (int i = 0; i < len; i++)
12     {
13         str.push_back(arr[i]);
14         if (arr[i] == zf)
15         {
16             str.erase(str.begin()+(i-count));
17             count++;
18         }
19     }
20     int x = len - count;
21     cout<<"result: ";
22     for(int i = 0 ; i < x ;i++)
23     cout << str[i];
24     cout<<endl;
25 }
26 
27 int main(int argc, const char * argv[])
28 {
29     int T;
30     cin >> T;
31     while (T--) {
32         char str[1000]={'\0'},zf;
33         string s;
34         getchar();
35         getline(cin,s);
36         int len = s.length();
37         for(int i = 0 ; i < len ; i++){str[i] = s[i];}
38         scanf("%c",&zf);
39         delchar(&str[0],zf);
40     }
41 
42     return 0;
43 }

 

设计思路

本题调试过程中遇到的问题及解决方法

 

一开始元素删除是删除了,但是从第二个字符串开始,就会保留上一次的字符串内容,后来发现忘记将字符串数组初始化了

运行结果截图

 

 -------------------------------------------------------------------------------------------------------------------------

挑战作业(持续完善中)……

讲一下挑战作业关于我自己不成熟的思路吧,就是用深度搜索去找出每一个正数块,然后找出每个正数块的最小权值路径,连接起来,并且判断连接后的块是否比单独最大块大,如果没有,则输出单独块。但是关于找最小权值路径的复杂度似乎有点小大...而且块边缘处理不是很成熟,有点难搞,不过可以去尝试着挑战一下第二种情况,感觉还行..如果要全部情况同时完成..(对不起,打扰了)。

 

 

 

结对编程感想:

  此次结对编程对问题的解析更为深刻,在不断讨论的过程中和搭档一起研究出了几种解决问题的方法,发现了新思路,由于此次题目比较新颖有趣,所以解题过程还是很快乐滴,对指针和数据结构的了解和利用更加熟练了,并且与搭档合作更加默契了,对于解题很有帮助!

 

 

 

 

 

学习总结:

存在的问题 心得 完成作业消耗时间 本周学习内容
第一周 对文件读取数据的运用不是很熟练 多去看关于刷题的书籍,有助于提高自己写题能力,实在不会的可以参考大佬的代码,加以自己理解之后去默写几遍 半个小时左右 文件输入,BFS,DFS,PARTITION算法及简单的贪心算法
第二周 对单纯用数组完成双向链表的操作还是太生疏了,说明对双向链表的运作原理不熟 推荐两本比较好的书《挑战程序设计》《算法竞赛》 半个小时左右 vector数组及list双向链表操作
第三周 指针的概念太久没记有点生疏了 对vector数组使用愈加熟练 一小时左右 数据结构
第四周 对联通二维数组的最大子数和自闭了 多看些算法,不然写题目用什么方法去解决都弄不清 基础题目10分钟,挑战作业现在都在自闭中 迭代器
第五周 最小权值路径最优解该用什么解法 多思考一下如何优化自己的代码,会有新的收获 一个小时 递归和分治法

 

 

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部