zoukankan      html  css  js  c++  java
  • C语言每日一题之No.3

        几天下来,感慨学习要坚持下来真的是件很难的事,本来说了每天一题,可是毕竟这是个细活,需要用心雕琢,有时候真的不能当天拿下来>_<。虽然说只是一题,却涉及到很多小细节,慢慢的琢磨直至完全摸透才是根本。好吧,接下来吐槽一下吧,都是上班的人了,基础酱紫,压力好大的有木有,心里发虚同时又没有成就感~>_<~,持续的挫败感让自己开始怀疑自己,到底是什么让我在坚持到现在呢?不知天高地厚的棱角都被现实磨平了,却还在坚持。喜欢?还是说把自信和傲娇从哪里剥夺就从哪里抢回来?o_o应该都有,盲目的喜欢,骨子里又有那股子韧劲,那那那,自己找虐哈~

    一.题目:从键盘输入一个字符串,按照字符顺序从小到大进行排序,并要求删除重复字符。

       比如输入”ad2f3adjfeainzzzv”,则输出”23adefijnvz”

    二.思路:先定义一个字符数组用来存储字符串

            讲字符换算成ASCII数字

            将换算过来的数字进行排序(考虑冒泡法)

            进行遍历,删除重复字符

    三.程序:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 #define SIZE 64
     5 
     6 //利用冒泡法进行排序
     7 int bubble_order(int arry[],int len)
     8 {
     9    char temp;
    10    for (int i=0;i<len;i++)//每轮得出一个该轮的最大值
    11    {   //i记录的是比较了多少轮,每轮比较完成之后i++
    12        for (int j=0;j<len-i-1;j++)
    13        {
    14          if (arry[j]>arry[j+1])
    15          {
    16              temp = arry[j];
    17              arry[j] = arry[j+1];
    18              arry[j+1] = temp;
    19          }25        }
    26    }
    27    return 0;
    28 }
    29 int main(void) 30 { 31 char *pString; //字符串指针 32 int length; //字符串实际长度 33 int szBuffer[SIZE]={0}; //定义整型数组存放变换之后的字符串 34 35 printf("Please input string : "); 36 scanf("%s",pString); //输入字符串 37 length = strlen(pString);//获取字符串长
    38 39 for (int i=0;i<length;i++) 40 { 41 if((*pString>'0')&(*pString<'9')) 42 szBuffer[i] = *pString-'0'; 43 if ((*pString>'a')&(*pString<'z')) 44 szBuffer[i] = *pString-'a'; 45 if ((*pString>'A')&(*pString<'Z')) 46 szBuffer[i] = *pString-'A'; 47 48 pString++; 49 } 50 51 //调用冒泡函数 52
    bubble_order(szBuffer,length); 53 54 printf("The order of string is : "); 55 for(i=0;i<length;i++) 56 { 57 printf("%s",szBuffer[i]); 58 } 59 60 return 0; 61 62 }

    四.编译运行:输入字符串就显示内存“error”

    五.分析问题:

       1.scanf的用法不清楚导致出现这种低级错误

         scanf函数的调用格式为:scanf("<格式说明字符串>",<变量地址>)

    1  char *pString; //字符串指针
    ...... 6 scanf("%s",pString); //输入字符串 7 /*不能这样用scanf,scanf的变量地址必须是数组的地址,不可以是指针的地址*/

       2.要比较字符大小为嘛就要换算成数值?

     1 for (int i=0;i<length;i++)
     2   {
     3         if((*pString>'0')&(*pString<'9'))
     4          szBuffer[i] = *pString-'0';
     5       if ((*pString>'a')&(*pString<'z'))
     6          szBuffer[i] = *pString-'a';
     7       if ((*pString>'A')&(*pString<'Z'))
     8          szBuffer[i] = *pString-'A';
     9 
    10       pString++;
    11   }
    12   /*这样是错误的换算,比如你输入'3'还有'E',那么'3'得到的是3而'E'得到的是4
    13     这显然不对了。要比较字符大小其实就是比较ASCII码,每个字符都对应一个ASCII码,
    14     SCII码是字符的属性,所以根本就无须把字符划算成ASCC码,可以直接比较*/

        再说了,如果字符换算成了数值来排序,接着把拍好的数组输出时,有没有想过一个问题:这时候你难不成还要把数值再换算成字符再输出?不然你怎么保持原有的字符串?

       3.如果不需要将字符换算成数值,那么冒泡法的形参int array[ ]是不是也该改成char arry[ ] 才能与字符数组匹配呢?问题是,冒泡法可以比较字符吗?不是一定要数字吗?笨蛋,程序是你自己写的,函数你编的,还不是你说了算。

       4.在最后输出那里,printf("%s",String[i])这句话太奇葩了,String[i]是字符,怎么可以用%s来输出呢?当然是%c了

        

    六.改进:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 #define SIZE 64
     5 
     6 //利用冒泡法进行排序
     7 int bubble_order(char arry[],int len)
     8 {
     9    char temp;
    10    for (int i=0;i<len;i++)//每轮得出一个该轮的最大值
    11    {   //i记录的是比较了多少轮,每轮比较完成之后i++
    12        for (int j=0;j<len-i-1;j++)
    13        {
    14          if (arry[j]>arry[j+1])
    15          {
    16              temp = arry[j];
    17              arry[j] = arry[j+1];
    18              arry[j+1] = temp;
    19          }     25        }
    26    }
    27    return 0;
    28 }
    29 int main(void) 30 { 31 char String[SIZE]; //字符串指针 32 int length; //字符串实际长度 33 int szBuffer[SIZE]={0}; //定义整型数组存放变换之后的字符串 34 35 printf("Please input string : "); 36 scanf("%s",String); //输入字符串 37 38 length = strlen(String);//获取字符串长度 39 40 //调用冒泡函数 41 bubble_order(String,length); 42 43 printf("The order of string is : "); 44 for(int i=0;i<length;i++) 45 { 46 printf("%c",String[i]); 47 } 48 printf(" "); 49 return 0; 50 51 }

    七.待解决问题

       好了,现在能够实现输入和排序了,剩下的问题是怎样删除重复的字符呢?

       思路:由于采用的是冒泡法思想:每两个相邻字符进行比较,所以在排序的过程中相等的字符肯定会相邻  

             相遇.这个时候,把所有在他们后面的字符全部都往前挪一个位置,来覆盖相等字符的第二个  

            字符,这样就达到删除的效果了。

       程序: 以下仅显示冒泡函数的改动

     1 //利用冒泡法进行排序
     2 int bubble_order(char arry[],int len)
     3 {
     4    char temp;
     5    int  eql = 0;//eql用来记录相等字符的对数
     6    for (int i=0;i<len;i++)//每轮得出一个该轮的最大值
     7    {   //i记录的是比较了多少轮,每轮比较完成之后i++
     8        for (int j=0;j<len-i-1-eql;j++)
     9        {
    10          //若相邻字符不相等则将大的放在后面
    11          if (arry[j]>arry[j+1])
    12          {
    13              temp = arry[j];
    14              arry[j] = arry[j+1];
    15              arry[j+1] = temp;
    16          }
    17          //若相邻相等则删除一个
    18          else if(arry[j] == arry[j+1])
    19          {   /*一旦发现有相等的字符,所有在该字符后面的字符
    20              全部往前挪一个位置以此来覆盖掉相等字符的第二个字符*/
    21              for(int m=j+1;m<len;m++)
    22              {
    23                 arry[m] = arry[m+1];
    24              } 
    25              eql ++;
    26          }
    27        }
    28    }
    29    return 0;
    30 }

    八.运行结果

       

    九.涉及的知识点:

    1.冒泡法的原理

        冒泡排序算法的运作如下:

        1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
        2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会最大的数。
        3)针对所有的元素重复以上的步骤,除了最后一个数。
        4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    2.scanf函数的用法

      调用形式为: scanf("<格式说明字符串>",<变量地址>);

      变量地址要求有效,并且与格式说明的次序致。

      scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。

    3.每个字符都对应一个ASCII码,SCII码是字符的固有属性

    4.数组初始化知识

      1)关于数组大小:可以用空的方括号对数组进行初始化,编译器会根据列表中的元素数目来确定数组大小

      2)关于数组初始值:如果不初始化数组,数组元素的值是垃圾值;但是如果部分元素初始化了,那么未初    

         始化的数组的值是0

      3)只有在初始化数组时才可以对数组整体赋值,声明完数组后,借助数组的下标对数组成员进行赋值,不

         允许整体赋值(也不支持实用花括号括起来的列表形式进行赋值)。

         例如:int year[SIZE];

               year={5,3,2,8};//错误

         

     

     十.备注

        一个函数功能的实现绝非只有一种方法,以下贴出网上关于此题的另外解法:

     1 #include<stdio.h>
     2 #include"string.h"
     3 int main(void)
     4 {
     5     char str1[500]={0},str2[256]={0};
     6     int i;
     7     gets(str1);
     8     for(i=0;str1[i];i++)
     9     {
    10         str2[str1[i]]=1;
    11     }
    12     for(i=0;i!=256;i++)
    13         if(str2[i]==1)
    14             printf("%c",i);
    15     putchar('
    ');
    16     return 0;
    17 }

       

      那就继续享受编程之路吧~ *>﹏<*

  • 相关阅读:
    ASP.NET MVC Framework 系列
    点站点链接出现短时间白屏或闪屏现象
    Asp.net Mvc Framework 一 (安装并建立示例程序)
    LINQ: Reconciling objects, relations and XML in the .NET framework
    乱学MonoRail A(问题随笔)
    可爱的MicrosoftAjax.js精简版(47K)
    成幻SNS(CHSNS#) 仿Facebook 风格发布,让您体验更专业的风格
    Asp.net Mvc Framework 二 (URL Routing初解)
    CHSNS# 1.05 正式发布 帮您创建您的Facebook
    Asp.net Mvc Framework 五 (向View传值以及Redirect)
  • 原文地址:https://www.cnblogs.com/TTTTT/p/3708224.html
Copyright © 2011-2022 走看看