黑马程序员技术交流社区
标题: c语言基础问题,求思路。 [打印本页]
作者: 火焱w 时间: 2014-12-26 23:18
标题: c语言基础问题,求思路。
1、从键盘输入6个字符串(仅仅包含英文字母和数字),对这6个字符串从小到大排列并输出结果。(C语言)
2、小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)
作者: 王德亮 时间: 2014-12-26 23:18
本帖最后由 王德亮 于 2015-1-2 16:19 编辑
- 第1题,可以对比整数的排序过程
- 1.一个比较字符串大小的函数,
- 2.类似temp = a, a = b, b= temp 这样的两个字符串的交换
- 3. 排序的算法,比如冒泡,快速等
- 第2题
- #include <stdio.h>
- int leap(int year,int *flag); // 是否闰年
- int getDaysFromMonth(int month,int *flag); // 根据月份获得对应天数
- int howManyDays(int year,int month, int day); // 计算与2006-1-1日的天数差距
- int main()
- {
- int year,month,day;
- printf("请输入年月日:");
- // 从键盘得到年月日
- scanf("%d,%d,%d",&year,&month,&day);
- int _distanceDays = howManyDays(year,month,day);
- if (_distanceDays % 2 == 0)
- {
- printf("今天遇到位帅哥\n");
- }
- if (_distanceDays % 3 == 0)
- {
- printf("今天遇到位美女\n");
- }
- return 0;
- }
- // 判断闰年
- int leap(int year,int *flag)
- {
- // 是闰年
- if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
- {
- *flag = 1;
- return 366;
- }
- else
- {
- *flag = 0;
- return 365;
- }
- }
- // 获得月份对应的天数
- int getDaysFromMonth(int month,int *flag)
- {
- int daysContainer[2][12] = {
- {
- 31,28,31,30,31,30,31,31,30,31,30,31 // 平年月份对应的天数
- },
- {
- 31,29,31,30,31,30,31,31,30,31,30,31 // 闰年月份对应的天数
- }
- };
- // 平年*flag = 0 所以是daysContainer[0] 闰年则是daysContainer[1] 月份需要 -1 对应数组下标
- return daysContainer[*flag][month - 1];
- }
- // 计算离2006-1-1的时间差
- int howManyDays(int year,int month, int day)
- {
- int distanceDays; // 距离2006-1-1的天数
- int *flag = (int *)(malloc(sizeof(int *)));
- int i,j;
- for (i = 2006; i < year; i++)
- {
- distanceDays += leap(i,flag); // 与2006相差多少年
- }
- for (j = 1; j < month ; j++)
- {
- distanceDays += getDaysFromMonth(j,flag); // 年份相同的情况下,相差多少天
- }
- distanceDays += day; // 年份月份相同的情况下,相差多少天 2006-1-1也算一天
- free(flag);
- return distanceDays;
- }
复制代码
作者: scarlettche 时间: 2014-12-27 10:47
第一个就不说了,应该是ASCII码值的比较问题。
回答你第二个问题,首先应该将年月日分割成3个部分来考虑,用两个函数将年和月分别转化成日,返回主函数,主函数用求余计算则可计算当天是遇见帅哥还是美女。
年的转化函数思路:年份<2008,没有闰年,用2006作为基准做减法再乘以365就行;年份>2008,也是用2006年作为基准做减法再乘以365,那你会说,人家说了要考虑闰年问题。闰年来了:2006年不是闰年就找到最近的一个闰年作为判断基准,那就是2008年,例如,(2012-2008)/4=1,所以如果函数传递过来的参数是2012的话,那么从年上面来考虑的话就只经历过一个闰年(因为2012年当年不能进入计算,不明白?看下面的月计算函数你就知道为什么了!),那你就再加个1咯!
月的转化函数思路:函数传递过来两个参数,一个是年,一个是月。首先自己建立一个数组存放每个月份的天数,然后用个for循环就自动加上了。再说闰年问题,之前不是传递过来一个年吗?判断如果当年是闰年,且传递过来的月份>2,则最后自己再加上个1天就ok了。
我这个是我自己的思路哈,如果有哪位大神有更效率的方法,感谢分享!
作者: 火焱w 时间: 2014-12-28 01:57
看不懂,估计这道题我晕了
作者: 嗷嗷嗷 时间: 2014-12-28 09:52
第二题,你看过李白买酒那道题吗?是一样的,逆向思维
作者: zhaozigeng 时间: 2014-12-28 16:46
1、从键盘输入6个字符串(仅仅包含英文字母和数字),对这6个字符串从小到大排列并输出结果。(C语言)
C语言里面的char实现上就是整形,完全可以用书上讲的冒泡排序进行处理.
不知道能不能帮助你.
作者: zhiyi 时间: 2014-12-28 17:58
第一个:在头文件加入#inlude<string.h>;然后就可以使用strcmp(字符串1,字符串2) 进行大小比较,如果 字符串1>字符串2 返回值大于0,字符串1<字符串2 返回值大于0,相等返回0;
不用string.h也行,把字符逐位求差,不用类型转换,可以直接减
作者: 寻觅 时间: 2014-12-29 09:24
来学习的!
作者: bun 时间: 2014-12-29 22:22
用递归啊,简单就解决了
作者: 羽零八 时间: 2014-12-30 11:08
如果你把分给我 我可以直接给你代码答案。。。
作者: 陈旭刚520 时间: 2014-12-30 12:39
受教了 进来学习学习
作者: 火焱w 时间: 2014-12-31 14:05
可以啊:lol
作者: 魅影惊鸿 时间: 2014-12-31 14:54
进来看看
作者: 火焱w 时间: 2015-1-3 10:53
非常感谢:lol
作者: 火焱w 时间: 2015-1-3 10:59
求答案,但是分数怎么给你。
作者: 励志Java_鸿政 时间: 2015-1-4 00:45
赞同,这个是一样的。稍微变换一下就应该能出来吧
作者: scarlettche 时间: 2015-1-6 22:06
测试2006,1,6日的有问题,遇见美女和帅哥
作者: 王德亮 时间: 2015-1-7 12:39
每三天结识一个美女两天结识一个帅哥
我是认为每经过3天就认识一个美女 每经过2天就认识一个帅哥
2006年1月6日是第6天
- if (_distanceDays % 2 == 0)
- {
- printf("今天遇到位帅哥\n");
- }
- if (_distanceDays % 3 == 0)
- {
- printf("今天遇到位美女\n");
- }
复制代码
2个if条件都成立
作者: scarlettche 时间: 2015-1-14 10:21
哦,理解题意有不同
作者: Fighting--BJ 时间: 2015-6-22 01:41
学习学习!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |