第8章字符串

合集下载

第8章 编译预处理-C语言程序设计-王晓峰-清华大学出版社

第8章   编译预处理-C语言程序设计-王晓峰-清华大学出版社
SSSV(sa,sb,sc,vv); printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv); return 0; }
【例8. 7】 带参宏定义的实参是表达式的情况。
【程序】 #include <stdio.h> #define SQ(y) (y)*(y) int main() { int a,sq; printf("input a number: ");
④90。表达式3*F( 3+2)被替换为3*(( 3+2)*( 3+2)+( 3+2))。
【例8. 6】 一个宏定义代表多个语句。
【程序】 #include <stdio.h> #define SSSV(s1,s2,s3,v) s1=l*w; s2=l*h; s3=w*h; v=w*l*h; int main() { int l=3,w=4,h=5,sa,sb,sc,vv;
printf("PI is %9.7f.\n",PI); return 0;
}
【运行】 PI is 3.1415926
【例8. 3】 用无参宏定义表示常用的数据类型和输出格式。
【程序】 #include <stdio.h> #define INTEGER int #define REAL float #define P printf #define D "%d\n“ #define F "%f\n" int main() { INTEGER a=5, c=8, e=11;
REAL b=3.8, d=9.7, f=21.08; P(D F,a,b); P(D F,c,d); P(D F,e,f); return 0; }

c语言-C程序设计(第四版)谭浩强_课后习题答案第8章

c语言-C程序设计(第四版)谭浩强_课后习题答案第8章

