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

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

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

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

讲字符换算成ASCII数字

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

进行遍历,删除重复字符

三.程序:

 #include <stdio.h>
#include <string.h> #define SIZE 64 //利用冒泡法进行排序
int bubble_order(int arry[],int len)
{
char temp;
for (int i=;i<len;i++)//每轮得出一个该轮的最大值
{ //i记录的是比较了多少轮,每轮比较完成之后i++
for (int j=;j<len-i-;j++)
{
if (arry[j]>arry[j+])
{
temp = arry[j];
arry[j] = arry[j+];
arry[j+] = temp;
} }
}
return ;
}
int main(void)
{
char *pString; //字符串指针
int length; //字符串实际长度
int szBuffer[SIZE]={}; //定义整型数组存放变换之后的字符串 printf("Please input string :\n");
scanf("%s",pString); //输入字符串
length = strlen(pString);//获取字符串长

for (int i=;i<length;i++)
{
if((*pString>'')&(*pString<''))
szBuffer[i] = *pString-'0';
if ((*pString>'a')&(*pString<'z'))
szBuffer[i] = *pString-'a';
if ((*pString>'A')&(*pString<'Z'))
szBuffer[i] = *pString-'A'; pString++;
} //调用冒泡函数
bubble_order(szBuffer,length); printf("The order of string is :\n");
for(i=;i<length;i++)
{
printf("%s",szBuffer[i]);
} return ; }

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

五.分析问题:

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

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

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

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

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

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

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

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

六.改进:

 #include <stdio.h>
#include <string.h> #define SIZE 64 //利用冒泡法进行排序
int bubble_order(char arry[],int len)
{
char temp;
for (int i=;i<len;i++)//每轮得出一个该轮的最大值
{ //i记录的是比较了多少轮,每轮比较完成之后i++
for (int j=;j<len-i-;j++)
{
if (arry[j]>arry[j+])
{
temp = arry[j];
arry[j] = arry[j+];
arry[j+] = temp;
} }
}
return ;
}
int main(void)
{
char String[SIZE]; //字符串指针
int length; //字符串实际长度
int szBuffer[SIZE]={}; //定义整型数组存放变换之后的字符串 printf("Please input string :\n");
scanf("%s",String); //输入字符串 length = strlen(String);//获取字符串长度 //调用冒泡函数
bubble_order(String,length); printf("The order of string is :\n");
for(int i=;i<length;i++)
{
printf("%c",String[i]);
}
printf("\n");
return ; }

七.待解决问题

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

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

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

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

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

 //利用冒泡法进行排序
int bubble_order(char arry[],int len)
{
char temp;
int eql = 0;//eql用来记录相等字符的对数
for (int i=;i<len;i++)//每轮得出一个该轮的最大值
{ //i记录的是比较了多少轮,每轮比较完成之后i++
for (int j=;j<len-i--eql;j++)
{
//若相邻字符不相等则将大的放在后面
if (arry[j]>arry[j+])
{
temp = arry[j];
arry[j] = arry[j+];
arry[j+] = temp;
}
//若相邻相等则删除一个
else if(arry[j] == arry[j+])
{ /*一旦发现有相等的字符,所有在该字符后面的字符
全部往前挪一个位置以此来覆盖掉相等字符的第二个字符*/
for(int m=j+;m<len;m++)
{
arry[m] = arry[m+];
}
eql ++;
}
}
}
return ;
}

八.运行结果

九.涉及的知识点:

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};//错误

十.备注

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

 #include<stdio.h>
#include"string.h"
int main(void)
{
char str1[]={},str2[]={};
int i;
gets(str1);
for(i=;str1[i];i++)
{
str2[str1[i]]=;
}
for(i=;i!=;i++)
if(str2[i]==)
printf("%c",i);
putchar('\n');
return ;
}

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

