黑马程序员技术交流社区

标题: 求帮忙,又是排序问题 [打印本页]

作者:  常洋洋    时间: 2015-4-17 12:20
标题: 求帮忙,又是排序问题
本帖最后由  常洋洋 于 2015-4-17 22:06 编辑
  1. /*
  2. 9、 从键盘输入6个字符串(仅仅包含英文字母和数字),对这6个字符串从小到大排列并输出结果。(C语言)
  3. */

  4. #include <stdio.h>
  5. #include <string.h>

  6. int main()
  7. {
  8.    
  9.    //定义一个数组,
  10.     char ch[6][500];
  11.     for (int i = 0; i<6; i++)
  12.     {
  13.         printf("键入第%d个字符串:",i+1);
  14.         scanf("%s",ch[i]);
  15.         
  16.     }
  17.    
  18.     //计算各个字符串长度
  19.     int  count[6];
  20.     for (int i = 0; i<6; i++){
  21.         //把字符串长度赋值给数组里面的元素
  22.         count[i] = (int)strlen(ch[i]);
  23.     }
  24.    
  25.     // 定义一个数组x用来存放各个字符串出现次数
  26.     int x[6];
  27.     for(int i =0;i<6;i++)
  28.     {
  29.         x[i]=count[i];
  30.     }
  31.    
  32.     // 定义temp用于冒泡排序标记排序趟数
  33.     int temp;
  34.    
  35.     // 冒泡排序  将count[0]~count[5]降序排序
  36.     for (int i = 0; i<5; i++)
  37.     {
  38.         for(int j = 0;j<5;j++)
  39.         {
  40.             if (x[j] < x[j+1])
  41.             { // 当前一个元素小于后一个元素时,交换它们的位置
  42.                 temp = x[j];
  43.                 x[j] = x[j+1];
  44.                 x[j+1] = temp;
  45.             }
  46.         }
  47.     }
  48.     int *p =x;
  49.     *(p-1)=x[0]-1; //x[0]前内存赋值,使它和x[0]不一样,方便下面使用x[0]和x[1]比较
  50.    
  51.     //for 嵌套循环对这6个字符串从小到大排列并输出结果
  52.     for( int i=0;i<6;i++)
  53.     { for(int j=0;j<6;j++)
  54.     {
  55.         if (x[i]==x[i-1]) break; //当字符大小有相同时,打断for循环,避免重复输出
  56.         else if (x[i]==count[j]) printf("%s %d\n",ch[j],x[i]);
  57.         
  58.     }
  59.         
  60.     }
  61.    
  62.     return 0;
复制代码
最后一个循环看不懂啊,求高人给予解答

作者: 霸王睡别姬    时间: 2015-4-17 15:42
给你个能看懂的。。0.0..
  1. //预处理命令
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. //程序入口
  6. int main()
  7. {
  8.         //用一个二维数组存储
  9.         char array[6][100];
  10.         //排序临时变量
  11.         char string[30];
  12.         //循环变量
  13.         int i;
  14.         //提示输入6个字符串
  15.         for(i=0;i<6;i++)
  16.         {        //提示输到第几个了
  17.                 printf("第%d个字符串:",i+1);
  18.                 //接收用户输入
  19.                 scanf("%s",array[i]);
  20.         }
  21.         //打印排序前的顺序
  22.         printf("排序前的顺序:\n");
  23.         for(i=0;i<6;i++)
  24.         {       
  25.                 printf("%s\t",array[i]);
  26.         }

  27.         //下面为冒泡排序
  28.         int j=0;
  29.         for(i=0;i<6;i++)
  30.         {
  31.                 for(j=0;j<5-i;j++)
  32.                 {
  33.                         //用字符串比较函数和替换函数实现排序
  34.                         if(strcmp(array[j],array[j+1])>0)
  35.                         {
  36.                                 strcpy(string,array[j+1]);
  37.                                 strcpy(array[j+1],array[j]);
  38.                                 strcpy(array[j],string);
  39.                                
  40.                         }
  41.                 }
  42.         }
  43.         //打印排序后
  44.         printf("\n排序后的顺序:\n");
  45.         for(i=0;i<6;i++)
  46.         {
  47.                 printf("%s\t",array[i]);
  48.         }

  49.         return 0;

  50. }
复制代码

作者: sunyang    时间: 2015-4-17 20:53
我帮2楼解释下吧
楼主的程序读起来太累了,建议数组名字使用有意义的单词或者拼音
  1. /*

  2. * 分析:用二维数组来存储字符串,一维长度表示字符串的个数,二维长度表示具体字符串的长度

  3.         把每一个元素(字符串)看做存放在字符数组中,再使用冒泡排序对其进行排序,判断大小的过程中需要使用到字符串函数strcmp

  4. * 思路(步骤):

  5.         (1)定义一个二维字符数组,用于存储字符串,一维长度表示字符串的个数,二维长度表示具体字符串的长度;

  6.         (2)把每个字符串分别存放在一个字符数组中,这些字符数组是有序的集合;

  7.         (3)使用冒泡排序进行排序;

  8.             1)使用strcmp函数判断字符串之间的大小关系;

  9.             2)满足条件的时候,使用strcpy函数来完成相邻字符串的交换;

  10.         (4)最后通过遍历数组元素的方法打印出从小到大得排序结果

  11. */
复制代码

——————————————————————————————————————————
如果我解决了你的问题,请按照这个帖子把问题改成已解决,这样你我都能得到技术分,谢谢
http://bbs.itheima.com/thread-85079-1-1.html

作者: sunyang    时间: 2015-4-17 23:23
sunyang 发表于 2015-4-17 20:53
我帮2楼解释下吧
楼主的程序读起来太累了,建议数组名字使用有意义的单词或者拼音

他思路是对的,结果不对是代码问题




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