C程序设计(第四版)谭浩强_课后习题答案第8章第8章善于利用指针2208.1指针是什么2208.2指针变量2228.2.1使用指针变量的例子2228.2.2怎样定义指针变量2238.2.3怎样引用指针变量2248.2.4指针变量作为函数参数2268.3通过指针引用数组2308.3.1数组元素的指针2308.3.2在引用数组元素时指针的运算2318.3.3通过指针引用数组元素2338.3.4用数组名作函数参数2378.3.5通过指针引用多维数组2458.4通过指针引用字符串2558.4.1字符串的引用方式2558.4.2字符指针作函数参数2598.4.3使用字符指针变量和字符数组的比较2638.5指向函数的指针2668.5.1什么是函数指针2668.5.2用函数指针变量调用函数2668.5.3怎样定义和使用指向函数的指针变量2688.5.4用指向函数的指针作函数参数2708.6返回指针值的函数2748.7指针数组和多重指针2778.7.1什么是指针数组2778.7.2指向指针数据的指针2808.7.3指针数组作main函数的形参2828.8动态内存分配与指向它的指针变量2858.8.1什么是内存的动态分配2858.8.2怎样建立内存的动态分配2858.8.3void指针类型2878.9有关指针的小结288习题2918-1#include <stdio.h>int main(){ void swap(int *p1,int *p2);int n1,n2,n3;int *p1,*p2,*p3;printf("input three integer n1,n2,n3:");scanf("%d,%d,%d",&n1,&n2,&n3);p1=&n1;p2=&n2;p3=&n3;if(n1>n2) swap(p1,p2);if(n1>n3) swap(p1,p3);if(n2>n3) swap(p2,p3);printf("Now,the order is:%d,%d,%d\n",n1,n2,n3); return 0;}void swap(int *p1,int *p2){int p;p=*p1; *p1=*p2; *p2=p;}#include <stdio.h>#include <string.h>int main(){void swap(char *,char *);char str1[20],str2[20],str3[20];printf("input three line:\n");gets(str1);gets(str2);gets(str3);if(strcmp(str1,str2)>0) swap(str1,str2);if(strcmp(str1,str3)>0) swap(str1,str3);if(strcmp(str2,str3)>0) swap(str2,str3);printf("Now,the order is:\n");printf("%s\n%s\n%s\n",str1,str2,str3);return 0;}void swap(char *p1,char *p2){char p[20];strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);}8-3#include <stdio.h>int main(){ void input(int *);void max_min_value(int *);void output(int *);int number[10];input(number);max_min_value(number);output(number);return 0;}void input(int *number){int i;printf("input 10 numbers:");for (i=0;i<10;i++)scanf("%d",&number[i]);}void max_min_value(int *number){ int *max,*min,*p,temp;max=min=number;for (p=number+1;p<number+10;p++)if (*p>*max) max=p;else if (*p<*min) min=p;temp=number[0];number[0]=*min;*min=temp;if(max==number) max=min;temp=number[9];number[9]=*max;*max=temp; }void output(int *number){int *p;printf("Now,they are: ");for (p=number;p<number+10;p++)printf("%d ",*p);printf("\n");}8-4#include <stdio.h>int main(){void move(int [20],int,int);int number[20],n,m,i;printf("how many numbers?");scanf("%d",&n);printf("input %d numbers:\n",n);for (i=0;i<n;i++)scanf("%d",&number[i]);printf("how many place you want move?"); scanf("%d",&m);move(number,n,m);printf("Now,they are:\n");for (i=0;i<n;i++)printf("%d ",number[i]);printf("\n");return 0;}void move(int array[20],int n,int m){int *p,array_end;array_end=*(array+n-1);for (p=array+n-1;p>array;p--)*p=*(p-1);*array=array_end;m--;if (m>0) move(array,n,m);}8-5#include <stdio.h>int main(){int i,k,m,n,num[50],*p;printf("\ninput number of person: n="); scanf("%d",&n);p=num;for (i=0;i<n;i++)*(p+i)=i+1;i=0;k=0;m=0;while (m<n-1){if (*(p+i)!=0) k++;if (k==3){*(p+i)=0;k=0;m++;}i++;if (i==n) i=0;}while(*p==0) p++;printf("The last one is NO.%d\n",*p); return 0;}8-6#include <stdio.h>int main(){int length(char *p);int len;char str[20];printf("input string: ");scanf("%s",str);len=length(str);printf("The length of string is %d.\n",len); return 0;}int length(char *p){int n;n=0;while (*p!='\0'){n++;p++;}return(n);}8-7#include <stdio.h>#include <string.h>int main(){void copystr(char *,char *,int);int m;char str1[20],str2[20];printf("input string:");gets(str1);printf("which character that begin to copy?"); scanf("%d",&m);if (strlen(str1)<m)printf("input error!");else{copystr(str1,str2,m);printf("result:%s\n",str2);}return 0;}void copystr(char *p1,char *p2,int m){int n;n=0;while (n<m-1){n++;p1++;}while (*p1!='\0'){*p2=*p1;p1++;p2++;}*p2='\0';}8-8#include <stdio.h>int main(){int upper=0,lower=0,digit=0,space=0,other=0,i=0; char *p,s[20];printf("input string: ");while ((s[i]=getchar())!='\n') i++;p=&s[0];while (*p!='\n'){if (('A'<=*p) && (*p<='Z'))++upper;else if (('a'<=*p) && (*p<='z'))++lower;else if (*p==' ')++space;else if ((*p<='9') && (*p>='0'))++digit;else++other;p++;}printf("upper case:%d lower case:%d",upper,lower);printf(" space:%d digit:%d other:%d\n",space,digit,other); return 0;}8-9#include <stdio.h>int main(){void move(int *pointer);int a[3][3],*p,i;printf("input matrix:\n");for (i=0;i<3;i++)scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);p=&a[0][0];move(p);printf("Now,matrix:\n");for (i=0;i<3;i++)printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);return 0;}void move(int *pointer){int i,j,t;for (i=0;i<3;i++)for (j=i;j<3;j++){t=*(pointer+3*i+j);*(pointer+3*i+j)=*(pointer+3*j+i);*(pointer+3*j+i)=t;}}8-10-1#include <stdio.h>int main(){void change(int *p);int a[5][5],*p,i,j;printf("input matrix:\n");for (i=0;i<5;i++)for (j=0;j<5;j++)scanf("%d",&a[i][j]);p=&a[0][0];change(p);printf("Now,matrix:\n");for (i=0;i<5;i++){for (j=0;j<5;j++)printf("%d ",a[i][j]);printf("\n");}return 0;}void change(int *p){int i,j,temp;int *pmax,*pmin;pmax=p;pmin=p;for (i=0;i<5;i++)for (j=i;j<5;j++){if (*pmax<*(p+5*i+j)) pmax=p+5*i+j;if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*(p+12);*(p+12)=*pmax;*pmax=temp;temp=*p;*p=*pmin;*pmin=temp;pmin=p+1;for (i=0;i<5;i++)for (j=0;j<5;j++)if (((p+5*i+j)!=p) && (*pmin>*(p+5*i+j))) pmin=p+5*i+j;temp=*pmin;*pmin=*(p+4);*(p+4)=temp;pmin=p+1;for (i=0;i<5;i++)for (j=0;j<5;j++)if (((p+5*i+j)!=(p+4))&&((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))pmin=p+5*i+j;temp=*pmin;*pmin=*(p+20);*(p+20)=temp;pmin=p+1;for (i=0;i<5;i++)for (j=0;j<5;j++)if (((p+5*i+j)!=p) && ((p+5*i+j)!=(p+4)) && ((p+5*i+j)!=(p+20)) && (*pmin>*(p+5*i+j)))pmin=p+5*i+j;temp=*pmin;*pmin=*(p+24);*(p+24)=temp;}8-10-2#include <stdio.h>int main(){void change(int *p);int a[5][5],*p,i,j;printf("input matrix:\n");for (i=0;i<5;i++)for (j=0;j<5;j++)scanf("%d",&a[i][j]);p=&a[0][0];change(p);printf("Now,matrix:\n");for (i=0;i<5;i++){for (j=0;j<5;j++)printf("%d ",a[i][j]);printf("\n");}return 0;}void change(int *p) //交换函数{int i,j,temp;int *pmax,*pmin;pmax=p;pmin=p;for (i=0;i<5;i++) //找最大值和最小值的地址,并赋给pmax,pmin for (j=i;j<5;j++){if (*pmax<*(p+5*i+j)) pmax=p+5*i+j;if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*(p+12); //将最大值与中心元素互换*(p+12)=*pmax;*pmax=temp;temp=*p; //将最小值与左上角元素互换*p=*pmin;*pmin=temp;pmin=p+1;//将a[0][1]的地址赋给pmin,从该位置开始找最小的元素for (i=0;i<5;i++) //找第二最小值的地址赋给pminfor (j=0;j<5;j++){if(i==0 && j==0) continue;if (*pmin > *(p+5*i+j)) pmin=p+5*i+j;}temp=*pmin; //将第二最小值与右上角元素互换*pmin=*(p+4);*(p+4)=temp;pmin=p+1;for (i=0;i<5;i++) //找第三最小值的地址赋给pminfor (j=0;j<5;j++){if((i==0 && j==0) ||(i==0 && j==4)) continue;if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*pmin; // 将第三最小值与左下角元素互换*pmin=*(p+20);*(p+20)=temp;pmin=p+1;for (i=0;i<5;i++) // 找第四最小值的地址赋给pminfor (j=0;j<5;j++){if ((i==0 && j==0) ||(i==0 && j==4)||(i==4 && j==0)) continue;if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;}temp=*pmin; //将第四最小值与右下角元素互换*pmin=*(p+24);*(p+24)=temp;}8-11-1#include <stdio.h>#include <string.h>int main(){void sort(char s[][6]);int i;char str[10][6];printf("input 10 strings:\n");for (i=0;i<10;i++)scanf("%s",str[i]);sort(str);printf("Now,the sequence is:\n"); for (i=0;i<10;i++)printf("%s\n",str[i]);return 0;}void sort(char s[10][6]){int i,j;char *p,temp[10];p=temp;for (i=0;i<9;i++)for (j=0;j<9-i;j++)if (strcmp(s[j],s[j+1])>0){strcpy(p,s[j]);strcpy(s[j],s[+j+1]);strcpy(s[j+1],p);}}8-11-2#include <stdio.h>#include <string.h>int main(){void sort(char (*p)[6]);int i;char str[10][6];char (*p)[6];printf("input 10 strings:\n");for (i=0;i<10;i++)scanf("%s",str[i]);p=str;sort(p);printf("Now,the sequence is:\n"); for (i=0;i<10;i++)printf("%s\n",str[i]);return 0;}void sort(char (*s)[6]){int i,j;char temp[6],*t=temp;for (i=0;i<9;i++)for (j=0;j<9-i;j++)if (strcmp(s[j],s[j+1])>0){strcpy(t,s[j]);strcpy(s[j],s[+j+1]);strcpy(s[j+1],t);}}8-12#include <stdio.h>#include <string.h>int main(){void sort(char *[]);int i;char *p[10],str[10][20];for (i=0;i<10;i++)p[i]=str[i];printf("input 10 strings:\n");for (i=0;i<10;i++)scanf("%s",p[i]);sort(p);printf("Now,the sequence is:\n"); for (i=0;i<10;i++)printf("%s\n",p[i]);return 0;}void sort(char *s[]){int i,j;char *temp;for (i=0;i<9;i++)for (j=0;j<9-i;j++)if (strcmp(*(s+j),*(s+j+1))>0){temp=*(s+j);*(s+j)=*(s+j+1);*(s+j+1)=temp;}}8-13#include<stdio.h>#include<math.h>int main(){float integral(float(*)(float),float,float,int);//对integarl函数的声明float fsin(float); //对fsin函数的声明float fcos(float); //对fcos函数的声明float fexp(float); //对fexp函数的声明float a1,b1,a2,b2,a3,b3,c,(*p)(float);int n=20;printf("input a1,b1:");scanf("%f,%f",&a1,&b1);printf("input a2,b2:");scanf("%f,%f",&a2,&b2);printf("input a3,b3:");scanf("%f,%f",&a3,&b3);p=fsin;c=integral(p,a1,b1,n);printf("The integral of sin(x) is:%f\n",c);p=fcos;c=integral(p,a2,b2,n);printf("The integral of cos(x) is:%f\n",c);p=fexp;c=integral(p,a3,b3,n);printf("The integral of exp(x) is:%f\n",c);return 0;}float integral(float(*p)(float),float a,float b,int n){int i;float x,h,s;h=(b-a)/n;x=a;s=0;for(i=1;i<=n;i++){x=x+h;s=s+(*p)(x)*h;}return(s);}float fsin(float x){return sin(x);}float fcos(float x){return cos(x);}float fexp(float x){return exp(x);}8-14#include <stdio.h>int main(){void sort (char *p,int m);int i,n;char *p,num[20];printf("input n:");scanf("%d",&n);printf("please input these numbers:\n");for (i=0;i<n;i++)scanf("%d",&num[i]);p=&num[0];sort(p,n);printf("Now,the sequence is:\n");for (i=0;i<n;i++)printf("%d ",num[i]);printf("\n");return 0;}void sort (char *p,int m) // 将n个数逆序排列函数{int i;char temp, *p1,*p2;for (i=0;i<m/2;i++){p1=p+i;p2=p+(m-1-i);temp=*p1;*p1=*p2;*p2=temp;}}8-15#include <stdio.h>int main(){void avsco(float *,float *);void avcour1(char (*)[10],float *);void fali2(char course[5][10],int num[],float *pscore,float aver[4]); void good(char course[5][10],int num[4],float *pscore,float aver[4]); int i,j,*pnum,num[4];float score[4][5],aver[4],*pscore,*paver;char course[5][10],(*pcourse)[10];printf("input course:\n");pcourse=course;for (i=0;i<5;i++)scanf("%s",course[i]);printf("input NO. and scores:\n");printf("NO.");for (i=0;i<5;i++)printf(",%s",course[i]);printf("\n");pscore=&score[0][0];pnum=&num[0];for (i=0;i<4;i++){scanf("%d",pnum+i);for (j=0;j<5;j++)scanf("%f",pscore+5*i+j);}paver=&aver[0];printf("\n\n");avsco(pscore,paver); // 求出每个学生的平均成绩avcour1(pcourse,pscore); // 求出第一门课的平均成绩printf("\n\n");fali2(pcourse,pnum,pscore,paver); // 找出2门课不及格的学生printf("\n\n");good(pcourse,pnum,pscore,paver); // 找出成绩好的学生return 0;}void avsco(float *pscore,float *paver) // 求每个学生的平均成绩的函数{int i,j;float sum,average;for (i=0;i<4;i++){sum=0.0;for (j=0;j<5;j++)sum=sum+(*(pscore+5*i+j)); //累计每个学生的各科成绩average=sum/5; //计算平均成绩*(paver+i)=average;}}void avcour1(char (*pcourse)[10],float *pscore) // 求第一课程的平均成绩的函数{int i;float sum,average1;sum=0.0;for (i=0;i<4;i++)sum=sum+(*(pscore+5*i)); //累计每个学生的得分average1=sum/4; //计算平均成绩printf("course 1:%s average score:%7.2f\n",*pcourse,average1);}void fali2(char course[5][10],int num[],float *pscore,float aver[4])// 找两门以上课程不及格的学生的函数{int i,j,k,labe1;printf(" ==========Student who is fail in two courses======= \n"); printf("NO. ");for (i=0;i<5;i++)printf("%11s",course[i]);printf(" average\n");for (i=0;i<4;i++){labe1=0;for (j=0;j<5;j++)if (*(pscore+5*i+j)<60.0) labe1++;if (labe1>=2){printf("%d",num[i]);for (k=0;k<5;k++)printf("%11.2f",*(pscore+5*i+k));printf("%11.2f\n",aver[i]);}}}void good(char course[5][10],int num[4],float *pscore,float aver[4]) // 找成绩优秀学生(各门85以上或平均90分以上)的函数{int i,j,k,n;printf(" ======Students whose score is good======\n");printf("NO. ");for (i=0;i<5;i++)printf("%11s",course[i]);printf(" average\n");for (i=0;i<4;i++){n=0;for (j=0;j<5;j++)if (*(pscore+5*i+j)>85.0) n++;if ((n==5)||(aver[i]>=90)){printf("%d",num[i]);for (k=0;k<5;k++)printf("%11.2f",*(pscore+5*i+k));printf("%11.2f\n",aver[i]);}}}8-16#include <stdio.h>int main(){char str[50],*pstr;int i,j,k,m,e10,digit,ndigit,a[10],*pa;printf("input a string:\n");gets(str);pstr=&str[0]; /*字符指针pstr置于数组str 首地址*/pa=&a[0]; /*指针pa置于a数组首地址*/ndigit=0; /*ndigit代表有多少个整数*/i=0; /*代表字符串中的第几个字符*/j=0;while(*(pstr+i)!='\0'){if((*(pstr+i)>='0') && (*(pstr+i)<='9'))j++;else{if (j>0){digit=*(pstr+i-1)-48; /*将个数位赋予digit*/k=1;while (k<j) /*将含有两位以上数的其它位的数值累计于digit*/{e10=1;for (m=1;m<=k;m++)e10=e10*10; /*e10代表该位数所应乘的因子*/digit=digit+(*(pstr+i-1-k)-48)*e10; /*将该位数的数值\累加于digit*/k++; /*位数K自增*/}*pa=digit; /*将数值赋予数组a*/ndigit++;pa++; /*指针pa指向a数组下一元素*/j=0;}}i++;}if (j>0) /*以数字结尾字符串的最后一个数据*/ {digit=*(pstr+i-1)-48; /*将个数位赋予digit*/k=1;while (k<j) /* 将含有两位以上数的其它位的数值累加于digit*/{e10=1;for (m=1;m<=k;m++)e10=e10*10; /*e10代表位数所应乘的因子*/digit=digit+(*(pstr+i-1-k)-48)*e10; /*将该位数的数值累加于digit*/k++; /*位数K自增*/}*pa=digit; /*将数值赋予数组a*/ndigit++;j=0;}printf("There are %d numbers in this line, they are:\n",ndigit);j=0;pa=&a[0];for (j=0;j<ndigit;j++) /*打印数据*/printf("%d ",*(pa+j));printf("\n");return 0;}8-17#include<stdio.h>int main(){int strcmp(char *p1,char *p2);int m;char str1[20],str2[20],*p1,*p2;printf("input two strings:\n");scanf("%s",str1);scanf("%s",str2);p1=&str1[0];p2=&str2[0];m=strcmp(p1,p2);printf("result:%d,\n",m);return 0;}int strcmp(char *p1,char *p2) //两个字符串比较函数{int i;i=0;while(*(p1+i)==*(p2+i))if (*(p1+i++)=='\0') return(0); //相等时返回结果0return(*(p1+i)-*(p2+i)); //不等时返回结果为第一个不等字符ASCII码的差值}8-18#include <stdio.h>int main(){char *month_name[13]={"illegal month","January","February","March","April", "May","June","july","August","September","October", "November","December"};int n;printf("input month:\n");scanf("%d",&n);if ((n<=12) && (n>=1))printf("It is %s.\n",*(month_name+n));elseprintf("It is wrong.\n");return 0;}8-19-1#include <stdio.h>#define NEWSIZE 1000 //指定开辟存区的最大容量char newbuf[NEWSIZE]; //定义字符数组newbufchar *newp=newbuf; //定义指针变量newp,指向可存区的始端char *new(int n) //定义开辟存区的函数new,开辟存储区后返回指针{if (newp+n<=newbuf+NEWSIZE) // 开辟区未超过newbuf数组的大小{newp+=n; // newp指向存储区的末尾return(newp-n); // 返回一个指针,它指向存区的开始位置}elsereturn(NULL); // 当存区不够分配时,返回一个空指针}8-19-2#include <stdio.h>#define NEWSIZE 1000char newbuf[NEWSIZE];char *newp=newbuf;void free(char *p) //释放存区函数{if (p>=newbuf && p< newbuf + NEWSIZE)newp=p;}8-20#define LINEMAX 20 /*定义字符串的最大长度*/int main(){int i;char **p,*pstr[5],str[5][LINEMAX];for (i=0;i<5;i++)pstr[i]=str[i]; /*将第i个字符串的首地址赋予指针数组pstr 的第i个元素*/ printf("input 5 strings:\n");for (i=0;i<5;i++)scanf("%s",pstr[i]);p=pstr;sort(p);printf("strings sorted:\n");for (i=0;i<5;i++)printf("%s\n",pstr[i]);}sort(char **p) /*冒泡法对5个字符串排序函数*/{int i,j;char *temp;for (i=0;i<5;i++){for (j=i+1;j<5;j++){if (strcmp(*(p+i),*(p+j))>0) /*比较后交换字符串地址*/{temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;}}}return 0;}8-21#include<stdio.h>int main(){void sort(int **p,int n);int i,n,data[20],**p,*pstr[20];printf("input n:\n");scanf("%d",&n);for (i=0;i<n;i++)pstr[i]=&data[i]; //将第i个整数的地址赋予指针数组pstr 的第i个元素printf("input %d integer numbers:",n);for (i=0;i<n;i++)scanf("%d",pstr[i]);p=pstr;sort(p,n);printf("Now,the sequence is:\n");for (i=0;i<n;i++)printf("%d ",*pstr[i]);printf("\n");return 0;}void sort(int **p,int n){int i,j,*temp;for (i=0;i<n-1;i++){for (j=i+1;j<n;j++){if (**(p+i)>**(p+j)) //比较后交换整数地址{temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;}}}}。

