[冒泡排序+字符串]吃花生问题
2014-11-11 22:08
204 查看
在百度知道上看到有人问这个问题,冒泡排序和字符串结合的题,正好今天没有完成编程任务,所以就拿来练手了,虽然题目不难,但是考察的C语言基础东西还是不少,对于从大一开始就没怎么写C程序的我来说,一两分钟就AC出来也不是一件很容易的事,所以还是要加紧练习才行呀。
题目描述如下:
题主的代码如下:
上述代码犯了两个错误:
1、对第二行输入没有进行排序,输入可能不仅仅是1-7这七个数字;
2、C语言中对字符串的比较应该用string.h里的strcmp(str1,str2)==0来判断,不能直接用“==”,字符可以用“==”,字符串不能这么判断。为什么呢?其实在C里,char str[20]中的str,代表的是这个字符串的地址,如果str1和str2用“==”比较,实际上比较的是两个字符串的地址,当然是永远不可能相等的了。在C-free5里跑的时候编译器没有提醒出错,编译也能通过,因为编译器默认你比较的二者的地址。
其实第二条如果不是这道题,我第一反应也是用“==”,果然还是编程底子太弱了。
以下是我写的代码:
运行示例:
这里用到了冒泡排序,冒泡排序的思想是每趟比较相邻的两个,时间复杂度是O(n^2),不需要额外空间,是稳定排序。因为它要用到内外两层for循环:外层循环用于遍历每个元素,内层循环用于比较第i个元素和len-i-1个元素的大小,比如在第一趟时,要比较出最大的元素,放到最底下,小的元素排在前面,那么此时a[6]就是所有元素中最大值了。
以此类推。
冒泡排序(升序)代码如下:
测试结果示意:
题目描述如下:
描述HEIHEI非常喜欢吃花生,他每天都会吃一些花生,心情好的话会吃的比较多,现在已经知道,HEIHEI从周一到周日的心情值递增的,也就是说周一吃的花生最少,周日吃的花生最多。现在给你7个数表示有7堆花生,顺序是打乱的,HEIHEI每天吃的花生数都在这7个数中,现在告诉你今天周几,请你告诉HEIHEI他今天应该吃多少花生。例如花生数有“1 2 5 4 6 7 3”,输入“Monday”,星期一就应该输出1,如果输入“”Thursday”,周四的话应该吃4个,输出4.输入第一行有一个数t(1<=t<=100)表示有t组测试数据。 第二行有7个数分别表示这一周内每一天的花生数。 第三行有一个字符串,表示周几(Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday)。输出输出一个数,表示这一天应该吃的花生数。
题主的代码如下:
#include <stdio.h> #include <stdlib.h> int main() { int a[7],i,t; char b[20]; scanf("%d",&t); while(t--) { for(i=0;i<7;i++) scanf("%d\n",&a[i]); gets(b); if(b=="Monday") i=0; if(b=="Tuesday") i=1; if(b=="Wednesday") i=2; if(b=="Thursday") i=3; if(b=="Friday") i=4; if(b=="Saturday") i=5; if(b=="Sunday") i=6; printf("%d\n",a[i]); } return 0; }
上述代码犯了两个错误:
1、对第二行输入没有进行排序,输入可能不仅仅是1-7这七个数字;
2、C语言中对字符串的比较应该用string.h里的strcmp(str1,str2)==0来判断,不能直接用“==”,字符可以用“==”,字符串不能这么判断。为什么呢?其实在C里,char str[20]中的str,代表的是这个字符串的地址,如果str1和str2用“==”比较,实际上比较的是两个字符串的地址,当然是永远不可能相等的了。在C-free5里跑的时候编译器没有提醒出错,编译也能通过,因为编译器默认你比较的二者的地址。
其实第二条如果不是这道题,我第一反应也是用“==”,果然还是编程底子太弱了。
以下是我写的代码:
#include<stdio.h> #include<string.h> void sort(int *a,int len) { /*冒泡排序(升序)*/ int temp; for(int i=0;i<len;i++) { for(int j=0;j<len-i-1;j++) { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } } int main() { int a[7],t; char ch[20]; scanf("%d",&t); while(t--) { for(int i=0;i<7;i++) { scanf("%d",&a[i]); } scanf("%s",ch); sort(a,7); if(strcmp(ch,"Monday")==0) { printf("%d\n",a[0]); } if(strcmp(ch,"Tuesday")==0) { printf("%d\n",a[1]); } if(strcmp(ch,"Wednesday")==0) { printf("%d\n",a[2]); } if(strcmp(ch,"Thursday")==0) { printf("%d\n",a[3]); } if(strcmp(ch,"Friday")==0) { printf("%d\n",a[4]); } if(strcmp(ch,"Saturday")==0) { printf("%d\n",a[0]); } if(strcmp(ch,"Sunday")==0) { printf("%d\n",a[0]); } } return 0; }
运行示例:
这里用到了冒泡排序,冒泡排序的思想是每趟比较相邻的两个,时间复杂度是O(n^2),不需要额外空间,是稳定排序。因为它要用到内外两层for循环:外层循环用于遍历每个元素,内层循环用于比较第i个元素和len-i-1个元素的大小,比如在第一趟时,要比较出最大的元素,放到最底下,小的元素排在前面,那么此时a[6]就是所有元素中最大值了。
以此类推。
冒泡排序(升序)代码如下:
void sort(int *a,int len) { /*冒泡排序(升序)*/ int temp; for(int i=0;i<len;i++) { for(int j=0;j<len-i-1;j++) { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } }
测试结果示意:
相关文章推荐
- 编程经验点滴(一)——《C 语言中定义字符串的问题》
- JAVA与C++::关于JNI中文字符串操作问题总结
- 字符串处理:中英文混排固定长度截取问题
- 拆字符串问题
- 字符串、汉字的拆分问题的解法
- VC中一个关于宏的使用问题,字符串之间转换,宽字符与普通字符
- Oracle函数返回超长字符串问题
- PHP截取中文字符串的问题
- Enterprise Library- Data Block使用oracle存储过程,字符串参数传入值为""时出现问题的解决
- 安全字符串 SecureString 的设计与实现 [1] 现有问题与解决方法
- 用正则表达式处理含中文字符串的问题
- 含有中文字符串的截取问题!
- 字符串处理路径问题
- 旧话重提---使用FxCop检测出字符串相关的2个问题
- 字段里字符串的处理问题
- 关于char数组和字符串的一些问题
- Java与C之间通过JNI传递中文字符串及乱码问题
- 旧题新貌:PHP截取中文字符串的问题
- 使用hibernate心得——字符串超长的解决办法(setCharacterStream出现顺序问题)
- 字符串、汉字的拆分问题的解法