C语言每日一题之No.3的更多相关文章

  1. C语言每日一题之No.1

    鉴于在学校弱弱的接触过C,基本上很少编程,C语言基础太薄弱.刚好目前从事的是软件编程,难度可想而知.严重影响工作效率,已无法再拖下去了.为此,痛下决心恶补C语言.此前只停留在看书,光看好像也记不住,C ...

  2. C语言每日一题之No.9

    再做决定之前,我还是做好自己该做的.我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦.尊敬的女王陛下,请接题: 一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规 ...

  3. C语言每日一题之No.8

    正式面对自己第二天,突然一种强烈的要放弃的冲动,在害怕什么?害怕很难赶上步伐?害怕这样坚持到底是对还是错?估计是今天那个来了,所以身体激素有变化导致情绪起伏比较大比较神经质吧(☆_☆)~矮油,女人每个 ...

  4. C语言每日一题之No.4

    这几天老大也没安排我什么项目,于是想正好趁着空补C.当然,是利用晚上加班时间,白天正常上班时间还是学习公司的平台. 今儿个突然弱弱的感觉到在公司补C是件很低级的事情,哪怕是在加班时间都会被喷,因为大家 ...

  5. C语言每日一题之No.12

    文件操作知识:如何将一个文件的内容读取到另一个文件里? fread函数和fwrite函数   1.函数功能   用来读写一个数据块. 2.一般调用形式   fread(buffer,count,siz ...

  6. C语言每日一题之No.7

    今天是正式第一天在现有的世界里与自己相处,你再也没有另一个世界可以躲避了.终于要自己面对自己了,一个人要真实的面对自己的灵魂总是痛苦的.从学校到社会的环境转换,现实与理想的冲突,个人价值观和社会价值观 ...

  7. C语言每日一题之No.6

    人总要战胜内心的懦弱的,我不能一直这么缩在里边.终究向自己发出了挑战,还是会伤心的时候,发愣的时候.如果可以,我也希望像盗梦空间的女主一直沉在两个人的梦里永远不要醒来.可是,我们谁又能抗拒时间呢?这雨 ...

  8. C语言每日一题之No.5

    总在想,但凡编程基础正常点,都不至于惨败到这个地步.也像大多数人毕业出来,新鲜的第一份工作,如果做得好还可以略有成就感,做得一般还有提升的空间,但至少不至于像我这样基本没基础的被鄙视得一塌糊涂,被外界 ...

  9. C语言每日一题之No.2

    题目:已知三个整型数8,12,6,按公式s=a+b*c计算,并显示结果 思路:定义三个整型变量a,b,c 定义一个变量s用来保存运算结果 输出 程序: #include <stdio.h> ...

随机推荐

  1. 215. Kth Largest Element in an Array

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  2. break、continue与return见的区别

    比较简单的说法就是: 1.break:跳出当前的循环体 2.continue:跳出本次的循环 3.return:返回调用函数(也就完全的跳出了函数块) 好,下面就是我的代码练习君了: package ...

  3. hihoCoder#1014 Trie树 (前缀树)

    题目大意:给一本有n个单词的词典,有m次询问,每次询问的是该词典中有多少个单词有共同的某个前缀. 题目分析:在添加单词建立trie的时候,每经过一个节点就意味着该节点和它的各级祖先节点是某个单词的前缀 ...

  4. 越狱Season 1-Episode 19: The Key

    Season 1, Episode 19: The Key -Kellerman: WeusedtohaveaGreatDane, Dane: 丹麦大狗 我们以前有一只大丹犬 bigandwild. ...

  5. 字符串分割函数 STRTOK & STRTOK_R (转)

    1.一个应用实例 网络上一个比较经典的例子是将字符串切分,存入结构体中.如,现有结构体 typedef struct person{     char name[25];     char sex[1 ...

  6. How to Configure the Gradient Boosting Algorithm

    How to Configure the Gradient Boosting Algorithm by Jason Brownlee on September 12, 2016 in XGBoost ...

  7. (转) Learning from Imbalanced Classes

    Learning from Imbalanced Classes AUGUST 25TH, 2016 If you’re fresh from a machine learning course, c ...

  8. Java static block static constructor , static field

    http://stackoverflow.com/questions/7121213/singleton-instantiation http://docs.oracle.com/javase/spe ...

  9. dump java

    http://www.gamlor.info/wordpress/2011/09/visualvm/ https://visualvm.java.net/zh_CN/gettingstarted.ht ...

  10. GDB动态库搜索路径

    当GDB无法显示so动态库的信息或者显示信息有误时,通常是由于库搜索路径错误导致的,可使用set sysroot.set solib-absolute-prefix.set solib-search- ...