第8章习题答案

第8章习题答案

4
大学 C 语言程序设计教程
4. 从键盘输入一个字符串, 编写一个函数, 将此字符串中从第 m 个字符开始的 n 个字 符复制成另一个字符串,请编程。 分析:设置两个指针,使得指针一指向数组一的第 m 个元素,再从第 m 个元素开始复 制到第 n 个元素给第二个数组。 程序: #include"stdio.h" #define N 80 void copy_string(char *from, char *to,int k) { int t=0; for (;*from!='\0';from++,to++) { *to=*from; t++; if(t>k) break; } *to='\0'; } void main() { char a[N+1],b[N+1],*p,*q; int m,n; gets(a); scanf("%d",&m,&n); p=a+m­1; q=b; copy_string(p,q); puts(q); } 运行结果: student↙ 3,4↙ uden 5. 输入 8 个整数,将其中最大的数与第一个数对换,最小的数与最后一个数对换。 分析:查找数组中最大值和最小值,用指针记下其位置并调整。 。 程序: #include"stdio.h" #define M 8
第 8 章 指针
3
运行结果: The last number is 4 3. 输入三个整数,按由小到大的顺序输出,请用指针编程实现。 分析:定义三个指向整型变量的指针。 程序: #include "stdio.h" void main() { int a,b,c,*p1,*p2,*p3,*t; scanf("%d,%d,%d",&a,&b,&c); p1=&a; p2=&b; p3=&c; if(*p1>*p2) { t=p1; p1=p2; p2=t; } if(*p1>*p3) { t=p1; p1=p3; p3=t; } if(*p2>*p3) { t=p2; p2=p3; p3=t; } printf("%d,%d,%d\n",*p1,*p2,*p3); } 运行结果: 4,2,5↙ 2,4,5

c语言第8章 编译预处理及位运算习题答案

