黑马程序员技术交流社区

标题: 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.    1.一个比较字符串大小的函数,
  3.    2.类似temp = a, a = b, b= temp 这样的两个字符串的交换
  4.    3. 排序的算法,比如冒泡,快速等

  5. 第2题
  6. #include <stdio.h>
  7. int leap(int year,int *flag);   // 是否闰年
  8. int getDaysFromMonth(int month,int *flag);  // 根据月份获得对应天数
  9. int howManyDays(int year,int month, int day);  // 计算与2006-1-1日的天数差距

  10. int main()
  11. {
  12.        int year,month,day;
  13.        printf("请输入年月日:");
  14.       // 从键盘得到年月日
  15.       scanf("%d,%d,%d",&year,&month,&day);
  16.       int _distanceDays = howManyDays(year,month,day);
  17.      if (_distanceDays % 2 == 0)
  18.      {
  19.            printf("今天遇到位帅哥\n");
  20.       }
  21.       if (_distanceDays % 3 == 0)
  22.      {
  23.            printf("今天遇到位美女\n");
  24.      }
  25.   return 0;
  26. }
  27. // 判断闰年
  28. int leap(int year,int *flag)
  29. {
  30.        //  是闰年
  31.        if ((year % 4  == 0 && year % 100 != 0) || (year % 400 == 0))
  32.       {
  33.             *flag = 1;
  34.              return 366;
  35.       }
  36.       else
  37.       {
  38.             *flag = 0;
  39.            return 365;
  40.       }
  41. }

  42. // 获得月份对应的天数
  43. int getDaysFromMonth(int month,int *flag)
  44. {
  45.       int daysContainer[2][12] = {
  46.          {
  47.               31,28,31,30,31,30,31,31,30,31,30,31    // 平年月份对应的天数
  48.          },
  49.          {
  50.                31,29,31,30,31,30,31,31,30,31,30,31    // 闰年月份对应的天数
  51.           }
  52.   };
  53. // 平年*flag = 0 所以是daysContainer[0]  闰年则是daysContainer[1] 月份需要 -1 对应数组下标
  54.      return daysContainer[*flag][month - 1];
  55. }

  56. // 计算离2006-1-1的时间差
  57. int howManyDays(int year,int month, int day)
  58. {
  59.        int distanceDays;    // 距离2006-1-1的天数
  60.        int *flag = (int *)(malloc(sizeof(int *)));  
  61.        int i,j;
  62.       for (i = 2006; i < year; i++)
  63.       {
  64.             distanceDays += leap(i,flag);   // 与2006相差多少年
  65.       }
  66.       for (j = 1; j < month ; j++)
  67.       {
  68.              distanceDays += getDaysFromMonth(j,flag);   // 年份相同的情况下,相差多少天
  69.       }
  70.       distanceDays += day;   // 年份月份相同的情况下,相差多少天 2006-1-1也算一天
  71.       free(flag);
  72.       return distanceDays;
  73. }


复制代码



作者: 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
羽零八 发表于 2014-12-30 11:08
如果你把分给我 我可以直接给你代码答案。。。

可以啊:lol
作者: 魅影惊鸿    时间: 2014-12-31 14:54
进来看看
作者: 火焱w    时间: 2015-1-3 10:53
王德亮 发表于 2015-1-2 11:32

非常感谢:lol
作者: 火焱w    时间: 2015-1-3 10:59
羽零八 发表于 2014-12-30 11:08
如果你把分给我 我可以直接给你代码答案。。。

求答案,但是分数怎么给你。
作者: 励志Java_鸿政    时间: 2015-1-4 00:45
嗷嗷嗷 发表于 2014-12-28 09:52
第二题,你看过李白买酒那道题吗?是一样的,逆向思维

赞同,这个是一样的。稍微变换一下就应该能出来吧
作者: scarlettche    时间: 2015-1-6 22:06
王德亮 发表于 2015-1-2 11:32

测试2006,1,6日的有问题,遇见美女和帅哥
作者: 王德亮    时间: 2015-1-7 12:39
scarlettche 发表于 2015-1-6 22:06
测试2006,1,6日的有问题,遇见美女和帅哥

每三天结识一个美女两天结识一个帅哥
我是认为每经过3天就认识一个美女 每经过2天就认识一个帅哥
2006年1月6日是第6天
  1. if (_distanceDays % 2 == 0)
  2.      {
  3.            printf("今天遇到位帅哥\n");
  4.       }
  5.       if (_distanceDays % 3 == 0)
  6.      {
  7.            printf("今天遇到位美女\n");
  8.      }
复制代码

2个if条件都成立


作者: scarlettche    时间: 2015-1-14 10:21
王德亮 发表于 2015-1-7 12:39
每三天结识一个美女两天结识一个帅哥
我是认为每经过3天就认识一个美女 每经过2天就认识一个帅哥
2006年1 ...

哦,理解题意有不同
作者: Fighting--BJ    时间: 2015-6-22 01:41
学习学习!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2