程序语言中的控制流语句用于控制各计算机操作执行的次序。
/*
3-1.在上面有关折半查找的例子中,while循环语句内共执行了两次测试,其实只要一次就足够。
*/
#include <stdio.h>
int binsearch(int ,int [],int);
int binsearch_test(int ,int [],int);
int main(){
int v[10]={0,1,2,3,4,5,6,7,8,9};
printf("12->v[%d]\n",binsearch(12,v,10));
printf("5->v[%d]\n",binsearch(5,v,10));
printf("....\n12->v[%d]\n",binsearch_test(12,v,10));
printf("7->v[%d]\n",binsearch_test(7,v,10));
return 0;
}
int binsearch(int x,int v[],int n){
int low,high,mid;
low=0;
high=n-1;
while(low<=high){
mid=(low+high)/2;
if(x<v[mid])
high=mid-1;
else if(x>v[mid])
low=mid+1;
else
return mid;
}
return -1;
}
int binsearch_test(int x,int v[],int n){
int low,high,mid;
low=0,high=n-1,mid=(low+high)/2;
while(low<=high && x!=v[mid]){
if(x < v[mid])
high = mid - 1;
else low = mid + 1;
mid = (low+high)/2;
}
if(x==v[mid])
return mid;
else
return -1;
}
/*
3-2.编写一个函数escape(s,t),将字符串t复制到字符串s中,并在复制过程中将换行符、制表符等不可见字符
分别转换为\n \t等相应的可见的转义字符序列。要求使用switch语句。再编写一个具有相反功能的函数,在复制过程中将转移字符序列转换为实际字符。
*/
#include <stdio.h>
void escape(char [],char * ) ;
void unescape(char [],char * ) ;
int main(){
const int n = 128;
char s[n],t[n],w[n];
int i,c;
for(i=0; i<n-1 && (c=getchar())!=EOF;++i )
t[i]=c;
t[i]='\0';
printf("t= \"%s\"\n",t);
escape(s,t);
printf("s= \"%s\"\n",s);
unescape(w,s);
printf("w= \"%s\"\n",w);
return 0;
}
void escape(char s[],char t[]){
int i,j;
for(i=j=0;t[i] != '\0';++i){
switch(t[i]){
case '\n':
s[j++] = '\\';
s[j++] = 'n';break;
case '\t':
s[j++] = '\\';
s[j++] = 't';break;
default:
s[j++] = t[i];
break;
}
}
s[j]='\0';
}
void unescape(char w[],char *t ) {
int i,j;
for(i=j=0; t[i]!='\0';++i)
switch(t[i]){
case '\\':
switch(t[++i]){
case 'n':
w[j++]='\n';break;
case 't':
w[j++]='\t';break;
default:
w[j++] = '\\';
w[j++] = t[i];
break;
}
break;
default:
w[j++] = t[i];
break;
}
w[j]='\0';
}
/*
3-3.编写函数expand(s1,s2),将字符串s1中类似于a-z一类的速记符号在字符串s2中扩展为等价的完整列表abc...xyz。
该函数可以处理大小写字母和数字,并可以处理a-b-c、a-z0-9与a-z等类似的情况。作为前导和尾随的字符原样复制。
*/
void expand(char [],char []) ;
#include <stdio.h>
int main(){
const int n=256;
char s1[n],s2[n];
int i,c;
for(i=0; i<n-1 && (c=getchar())!=EOF;++i)
s1[i] = c;
s1[i] = '\0';
expand(s1,s2);
printf("\n\ns1= \"%s\"\n",s1);
printf("s2=\"%s\"",s2);
return 0;
}
void expand(char s1[],char s2[]){ //by Axel schreiner 好赞。
char c;
int i=0,j=0;
while((c=s1[i++]) != '\0')
if(s1[i] == '-' && s1[i+1]>=c){
i++;
while(c < s1[i])
s2[j++] = c++;
}
else
s2[j++] = c;
s2[j] = '\0';
}
/*
3-4.在数的对二的补码表示中,我们编写的itoa函数不能处理最大的负数,即n等于-(2^(字长-1))的情况。修改该函数,使它能在任何机器上运行时都能打印出正确的值。
原因是会有溢出情况。比如我机器min_int=-2147483648 , max_int = 2147483647.所以当i=-2147483648原itoa函数中n=-n;这句就error了。
*/
#include <stdio.h>
#include <string.h>
#define abs(x) ((x)<0 ? -(x):(x))
void itoa(int ,char []);
void reverse(char []);
int main(){
char s[128];
int i;
scanf("%d",&i);
itoa(i,s);
printf("%s\n",s);
return 0;
}
/* 原itoa,处理不了最大负数
void itoa(int n,char s[]){
int i,sign;
if((sign=n) < 0)
n=-n;
i=0;
do
s[i++] = n%10 + '0';
while((n/=10)>0);
if(sign < 0)
s[i++]='-';
s[i]='\0';
reverse(s);
}
*/
void itoa(int n,char s[]) {
int i,sign;
sign = n;
i=0;
do
s[i++] = abs(n%10) + '0';
while((n/=10)!=0);
if(sign < 0)
s[i++] = '-';
s[i]='\0';
reverse(s);
}
void reverse(char s[]){
int c,i,j;
for(i=0,j=strlen(s)-1;i<j;++i,--j){
c = s[i];
s[i]=s[j];
s[j]=c;
}
}
/*
3-5.编写函数itob(n,s,b),将整数n转换为以b为底的数。并将转换结果以字符的形式保存到字符串中。
例如,itob(n,s,16)把整数n格式化成十六进制整数保存在s中。
*/
#include <stdio.h>
#include <string.h>
void itob(int ,char [],int );
void reverse(char []);
int main(){
char s[128];
int n,b;
scanf("%d %d",&n,&b);
itob(n,s,b);
printf("%s\n",s);
return 0;
}
void itob(int n,char s[],int b){
int i,j,sign;
if((sign=n)<0)
n=-n;
i=0;
do{
j=n%b;
s[i++] = (j<=9) ? j+'0' : j+'a'-10;
}while((n/=b) > 0);
if(sign < 0)
s[i++] = '-';
s[i]='\0';
reverse(s);
}
void reverse(char s[]){
int c,i,j;
for(i=0,j=strlen(s)-1;i<j;++i,--j){
c = s[i];
s[i]=s[j];
s[j]=c;
}
}
/*
3-6.修改itoa函数,使得该函数可以接收三个参数,其中,第三个参数为最小字段宽度。为了保证转换后所得的结果至少具有第三个参数指定的最小宽度,在必要时应在所得结果的左边填充一定的空格。
*/
#include <stdio.h>
#include <string.h>
#define abs(x) ((x)<0 ? -(x):(x))
void itoa(int ,char [],int);
void reverse(char []);
int main(){
char s[128];
int i,w;
scanf("%d %d",&i,&w);
itoa(i,s,w);
printf("%s\n",s);
return 0;
}
void itoa(int n,char s[],int w) {
int i,sign;
sign = n;
i=0;
do
s[i++] = abs(n%10) + '0';
while((n/=10)!=0);
if(sign < 0)
s[i++] = '-';
while(i<w){
s[i++] = ' ';
}
s[i]='\0';
reverse(s);
}
void reverse(char s[]){
int c,i,j;
for(i=0,j=strlen(s)-1;i<j;++i,--j){
c = s[i];
s[i]=s[j];
s[j]=c;
}
}