c语言第8章 编译预处理及位运算习题答案

编译预处理习题一.单项选择题1.在宏定义#define A 3.897678中,宏名A代替一个()。

A)单精度数 B)双精度数 C)常量 D)字符串2.以下叙述中正确的是A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令C)宏名必须用大写字母表示D)宏替换不占用程序的运行时间3.C语言的编译系统对宏命令的处理()。

A)在程序运行时进行的B)在程序连接时进行的C)和C程序中的其它语句同时进行的D)在对源程序中其它语句正式编译之前进行的4.在文件包含预处理语句的中,被包含文件名用“< >”括起时,寻找被包含文件的方式是()。

A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录搜索,再按系统设定的标准方式搜索C)仅仅在源程序所在目录搜索D)仅仅搜索当前目录5.以下说法中正确的是A)#define和printf都是C语句 B)#define是C语句,而printf不是C)printf是C语句,但#define不是D)#define和printf都不是C语句6.#define A 3.897678#include <stdio.h>main( ){ printf(“A=%f ”,A);}程序运行结果为()。

A) 3.897678=3.897678 B) 3.897678=A C) A=3.897678 D)无结果7.有宏定义:#define LI(a,b) a*b#define LJ(a,b) (a)*(b)在后面的程序中有宏引用:x=LI(3+2,5+8);y=LJ(3+2,5+8);则x、y的值是()。

A) x=65,y=65 B) x=21,y=65 C) x=65,y=21 D)x=21,y=218.有以下程序# define f(x) (x*x)main(){ int i1, i2;i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ;printf("%d, %d\n",i1,i2);}程序运行后的输出结果是A)64, 28 B)4, 4 C)4, 3D)64, 649.以下程序的输出结果是#define M(x,y,z) x*y+zmain(){ int a=1,b=2, c=3;printf(“%d\n”, M(a+b,b+c, c+a));}A) 19 B) 17 C) 15 D) 1210.有以下程序#define N 5#define M1 N*3#define M2 N*2main(){ int i;i=M1+M2; printf(“%d\n”,i);}程序编译后运行的输出结果是:A) 10 B) 20 C) 25 D) 3011.有如下程序#define N 2#define M N+1#define NUM 2*M+1#main(){ int i;for(i=1;i<=NUM;i++)printf(“%d\n”,i);}该程序中的for循环执行的次数是A) 5 B) 6C) 7 D) 812.位运算是对运算对象按二进制位进行操作的运算,运算的对象是____数据,以___的形式参与运算。

第八章 字符数据处理

第八章 字符数据处理
第八章字符数据处理 (4 学时) 学时) 排列
8.1 字符与字符串
8.1.1 字符型数据
1.字符常量:由单引号括起的单个字符如: ' 一' , '一', 'G','?。’。 2.转义字符常量:以反斜杆’\’开头的特殊字符序列意思是把反 。 斜杆后面的字符序列转换成特定的含义.而不是原来的含义。 3.字符串常量:用双引号括起来的字符序列其长度没有限制,系统 在末尾自动加上‘\n' 以示结束。。 例如, "Ch5nJr","1 x34" 等。 4.字符变量:存放字符常量的内存变量字符变量用关键字零碎工作 来说明在定义字符变量的同时可进行初始化。。。 5.符号常量:以指定的符号代表其后的“一串字符”用于简化程序 的编写和修改。。 例如:#定义 PAI 13.14 #定义 N 10
2. 整个字符串变量一次输入输出: %s
//字符变量引用
char a[10] , b[7]="abcde" ; scanf(“%s" , a); /*键盘输入的字符串存人a数组*/ printf(“%s=%s” , “a[10]=” , a) ; /*输出常量串和a数组中的字符串*/ printf(“%s” , &b[1]); /*输出字符串:bcde*/ a 数组 存储: b 数组
3. 常用的联合使用 例 1 : putchar(getchar());等同 printf("%c",getchar()); 例 2 :作为字符输入结束的判断条件 (c=getchar())!=‘\ n'; 表示若读入的字符不为“回车” 例:每读入一个字符输出该字符直到输入一个 "回车" 止 回车" 主要部份()。 回车后 { 烧焦 c ; 才读 为 () ; (c=getchar())!=‘\ n'; printf;("%c",c) 一 以下程序执行结果正确的是: (? ) (一)计算机 计算机 (B)CCoommppuutteerr

c语言第8章-编译预处理及位运算习题答案doc资料

c语言第8章-编译预处理及位运算习题答案doc资料

c语言第8章-编译预处理及位运算习题答案编译预处理习题一.单项选择题1.在宏定义#define A 3.897678中,宏名A代替一个()。

A)单精度数 B)双精度数 C)常量 D)字符串2.以下叙述中正确的是A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令C)宏名必须用大写字母表示D)宏替换不占用程序的运行时间3.C语言的编译系统对宏命令的处理()。

A)在程序运行时进行的B)在程序连接时进行的C)和C程序中的其它语句同时进行的D)在对源程序中其它语句正式编译之前进行的4.在文件包含预处理语句的中,被包含文件名用“< >”括起时,寻找被包含文件的方式是()。

A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录搜索,再按系统设定的标准方式搜索C)仅仅在源程序所在目录搜索D)仅仅搜索当前目录5.以下说法中正确的是A)#define和printf都是C语句 B)#define是C语句,而printf不是C)printf是C语句,但#define不是D)#define和printf都不是C 语句6.#define A 3.897678#include <stdio.h>main( ){ printf(“A=%f ”,A);}程序运行结果为()。

A) 3.897678=3.897678 B) 3.897678=A C) A=3.897678 D)无结果7.有宏定义:#define LI(a,b) a*b#define LJ(a,b) (a)*(b)在后面的程序中有宏引用:x=LI(3+2,5+8);y=LJ(3+2,5+8);则x、y的值是()。

A) x=65,y=65 B) x=21,y=65 C) x=65,y=21 D)x=21,y=218.有以下程序# define f(x) (x*x)main(){ int i1, i2;i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ;printf("%d, %d\n",i1,i2);}程序运行后的输出结果是A)64, 28 B)4, 4 C)4, 3D)64, 649.以下程序的输出结果是#define M(x,y,z) x*y+zmain(){ int a=1,b=2, c=3;printf(“%d\n”, M(a+b,b+c, c+a));}A) 19 B) 17 C) 15 D) 1210.有以下程序#define N 5#define M1 N*3#define M2 N*2main(){ int i;i=M1+M2; printf(“%d\n”,i);}程序编译后运行的输出结果是:A) 10 B) 20 C) 25 D) 3011.有如下程序#define N 2#define M N+1#define NUM 2*M+1#main(){ int i;for(i=1;i<=NUM;i++)printf(“%d\n”,i);}该程序中的for循环执行的次数是A) 5 B) 6C) 7 D) 812.位运算是对运算对象按二进制位进行操作的运算,运算的对象是____数据,以___的形式参与运算。

第八章 判断题-字符串

第八章 判断题-字符串

第八章判断题1.用= =比较字符串对象时,如果字符串包含的是同一个值时,结果为true。

()2.字符串在创建后可以被修改。

()3.String类的charAt方法返回字符穿串中字符的个数。

()4.String类的compareTo方法在所比较的字符串相等时返回0。

()5.运算符“==”用于比较引用时,如果两个引用指向内存中同一个对象,则返回true。

()6.StringBuffer类的indexOf方法在字符串中定位某个字符或子串第一次出现的位置。

()7.String类的substring方法拷贝并返回字符串对象的一部分。

()8.String类的replace方法只返回一个新的字符串对象。

()9.String类的valueOf方法由它的参数转换成的字符串。

()10.StringTokenizer类的hasMoreTokens方法确定在字符串中是否还有语言符号返回。

