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

    1.OPTION (MAXRECURSION 25) :最大允许递归的次数.默认最大CTE递归只有100次,而你要求插入10年的数据,需要递归3000多次,所以要使用option (MAXRECURS ...

  2. jsonp跨域请求数据实例——手机号码查询

    前言 网上有很多开放的api,我们在本地通过ajax获取数据时,总会碰到一个问题,那就是跨域!如果不借助php等,仅仅通过js怎么解决跨域的问题呢?或许jsonp是个不错的选择. 知识准备 上篇博客 ...

  3. coreseek(sphinx)安装1(xml数据源配置和测试)

    1.下载coreseek-3.2.14-32版本.网址:http://www.coreseek.cn/products-install/install_on_windows/   (有详细的安装说明) ...

  4. C特殊浮点值NaN

    特殊浮点值NaN(Not-a-Number),例如asin()函数返回反正弦值,所以输入参数不能大于1,否则函数返回NaN值,printf()显示为nan,NaN或类似形式.

  5. php部分--题目:投票

    1.建立两个表格:要显示百分比的话,就要在选项表中加上一列标记number 2.链接数据库,并对题目和选项进行显示 <?php $db=new MySQLi("localhost&qu ...

  6. windows7下python3.4.3 添加库路径(转)

    1, 动态的添加库路径.在程序运行过程中修改sys.path的值,添加自己的库路径import syssys.path.append(r'your_path') 2, 在Python安装目录下的\Li ...

  7. Apache的https协议配置

    一.http协议和https协议的传输格式 http:文本格式的协议 https:二进制格式的协议 二.x509.3证书格式: 证书格式的版本号 证书序列号 证书签名算法 证书颁发者 有效期 持有者的 ...

  8. DAG上的动态规划之嵌套矩形

    题意描述:有n个矩形,每个矩形可以用两个整数a.b描述,表示它的长和宽, 矩形(a,b)可以嵌套在矩形(c,d)当且仅当a<c且b<d, 要求选出尽量多的矩形排成一排,使得除了最后一个外, ...

  9. 《Java程序设计》第8周学习总结

    学号20145220 <Java程序设计>第8周学习总结 教材学习内容总结 15.1.1日志API简介 java.util.logging包提供了日志功能相关类与接口,不必额外配置日志组件 ...

  10. html4.0.1,h5,xhml,文档声明区别

    <!DOCTYPE> 声明不是 HTML 标签:它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令. 提示:请始终向 HTML 文档添加 <!DOCTYPE> ...