C语言每日一题之No.9
再做决定之前,我还是做好自己该做的。我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦。尊敬的女王陛下,请接题:
一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规则插到字符串a中,最后输出”abdefghjkmnptwy”。
二.思路:既然是已经排好序的,就用二分法查找的思想
将字符串s中的每个字符依次作为key拿来和字符串a做比较并且插入
三.程序
#include <stdio.h>
#include <string.h> #define SIZE 50 void InsertStr(char *s,char *a,int low,int high)
{
int mid = ; while(*a)
{
mid = (low+high)/; //当mid位置字符<*a<mid+1位置字符或者mid位置字符等于*a时
if((s[mid]<*a) && (s[mid+]>*a) || s[mid]==*a)
{
for(int j=mid+;*(s+j);j++)
{
s[j] = *a;//把*a插入到字符串s中mid+1的位置
s[j+]=s[j+];//并且字符串s从mid+2开始的位置全部往后挪一个位置
high = high +;//若每插入一个*a字符,则右区间要加1
}
}
else if(s[mid] >*a)
{ //若mid位置对应的字符大于*a,则右区间变为mid
high = mid;
InsertStr(s,a,low,high);
}
else if(s[mid] <*a)
{ //若mid位置对应的字符小于*a,则左区间变为mid
low = mid;
InsertStr(s,a,low,high); } a++;
} } int main(void)
{
char s[SIZE]={};
char a[SIZE]={}; printf("Please input the s string:\n");
scanf("%s",s);
printf("Please input the a string:\n");
scanf("%s",a); InsertStr(s,a,,strlen(s));
printf("%s",s); return ; }
三.编译运行
程序出错
四.分析问题
1.在插入字符串那个if条件语句里,犯了一个错误:往后面挪的时候,前面的已经把后面的覆盖了,比如a[6]=a[5],然后a[7]=a[6],看到没,这个时候a[6]已经被a[5]覆盖了,它再往后挪都不是自己原来的值了,所以要从最后面开始挪,这样才不会被覆盖。
2.*a可以肯定的是插在s[mid+1]的位置,所以直接s[mid+1]=*a;//把*a插入到字符串s中mid+1的位置就可以了,不然s[mid+1]的值会被*a覆盖
3.每插入一个字符都需要重新获取high
五.程序
#include <stdio.h>
#include <string.h> #define SIZE 50 void InsertStr(char *s,char *a,int low,int high)
{
int mid = ; while(*a)
{ mid = (low+high)/; //当mid位置字符<*a<mid+1位置字符或者mid位置字符等于*a时
if((s[mid]<*a) && (s[mid+]>*a) || s[mid]==*a)
{
for(int j=strlen(s)-;j>=mid+;j--)
{
s[j+]=s[j];//并且字符串s从mid+2开始的位置全部往后挪一个位置
}
s[mid+]=*a;//把*a插入到字符串s中mid+1的位置 }
else if(s[mid] >*a)
{ //若mid位置对应的字符大于*a,则右区间变为mid
high = mid;
InsertStr(s,a,low,high);
}
else if(s[mid] <*a)
{ //若mid位置对应的字符小于*a,则左区间变为mid
low = mid;
InsertStr(s,a,low,high); } a++;
high =strlen(s);//每个字符串a都要重新获取s字符串的长度
} } int main(void)
{
char s[SIZE]={};
char a[SIZE]={}; printf("Please input the s string:\n");
scanf("%s",s);
printf("Please input the a string:\n");
scanf("%s",a); InsertStr(s,a,,strlen(s));
printf("%s",s); return ; }
还是无法跳出InsertStr()函数,突然记起来要在函数末尾加一个return
a++;
high =strlen(s);//每个字符串a都要重新获取s字符串的长度
} return;
}
真的可以跳出来了,但是却还是有问题,现在这样的运行结果是
六.到底哪里出了问题呢?
七.给出网上的解答版本
#include<stdio.h>
#include<string.h>
void main()
{
char a[]="bdfhjmptwy"; //升序
char s[ ]="ganke";
char *p1=a,*p2=s,*p=NULL;
while(*p2)
{
while(*p1)
{
if(*p2>*p1) p1++;
else break;//要有出口!!!!
}
p=p1;//保存指针的位置!!!
while(*p1) p1++;
while(p1!=p)
{
*(p1+)=*p1;
p1--;
}
*(p1+)=*p1;
*p=*p2;
p2++;
p1=a;//指针复原很重要!!!!
}
puts(a);
}
八.对比
那,鉴于你有这样的毅力,明天犒劳你一个又红又脆的苹果+一盒特仑苏纯牛奶哇~
C语言每日一题之No.9的更多相关文章
- C语言每日一题之No.1
鉴于在学校弱弱的接触过C,基本上很少编程,C语言基础太薄弱.刚好目前从事的是软件编程,难度可想而知.严重影响工作效率,已无法再拖下去了.为此,痛下决心恶补C语言.此前只停留在看书,光看好像也记不住,C ...
- C语言每日一题之No.8
正式面对自己第二天,突然一种强烈的要放弃的冲动,在害怕什么?害怕很难赶上步伐?害怕这样坚持到底是对还是错?估计是今天那个来了,所以身体激素有变化导致情绪起伏比较大比较神经质吧(☆_☆)~矮油,女人每个 ...
- C语言每日一题之No.4
这几天老大也没安排我什么项目,于是想正好趁着空补C.当然,是利用晚上加班时间,白天正常上班时间还是学习公司的平台. 今儿个突然弱弱的感觉到在公司补C是件很低级的事情,哪怕是在加班时间都会被喷,因为大家 ...
- C语言每日一题之No.3
几天下来,感慨学习要坚持下来真的是件很难的事,本来说了每天一题,可是毕竟这是个细活,需要用心雕琢,有时候真的不能当天拿下来>_<.虽然说只是一题,却涉及到很多小细节,慢慢的琢磨直至完全摸透 ...
- C语言每日一题之No.12
文件操作知识:如何将一个文件的内容读取到另一个文件里? fread函数和fwrite函数 1.函数功能 用来读写一个数据块. 2.一般调用形式 fread(buffer,count,siz ...
- C语言每日一题之No.7
今天是正式第一天在现有的世界里与自己相处,你再也没有另一个世界可以躲避了.终于要自己面对自己了,一个人要真实的面对自己的灵魂总是痛苦的.从学校到社会的环境转换,现实与理想的冲突,个人价值观和社会价值观 ...
- C语言每日一题之No.6
人总要战胜内心的懦弱的,我不能一直这么缩在里边.终究向自己发出了挑战,还是会伤心的时候,发愣的时候.如果可以,我也希望像盗梦空间的女主一直沉在两个人的梦里永远不要醒来.可是,我们谁又能抗拒时间呢?这雨 ...
- C语言每日一题之No.5
总在想,但凡编程基础正常点,都不至于惨败到这个地步.也像大多数人毕业出来,新鲜的第一份工作,如果做得好还可以略有成就感,做得一般还有提升的空间,但至少不至于像我这样基本没基础的被鄙视得一塌糊涂,被外界 ...
- C语言每日一题之No.2
题目:已知三个整型数8,12,6,按公式s=a+b*c计算,并显示结果 思路:定义三个整型变量a,b,c 定义一个变量s用来保存运算结果 输出 程序: #include <stdio.h> ...
随机推荐
- 无法远程访问虚拟机中的EM (Oracle Enterprise Manager)
今天安装EM,因为文件系统采用ASM来控制,后面需要输入一些ASM相关的信息.这个ASMSNMP用户是新建,所以设个密码自己记下就行. Enter the following information: ...
- UI学习笔记---第一天
一.iOS概述 iOS是Apple公司的移动操作系统,主要⽤用于iPhone.iPad.iPad Mini.iPod Touch等移动产品. 借助iOS,我们可以开发视频类.美图类.新闻类.⾳乐类.团 ...
- iOS学习笔记---c语言第六天
函数 function 命名规范:工程名第一个字母大写,变量函数名小写,不要用拼音和中文, eg:lessonFunction 一.函数声明定义 函数是具有特定功能的代码块 作用:模块 ...
- 147. Insertion Sort List
Sort a linked list using insertion sort. 代码如下: /** * Definition for singly-linked list. * public cla ...
- 获取验证码,60秒倒计时js
<input type="button" id="btn" value="免费获取验证码" /><script type= ...
- php5.2.6+apache2.2.15配置
首先下载软件,忘记php下载地址了,apache是官网. 文件名 httpd-2.2.15-win32-x86-openssl-0.9.8m-r2.msi php-5.2.6-win32-instal ...
- leetcode 149. Max Points on a Line --------- java
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...
- hiho一下115周 网络流
小Hi和小Ho住在P市,P市是一个很大很大的城市,所以也面临着一个大城市都会遇到的问题:交通拥挤. 小Ho:每到周末回家感觉堵车都是一种煎熬啊. 小Hi:平时交通也还好,只是一到上下班的高峰期就会比较 ...
- 【JZOI2002】【BZOJ1477】【P1371】青蛙的约会
看lzx的模板才写出来的,我之前的思路好想错了 chad_orz 原题: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝着对方 ...
- 关于VC、MFC和ACCESS的一些使用问题
最近在用VC.MFC和ACCESS开发一些小工具. 由于操作系统和开发工具以及数据库版本都升级了,和当年有一些区别了(我这是有多老了--fuck--),遇到一些问题,贴在下面: 1,用什么连接AC ...