()第八章选择题1.下面语句书写错误的是:A.String s = “Gone with the wind”;String t = “good”;String k = s + t;B.Stri ng s = “Gone with the wind”;String t;t = s[3] + “one”;C.String s = “Gone with the wind”;String standard = s.toUpperCase( );D.String s = “home directory”;String t = s - “directory”;2.请看下面的代码String s = “hello”;String t = “hello”;String c[ ] = {…h‟,‟e‟,‟l‟,‟l‟,‟o‟};下面哪一选项的语句返回值为真:A.s .equals(t);B.t .equals(c);C.s==t;D.t .equals(new String(“hello”));E. t==c;3.请看下面的代码String s = “story”;下面选项语句书写正确的是:A.s += “books”;B.char c = s[1];C.int len = s .length;D.String t = s.toLowerCase( );4.请看下面的代码1.class Example {2. String str;3. public Example( ){4. str = “example”;5. }6. public Example(String s){7. str = s;8. }9..}10.class Demo extends Example {11.}12.public class Test{13. public void f(){14. Example ex = new Example(“good”);15. Demo d = new Demo(“Good”);16. }17.}那一行将导致发生错误:A.3B.6C.10D.14E.155.请看下面的代码public class Example{String str = new String(“hello”);Char ch[ ]={…d‟,‟b‟,‟c‟};public static void main(String args[ ]){Example ex=new Example( );ex.change(ex.str,ex.ch);System .out .println(ex.str +“and”+ex.ch);}public void change(String str,char ch[ ]){str=”world”;ch[0]=‟a‟;}}该程序的输出结果是:A.hello dbcB.hello abcC.world dbcD.world abc6.下面选项正确创建一个字符型数组(含有4个元素)的是:A.String a[ ] = new String[4];for(int i=0;i<4;a[i++]=””);B.String a[ ]={“”,””,””,””};C.String a[4];D.String [4]a;E. String [ ]a = new String[4];For(int i=0;i<4;a[i++]=null);7.下面选项正确的是:A.String temp[ ]= new String{“j””a””z”}; B.String temp[ ]= {“j””a””z”};C.String temp= {“j”,”a”,”z”};D.String tem p[ ]= {“j”,”a”,”z”};8.请看下面的代码1.StringBuffer sb = new StringBuffer(“abc”);2.String s = new String(“abc”);3.sb.append(“def”);4.s.append(“def”);5.sb.inser(1,”zzzz”);6.s.concat(sb);7.s.trim( );下面说法正确的是:A.编译时在第一行发生一个错误B.编译时在第二行发生一个错误C.编译时在第三行发生一个错误D.编译时在第四行发生一个错误E. 编译时在第五行发生一个错误F. 编译时在第六行发生一个错误G. 编译时在第七行发生一个错误9.请看下面的代码String s1=new String(“hello”);String s2=new String(“there”);String s3=new String( );下面选项中语句正确的是:A.s3=s1+s2;B.s3=s1-s2;C.s3=s1&s2;D.s3=s1&&s2;10.请看下面的代码public class StrEq{public static void main(String argv[ ]){ StrEq s = new StrEq( );}private StrEq( ){String s = “Marcus”;String s2 = new String(“Marcus”);If(s == s2){System .out .println(“we have a match”);}else{System .out .pritln(“Not equal”);}}}下面说法正确的是:A.由于使用“private StrEq”编译时会出现错误B.输出“we have a match”C.输出“Not equal”D.由于使用“==”操作符导致编译时出现错误第八章程序设计题1.编写Applet程序,接受用户输入的一个字符串和一个字符,把字符串中所有指定的字符删除后输出。

第8章 编译预处理

第8章 编译预处理

11
第8章 编译预处理
8.2 文件包含@include
12
所谓“文件包含”处理是指一个源文件可以将另外一个源 文件的全部内容包含进来,即将另外的文件包含到本文件之 中。C语言提供了#include命令用来实现“文件包含”的 操作。一般形式为: #include “文件名” 或 #include <文件名> 在程序设计中,文件包含是很有用的。有些公用的符号常 量或宏定义等可单独组成一个文件,在其他文件的开头用 包含命令包含该文件即可使用。这样,可避免在每个文件 开头都去书写那些公用量,这样可以节省时间、减少出错。 对于C系统提供的标准库函数,也可以通过文件包含使之 包含到当前的程序里,从而实现库函数的调用。例如在前 面章节中已经用到的文件包含处理:
宏定义#define
2. 带参有宏定义
在以上例子中,要注意如下问题: (1)带参宏定义中,宏名和形参表之间不能随 便加入空格;否则将空格以后的字符都作为替代 字符串的一部分。 例如把上例中的宏定义: #define MAX(x,y)(x>y)?x:y 写成: #define MAX (x,y)(x>y)?x:y 将被认为是无参宏定义,宏名定义MAX代表字符 串(x,y)(x>y)?x:y 。 在上例中的宏定义语句中插入空格后,编译将失 败。
13
第8章 编译预处理
8.2 文件包含@include (4) 如果文件file1包含文件file2,而在文件file2中又要包含文件file3的 内容,则可在文件file1用两个#include命令分别包含文件file2和文件 file3,而且文件file3要出现在文件file2之前,即在文件file1.c中定义: #include <file3.h> #include <file2.h> 这样file1和file2都可以用file3的内容。 (5) 在一个被包含文件中又可以包含另一个被包含文件,即文件包含 是可以嵌套的。 (6) 被包含文件(如file2.h)与其所在文件(如file1.c),经编译预处理后 已成为同一文件,因此,如果file2.h中有全局静态变量,它在文件 file1.c中有效,不必用extern声明。

高树芳C语言程序设计--第八章

高树芳C语言程序设计--第八章

30
8.5 知识拓展
案例8-11 指针的高级应用 [案例任务] 阅读下列程序 ,分析运行结果,了解指 针的各种应用。
程序代码
31
8.5 知识拓展
相关知识:
1.有关指针的数据类型小结 2.案例说明 3.main函数的参数
32
12
8.2 指针变量
[课堂训练8-1] void swap(int *p1,int *p2) { int *t; t=p1; p1=p2; p2=t; }
1.分析下面的程序,写出运行结果。 #include <stdio.h> void main() { void swap(int *p1,int *p2); int *p1,*p2,a=6,b=8; p1=&a; p2=&b; printf(" 交换前:*p1=%d,*p2=%d\n",*p1,*p2); swap(p1,p2); printf(" 交换后:*p1=%d,*p2=%d\n",*p1,*p2); }
17
8.3 指针与数组
案例8-6 [案例任务]
冒泡排序
使用指针指向一维整型数组,使用冒泡排 序法对数组元素从小到大排序并输出。
程序代码
18
8.3 指针与数组
相关知识: 1.冒泡排序法 2.指针变量的其他运算
19
8.3 指针与数组
案例8-7 [案例任务]
逆置一维数组
使用数组名或指针变量作为函数形参与实 参,完成一维数组元素的逆置。请分析程 序运行结果,并对两个方法进行比较。
6
8.2 指针变量
案例8-2 用指针交换两整数 案例8-3 用指针比较两数大小 案例8-4 用指针参数交换两整数

第8章:VB6.0基础知识

第8章:VB6.0基础知识

三、VB的基本语法
3.3 常量
2、符号常量 在程序中,某个常量多次被使用,则可以使用一个符
号来代替该常量,这样不仅在书写上方便,而且有效地改进 了程序的可读性和可维护性。
VB中使用关键字Const 声明符号常量。其格式如下:
Const 常量名 [As 类型|类型符号]=常数表达式 例如:
Const PI#=3.1415926535 等价于: Const PI As Double=3.1415926535
2.1 主窗口
应用程序窗口,由标题栏、菜单栏和工具栏组成
VB的三种工作模式(标题栏总显示当前模式)
(1)设计模式:创建应用程序的大多数工作都是在设计 时完成的。在设计时,可以设计窗体、绘制控件、编写代码 并使用“属性”窗口来设置或查看属性设置值。
(2)运行模式:代码正在运行的时期,用户可与应用程 序交流。可查看代码,但不能改动它。
一、Visual Basic 概述
2.VB 的特点
(4)事件驱动机制 通过事件来执行对象的操作,有事件则程序执行,无事
件则 程序暂停。一个对象可能会产生多个事件,每个事件都可 以通过一段程序来响应。
程序不必建立具有明显开始和结束的程序,而是编写若干 个微小的子程序,即过程(分别面向不同的对象) ,由用户操 作引发某个事件来驱动执行某种特定的功能,或者由事件驱动 程序调用通用过程来执行指定的操作。
第8章:VB6.0基础知识
一、Visual Basic 概述
2.VB 的特点
VB是一种可视化的、面向对象和采用事件驱动方式的结 构化高级程序设计语言,可用于开发Windows环境下的 各类应用程序。
(1)可视化编程语言
程序员在编制程序的时候就设定及知道程序运行后的界 面及图形,开发程序的过程是先设置程序界面,然后设置界面 属性,然后编制运行代码。

C语言程序设计(第八章)

