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

本文介绍了一道结合冒泡排序与字符串处理的C语言题目,通过对不同天对应的花生数量进行排序并匹配正确的天数来解决。文章展示了如何正确使用字符串比较函数以及实现冒泡排序算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在百度知道上看到有人问这个问题,冒泡排序和字符串结合的题,正好今天没有完成编程任务,所以就拿来练手了,虽然题目不难,但是考察的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;
			}
		}
	}
}

测试结果示意:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值