您的位置:首页 > 理论基础 > 数据结构算法

[冒泡排序+字符串]吃花生问题

2014-11-11 22:08 204 查看
在百度知道上看到有人问这个问题,冒泡排序和字符串结合的题,正好今天没有完成编程任务,所以就拿来练手了,虽然题目不难,但是考察的C语言基础东西还是不少,对于从大一开始就没怎么写C程序的我来说,一两分钟就AC出来也不是一件很容易的事,所以还是要加紧练习才行呀。

题目描述如下:

描述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;
}
}
}
}


测试结果示意:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息