C语言程序设计(第八章)
字符读写函数fgetc()和fputc()是以字符(字节)为单位
的读写函数。 每次可从文件读出或向文件写入一个字符。
第八章
1.读字符函数fgetc()
fgetc() 函数的功能是从指定的文件中读一个字符,函
数调用的形式为:
字符变量 = fgetc(文件指针);
例如:
ch = fgetc(fp);
的意义是从打开的文件fp中读取一个字符并送入ch中 。
(1)字符读/写函数 :fgetc()/fputc()
(2)字符串读/写函数:fgets()/fputs()
(3)数据块读/写函数:freed/()fwrite()
(4)格式化读/写函数:fscanf()/fprinf()
以上函数原型都在头文件stdio.h中加以声明。
第八章
8.5.1字符读/写函数 :fgetc()/fputc()
关闭文件则断开指针与文件之间的联系,禁止再对该文
件进行操作。
第八章
8.3.1 文件打开的函数fopen()
open函数用于打开一个文件,其调用的一般形式为: 文件指针名 = fopen(文件名, 使用文件方式);
“文件指针名”:必须是被说明为FILE 类型的指针变量。
“文件名”:被打开文件的文件名,“文件名”是字符串常 量、字符数组或字符指针。 “使用文件方式”:指文件的类型和操作要求。
/* 输出系统提示信息 */
上面程序段的意义是,如果返回的指针为空,表示不能 打开test.dat文件,则给出提示信息“打开文件test.dat出 错!”,然后输出系统提示信息,当用户从键盘敲任一键后 执行exit(1)退出程序 。
第八章
8.3.2 文件关闭的函数fclose()

第08章 词法分析

第08章 词法分析

26
―*‖:表示前面的字符可以出现任意次。例如, “go*gle‖可以匹配ggle, gogle, google, gooogle,goooogle等。 “+‖:表示前面的字符必须至少出现一次。 例如,“go+gle‖可以匹配gogle, google, gooogle,goooogle等。 “(‖和“)‖:表示范围或分组。例如, “gr(a|e)y‖等价于“gray|grey‖ , “(grand)?father‖可以匹配father和 grandfather。
>
8
= 其它字符
=
11
= 其它字符
!
14
= 其它字符

17 18
- * / ( ) , ; 其它字符
. . .
24 25
返回($SUB,- ) 返回($MUL,- ) 返回($DIV,- ) 返回($LPAR,- ) 返回($RPAR,- ) 返回($COM,- ) 返回($SEM,- )
ERROR出错处理
27
常用元字符及含义
28
正则表达式实例
29
lex文件实例
1) 打印文件内容(justPrint.l) 2) 打印行号(lineNum.l) 3) 打印标识符(identifier.l) 4) 打印单词(word.l)
30
8. 课后练习
(1) 参考教材上词法分析器LexAnalyze()对应 的词法规则,编写lex文件,用lex自动生成相 同功能的词法分析器。
(2) 设计一个简单语言的词法规则,编写lex文 件,用lex自动生成该语言的词法分析器。
31
参考资料
Lex & Yacc Tutorial /lexandyacc/index.html

Altium Designer 14原理图与PCB设计教程 第八章 PCB编辑器常用编辑方法

Altium Designer 14原理图与PCB设计教程 第八章 PCB编辑器常用编辑方法

“Top-Middle-Bottom”表示焊盘在PCB板 的顶层、中间各层以及底层的尺寸和形状不同, 需要用户在如图8-1-5内的列表中分别设置焊 盘在PCB板各层的尺寸和形状。“Full Stack” 表示焊盘在PCB板各层中的大小和形状都需要 单独设置,选中该项后,“Size and Sharp” 区域底部的【Edit Full Pad Layer Definition…】按钮被激活,单击该按钮,打 开如图8-1-6所示的“Pad Layer Editor”对 话框。用户可在“Pad Layer Editor”对话框 中对焊盘在每一层的大小形状进行设置。
图8-1-7 “Via”对话框
8.1.4 放置字符串
Altium Designer中的字符串能被放在任何层,宽度可从0.001 mil到10000mil之间变化。系统提供3种字体绘制文本。默认的 形式是简单的矢量字体,这种字体支持笔绘和矢量光绘。 自由文本能被放在任何层。当元件被放置的时候,元件上的文本 (如元件标号等)被自动地指定放在 “Top Overlay”或 “Bottom Overlay”,这些文本不能被移到其他层。 放置字符串的操作方法如下。 (1)在工作区选择放置字符串的PCB板层,单击“Wiring”工 具栏中的放置字符串按钮【A】,或执行菜单命令 “Place”→“String”。
(2)按【Tab】键,打开如图8-1-11所示
的“Linear Dimension”对话框。各选项
功能如下。
“Pick Gap”编辑框用来设置尺寸线与标
注对象间的距离。
“Extension Width”编辑框用来设置尺
寸延长线的线宽。
“Arrow Length”编辑框用来设置箭头线
长度。

《C语言程序设计(第五版)》-第8章编译预处理

《C语言程序设计(第五版)》-第8章编译预处理
示例代码如下: # define SIZE 1000 … printf("SIZE");
此程序段将显示SIZE,而不是1000。
C语言程序设计
第8章 编译预处理
8.1.1 不带参数的宏定义
说明:
(5)可以引用前面已经定义的宏名来定义新的宏,示例代码如 下: #define I1 30 #define I2 60 #define J I1+I2 #define K J*2+J/2+I2
其含义是用指定的宏名(即标识符)来代表其后的字符串。
C语言程序设计
第8章 编译预处理
8.1.1 不带参数的宏定义
示例代码如下: #define SIZE 1000 #define PI 3.1415926 #define FORMAT "%d,%d,%d\n"
用标识符SIZE来代替字符串1000, 用标识符PI来代替字符串3.1415926, 用标识符FORMAT来代替字符串"%d,%d,%d\n", 在编译预处理时,将程序中在该命令以后出现的所有的SIZE用1000
本章教学重点:宏定义的两种形式,文件 包含的使用方法。
本章教学难点:带参数的宏定义。
C语言程序设计
第8章 编译预处理
主要内容:
8.1 宏定义 8.2 “文件包含”处理 8.3 条件编译
C语言程序设计
第8章 编译预处理
第8章 编译预处理
编译预处理是指一些行首以#开头的特殊语句。 在对程序进行通常的编译之前,必须先对程序中这 些特殊的命令进行“预处理”,即根据预处理命令, 对程序作相应的处理。
第8章 编译预处理
本章概述 本章的学习目标 主要内容

《C语言程序设计》教材习题答案第8章

《C语言程序设计》教材习题答案第8章

一、选择题1.以下数组定义中,错误的是:C)int a[3]={1,2,3,4};2.以下数组定义中,正确的是:B) int a[][2]={1,2,3,4};3.设有定义“int a[8][10];”,在VC中一个整数占用4字节,设a的起始地址为1000,则a[1][1]的地址是:D)10444.已知有数组定义“int a[][3]={1,2,3,4,5,6,7,8,9};”,则a[1][2]的值是:C)65.在以下字符串定义、初始化和赋值运算中,错误的是:A) char str[10];str=”String”;6.设有以下字符串定义,char s1[]={‘S’,’t’,’r’,’i’,’n’,’g’};char s2[]=”String”;则s1和s2:C)长度不同,但内容相同。

7.设有定义“int a[10]={0};”,则说法正确的是:A)数组a有10个元素,各元素的值为0.8.设已定义“char str[6]={‘a’,’b’,’\0’,’c’,’d’,’\0’};”,执行语句“printf(“%s”,str)”后,输出结果为:B)ab9.引用数组元素时,数组元素下标不可以是:C)字符串10.已定义字符串S1和S2,以下错误的输入语句是:C)gets(s1,s2);11.下面程序段的运行结果是:A)123void main(){char a[]=”abcd”,b[]=”123”;strcpy(a,b);printf(“%s\n”,a);}12.下面程序段的运行结果是:A)123void main(){char a[]=”123”,b[]=”abcd”;if(a>b)printf(“%s\n”,a);else printf(“%s\n”,b);}二、编程题1.一维数字a的值已经,请把数组中的值按逆序存放,然后输出数组。

例如数组中原来的值为3,4,2,1,6,颠倒后变成6,1,2,4,3.#include<stdio.h>main(){int i,a[5]={2,3,45,12,5},t;printf("转换前:");for(i=0;i<5;i++)printf("%d\t",a[i]);for(i=0;i<5/2;i++){t=a[i];a[i]=a[5-i-1];a[5-i-1]=t;}printf("\n转换后:");for(i=0;i<5;i++)printf("%d\t",a[i]);}2.输入一个整数(位数不确定),从高位到低位依次输出各位数字,其间用逗号分隔。

