[the c programming language]-3章:控制流

来源:互联网 发布:材料仿真实验室软件 编辑:程序博客网 时间:2024/06/04 23:23

程序语言中的控制流语句用于控制各计算机操作执行的次序。

/*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;dos[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;dos[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;dos[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;}}


0 0