C语言程序设计教程第8章北京邮电大学出版社.

C语言程序设计教程第8章北京邮电大学出版社.

第8章 指针
18
说明: 对于不同基类型的指针,指针变量“加上” 或“减去”一个整数n所移动的字节数(= sizeof( 指针所指对象的数据类型 ) )是不同的。 例如: float a[10], *p=a, *x; x=p+3; /*实际上是p加上3*4个字节赋给x, x依然指向数组的第三个分量*/
C语言程序设计教程
第 8 章 指针
8.1 8.2 8.3 8.4 8.5 8.6 指针与指针变量 指针与函数 指针与数组 指针与字符串 指针数组与命令行参数 程序举例
第8章 指针
2
8.1 指针与指针变量
8.1.1 指针的概念
1.内存与变量地址 内存地址:内存是计算机用于存储数据的存储 器,以一个字节作为存储单元,为了便于访问,给 每个字节单元一个唯一的编号,第一字节单元编号 为0,以后各单元按顺序连续编号,这些单元编号 称为内存单元的地址 。 变量地址:变量所分配存储空间的首字节单元 地址(字节单元编号)。
2018/9/14
C语言程序设计教程
第8章 指针
3
在程序中,对变量的操作实际上是通过地址来完成的。 • 定义时:定义变量→分配内存单元(按类型)→地址 (即内存中的编号) • 存取操作:程序 →变量名 →内存单元 →存取 • 实际上: 程序 →编译 →变量名 →变量的地址
2.访问方式
直接存取:把直接按变量名或地址存取变量值的方式 称为 “直接存取”方式。
2018/9/14
C语言程序设计教程
第8章 指针
10
8.1.3 指针运算
指针运算实际上是地址的计算,包括赋值运算、算术运算、 关系运算三种。
1. 指针的赋值运算 (1)将变量地址值赋给指针变量,使指针指向该变 量。

c语言程序设计第五版课后答案谭浩强第八章课后答案

c语言程序设计第五版课后答案谭浩强第八章课后答案

c语⾔程序设计第五版课后答案谭浩强第⼋章课后答案c语⾔程序设计第五版课后答案谭浩强习题答案第⼋章善于利⽤指针本章习题均要求使⽤指针⽅法处理。

1. 输⼊3个整数,要求按由⼩到⼤的顺序输出。

解题思路:先获取到三个变量的地址,然后获取三个数据,通过指针进⾏⽐较转换即可答案:#include <stdio.h>void swap(int *p_a, int *p_b){int temp = *p_a;*p_a = *p_b;*p_b = temp;}int main(){int a, b, c, *p_a = &a, *p_b = &b, *p_c = &c; // 获取每个变量空间的地址printf("Please enter three numbers:");scanf_s("%d%d%d", p_a, p_b, p_c);if (*p_a > *p_b) {swap(p_a, p_b);//通过指针进⾏指向空间内的数据交换}if (*p_a > *p_c) {swap(p_a, p_c);}if (*p_b > *p_c) {swap(p_b, p_c);}printf("%d %d %d\n", *p_a, *p_b, *p_c);system("pause");return 0;}2. 输⼊3个字符串,要求按由⼩到⼤的顺序输出。

解题思路:字符串的⽐较可以使⽤strcmp函数,返回值>0表⽰⼤于,返回值⼩于0表⽰⼩于,返回追等于0表⽰相同。

其他的⽐较排序思路与数字的排序交换没有区别,逐个进⾏⽐较先找出最⼤的,然后找出第⼆⼤的。

答案:#include <stdio.h>int main(){char str[3][32];char *p[3];printf("Please enter three strings:");for (int i = 0; i < 3; i++) {p[i] = str[i];scanf_s("%s", p[i], 32);//后边的数字限制缓冲区边界,防⽌缓冲区溢出访问越界}//让p[0]和p[1]/p[2]分别进⾏⽐较,找出最⼤的字符串,i+1之后,则让p[1]和p[2]进⾏⽐较,找出第⼆⼤//i循环总个数-1次,最后⼀个是不需要⽐较的for (int i = 0; i < 2; i++) {for (int j = i + 1; j < 3; j++) {if (strcmp(p[i], p[j]) > 0) {char *tmp = p[i]; p[i] = p[j]; p[j] = tmp;}}}printf("%s %s %s\n", p[0], p[1], p[2]);system("pause");return 0;}3. 输⼊10个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。

C语言,第8章 数组(字符数组)

C语言,第8章 数组(字符数组)
第8章 数组
(字符数组)
内 容 提 要
• • • • • • • •

• •
什么是字符串? 字符数组的作用 字符数组的定义 字符数组的输入和输出 字符数组的初始化 程序实例 字符串复制函数strcpy 字符串连接函数strcat 字符串比较函数strcmp 字符串长度函数strlen 程序实例
什么是字符串?
给字符数组赋值
例如:
char c[]={“boy”}; char c[]=“boy”; char c[]={„b‟, „o‟, „y‟, „\0‟};
赋值后字符数组c在内存中的状态:
c[0] b c[1] c[2] o y c[3] \0
给字符数组赋值
• 从键盘输入:

例如:: 使用循环逐个字符输入 #include <stdio.h> int main(void) { char c[20]; int i; for (i=0; i<3; i++) { scanf(“%c”, &c[i]); } c[i] = „\0‟; …….. return 0;
输出结果
printf(“zimu=%d,shuzi=%d,kongge=%d,qita=%d\n",
zimu, shuzi, kongge, qita);
return 0; }
使用字符串处理函数必须加头文件 <string.h>
字符串复制函数strcpy
1. strcpy(字符数组1,字符串2) 作用:将字符串2复制到字符数组1中去。
例如:输入 My name is chdong!
遇到第一个空格结束,因此只输入 My
字符数组的输出

C语言程序设计教程 杨路明 答案第8章

C语言程序设计教程 杨路明 答案第8章
getch();
}
9、
/*输入n个数,并排序后输出。*/
#include<stdio.h>
#include<string.h>
int *paixu(int data[],int n)
{ int i,*p1,*p2,temp;
p1=data;
for(p1=data;p1<data+n-1;p1++)
printf("Please input a string: ");
gets(a);
p=a;q=b;
printf("\n\nPlease input m and n(like 1,1): ");
scanf("%d,%d",&m,&n);
if( (strlen(a)>=m) && ((strlen(a)-m+1)>=n) )/*复制的位置要符合要求*/
#include<stdio.h>
void main()
{
int a[100],temp1=0,temp2=0,max=0,min=0,k;
printf("\nPlease input 8 ge shu: ");
for(k=0;k<8;k++)
{ scanf("%d",&a[k]);
{
t=(int)(*p-48);
a[i]=a[i]*10+t;
p++;
if((*p)>'9'||(*p)<'0')
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第十一章字符串1D解析:字符串在 C 语言中年干存储时,应该用数组或者是指针进行存储数据。

A 选项中str 为数组,但是后面的赋值的对象中的 '\064'为一个字符,不能构成一个字符串,字符串必须有一个结束符,即: '\0'。

故 A 答案是错误的。

B 答案中的str为一个字符变量,变量不能用来存储字符串。

故B选项是错误的。

C答案同理。

只有 D 答案中符合字符串的定义规则。

2A解析:A选项中ss[1]可以看作是一个地址常量,其值不能改变,所以不可以对其赋值。

但是在定义二维数组的时候,对其进行初始化是允许的,如选项B。

选项C中定义的值指针数组,数组中的每一个元素都是指针,所以ss[1]代表的是一个指针,所以指针可以指向一个字符串,即让该指针变量指向该字符串。

选项D中的ss为一个指针数组,所以指针数组中元素都为指针,此时为让该变量指向了“ right?”字符串。

3A解析:str是地址常量,p是指针变量,两者类型不一致,选项B错误。

str数组的长度是20,而p所指的字符串遇到=0'就结束,本题中其长度应该为7,选项C错误。

同理,既然str数组的长度与p所指字符串长度不同,所以D答案中的str中的内容为在存储字符串以后的后面为13个‘ \0' p的内容为:7个有效字符。

4C解析:对于数组p,只有三个元素,分别是’a'b'c:所以sizeof(p)的输出结果应该是3,对于数组q,存储了四个元素,分别是’a','b:'c以及'\0'。

所以sizeof (q)的输出结果是4。

5C解析:对于数组a,只有四个元素,分别是'\'\''以及'\0;所以sizeof(a)的输出结果应该是4,对于数组b,存储了三个元素,分别是‘X;'y','z。

所以sizeof (b)的输出结果是3。

所以数组a的长度大于b数组的长度。

6C解析:数组a中存储了7个字符,分别是'a ; '0 ; '\0 ; '0 ; 'a, '0 ' , '\0 ',当使用sizeof(a)统计计数的时候,会统计计算这7个字符,但是当用strlen (a)统计数组元素个数的时候,遇到 '\0'的时候就会结束,所以最终的输出结果是7 2 。

7B解析:ps=s语句使ps指向数组s的首地址,即指向元素a,对于表达式*p+4,由于*的优先级高于+,所以进行间接访问运算,*p得到a,再+4,根据ASCII 码的顺序,最后的输出结果应该是e,答案为B。

8B解析:选项A的getc ()函数完成的是从文件中读入一个字符,而不是题目所要求的从键盘读入一个字符串,错误。

选项C的getchar ()函数每次读入的是一个字符变量,而不是字符串,错误。

选项D的scanf ()函数,通过格式控制符%$可以读入字符串变量,但是遇到空格会作为输入数据的分隔符,不会被作为数据读入。

选项B : gets ()函数的功能是从键盘中获得一个字符串,并且在获得字符串的时候可以接受空格字符。

9D解析:选项A中的参数2的类型应该为指针或者是地址,x[4]为一个数组中的元素,数据类型不匹配,应改为&x[4],选项B中的y是数组名,为常量,不能进行++运算,错误。

选项C中参数1对应的数组长度小于参数2的数组长度, 错误。

故只有 D 答案的结果正确。

10 B解析:strlen ()函数统计字符串长度的时候,是在遇到’\0'的时候结束统计。

所以对于数组q来说,定义了数组的长度为10,并给前三个字符赋了初值,则从第4个字符开始,系统将数组元素的值置为’\0:所以strlen(q)的结果是3。

而对于数组p 来说,数组长度为3,但是何时遇到 \\0\无法确定,所以strlen(p) 的值也无法确认。

11 D解析:函数f (char *p[],intn)完成的功能就是对字符串进行字典排序,所谓的字典顺序就是根据字母的大小顺序,strcmp函数中的功能是:将两个字符串进行比较,比较的原则是从第一个字符开始,如果第一个字符串相同的话,进行第二个字符的比较,一直往后,如果第一个字符不相同的话,直接返回第一个字符减第二个字符的值。

在f函数中的语句为两个for循环的嵌套。

那么执行过程为:1) i=0,i<4 真值,执行内循环。

\j=1;j<5 真值,执行后的结果为p[0]= ”aabdfg”,p[1]= ”abc”.j++ 后,j=2; j=2;j<5 真值,执行后的结果为p[0]= ”aabdfg”,p[2]= ”abbc”,j++ 后,j=3; j=3;j<5 真值,执行后的结果为p[0]= ”aabdfg”,p[3]= ”dcdb6',j++ 后,j=4; j=4; j<5 真值,执行后的结果为p[0]= ”aabdfg”,p[4]= ”cd”,j++ 后,j=5; j=5; j<5假值。

i++后变量的值为12) i=1,i<4 真值,执行内循环。

j=2;j<5 真值,执行后的结果为p[1]= ” abbd”,p[2]= ” abc”,j++ 后,j=3; j=3;j<5 真值,执行后的结果为p[1]= ” abbd”,p[3]= ”dcdbe”,j++ 后,j=4; j=4; j<5 真值,执行后的结果为p[1]= ” abbc T,p[4]= ”cd”,j++后,j=5; j=5; j<5假值。

i++后变量的值为23) i=2,i<4 真值,执行内循环。

j=3;j<5 真值,执行后的结果为p[2]= ” abC,p[3]= ”dcdbe”,j++ 后,j=4; j=4;j<5 真值,执行后的结果为p[2]= ” abcf,p[4]= ”cd”,j++ 后,j=5; j=5; j<5假值。

i++后变量的值为34) i=3, i<4 真值,执行内循环。

j=4; j<5 真值,执行后的结果为p[3]= ” cd”,p[4]= ”dcdbe”,j++ 后,j=5; j=5; j<5 假值。

i++ 后变量的值为 45) i=4, i<4 假值,退出循环。

最后strlen(p[1])的值为:4。

12 A解析:*运算符和++运算符的优先级相同,且结合方向都是自右向左,所以在进行运算时,先计算++的值,再计算*的值,p=s,p指向了字符串中的第一个元素。

即‘ 1'。

第一个*p++的计算为:变量p往后指一个位置,即指向了变量‘ 5'。

表达式P++的值为变量原来的值,即指向的还是‘ 1',所以*p++得到的值为‘ 1'。

所以最后的输出的结果的1。

第二个表达式的*p++,由于在前面的运算中,p指向了字符变量‘ 5'。

*p++的计算为:变量p往后指一个位置,即指向了变量‘ 9'。

表达式p++的值为变量原来的值,即指向的还是‘ 5',所以*p++得到的值为‘ 5'。

所以最后的输出的结果的5。

13 D解析:该题中的while语句中的功能是在a所指的字符串不结束,b所指的字符串不结束,同时两个字符串所指的字符的都相同时,继续往后判断,直到两个字符不相同,或者是其中的一个字符串结束时,退出该循环,所以最后返回的两个所对应位置上的字符的Ascii值,功能和strcmp ()功能是相同的。

所以选择答案D。

14 A解析:point ()函数传递的是指针变量的值,而不是指针变量本身的地址,仍然是一个传值而不是传地址的过程,实参的值没有改变,所以指针p仍然指向字符串的首地址,输出结果为a。

15 D解析:比较字符串大小的时候,应该调用函数strcmp(),而不是直接进行比较,选项A错误。

对于选项B,只要s1和s2不相等,无论s1所指串是大于或是小于s2所指串,其结果非0 (真值),都会执行语句S,与题意不符,错误。

选项 C 的函数实参顺序错误。

16 B解析:对于二维数组,每一行中含有的元素的个数为:10。

第二行的首元素是接着第一行的最后一个元素的。

所以p+10是指向字符串“ Beijing ”字符串的首地址,所以正确答案是B。

17 D解析:对于格式控制符%s,在输出的时候遇到’\0'才结束输出。

即输出的是个字符串。

执行循环。

1) p=s+1;p<s+4为真值,输出的结果为:BCD。

p++后,p指向了‘ C'。

2) p<s+4为真值,输出的结果为:CD。

p++后,p指向了‘ D'。

3) p<s+4为真值,输出的结果为:D。

p++后,p指向了‘ \0'。

4) p<s+4为假值,退出该循环。

18 B解析:gets ()函数需要的参数是指针类型的。

所以ACD都满足条件,答案B中的a[0]是数组中的元素,是一个字符,不是指针类型,错误。

19 A解析:char *p[4],即定义一个指针数组,数组中的每一个元素都为指针,p[4]指向的是下标为4的这一个字符串。

即:指向的是第5个字符串的首地址,即字符串“ cd”,所以strle n (p[4])的结果是2。

20 C解析:数组名是指针常量,不能对其进行整体赋值和整体使用,所以选项C错误,需要注意一点:在定义字符数组的时候可以初始化,如选项A。

2U C解析:char *s仁”abc”,即定义了一个指针变量si并且si指向的是这个字符串的第一个元素,即指向了字符‘ a'同样的s2指向了字符‘ 1'。

swap函数中的语句的功能是交换变量*x和*y两个变量的值,则最后输出的结果为si所指的字符串的内容为:1bc,s2所指的字符串的内容为:a23。

22 B解析:fun函数统计首字符是’T'的字符串的个数,所以符合条件的有”Tue”和”Thu”,输出结果为2.fun函数中的功能为:1) i=0;i<7;p[i][0]== ''为假值,n=0;i++。

变量i 的值为1;2) i=1;i<7;p[i][0]== 'T'为真值,n=1;i++。

变量i 的值为2;3) i=2;i<7;p[i][0]== 'T'为假值,n=1;i++。

变量i 的值为3;4) i=3;i<7;p[i][0]== 'T'为真值,n=2;i++。

变量i 的值为4;5) i=4;i<7;p[i][0]== 'T'为假值,n=2;i++。

相关文档
最新文档