第八章:善于利用指针
- 格式:doc
- 大小:71.50 KB
- 文档页数:4
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章善于利用指针指針是什么⏹如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元⏹内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。
⏹在地址所标识的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样。
⏹由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。
⏹将地址形象化地称为“指针”⏹务必弄清楚存储单元的地址和存储单元的内容这两个概念的区别指针变量2怎样定义指针变量⏹定义指针变量的一般形式为:类型*指针变量名;如:i n t*p o i n t e r_1,*p o i n t e r_2;•i n t是为指针变量指定的“基类型”•基类型指定指针变量可指向的变量类型•如p o i n t e r_1可以指向整型变量,但不能指向浮点型变量2怎样定义指针变量⏹下面都是合法的定义和初始化:f l o a t*p o i n t e r_3;c h a r*p o i n t e r_4;i n t a,b;i n t*p o i n t e r_1=&a,*p o i n t e r_2=&b;3怎样引用指针变量⏹在引用指针变量时,可能有三种情况:•给指针变量赋值。
如:p=&a;•引用指针变量指向的变量。
如有p=&a;*p=1;则执行p r i n t f(“%d”,*p);将输出1•引用指针变量的值。
如:p r i n t f(“%o”,p);3怎样引用指针变量⏹要熟练掌握两个有关的运算符:(1)&取地址运算符。
&a是变量a的地址(2)*指针运算符(“间接访问”运算符)如果:p指向变量a,则*p就代表a。
k=*p;(把a的值赋给k)*p=1;(把1赋给a)4指针变量作为函数参数通过指针引用数组1数组元素的指针⏹所谓数组元素的指针就是数组元素的地址⏹可以用一个指针变量指向一个数组元素i n t a[10]={1,3,5,7,9,11,13,15,17,19};i n t*p;p=&a[0];⏹在指针指向数组元素时,允许以下运算:•加一个整数(用+或+=),如p+1•减一个整数(用-或-=),如p-1•自加运算,如p++,++p•自减运算,如p--,--p•两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义)3通过指针引用数组元素⏹引用一个数组元素,可用下面两种方法:(1)下标法,如a[i]形式(2)指针法,如*(a+i)或*(p+i)其中a是数组名,p是指向数组元素的指针变量,其初值p=a 4用数组名作函数参数⏹用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该是一个指针变量⏹C编译都是将形参数组名作为指针变量来处理的通过指针引用字符串1字符串的引用方式⏹字符串是存放在字符数组中的。
浙江师范大学硕士研究生入学考试初试科目考 试 大 纲科目代码、名称:886软件工程综合基础适用专业:083500软件工程(一级学科)、085400电子信息(软件工程领域)一、考试形式与试卷结构(一)试卷满分及考试时间本试卷满分为150分,考试时间为180分钟。
(二)答题方式答题方式为闭卷、笔试。
试卷由试题和答题纸组成;答案必须写在答题纸(由考点提供)相应的位置上。
(三)试卷题型结构(一)C程序设计部分,满分60分,其中:1、单项选择题:10小题,每小题3分,共30分2、程序设计题:3小题,每小题10分,共30分(二)软件工程基础部分,满分90分,其中:1、分析设计题:3小题,每小题15分,共45分2、综合论述题:3小题,每小题15分,共45分二、考查目标(复习要求)软件工程专业全日制学术型研究生入学考试科目《软件工程综合基础》的考试内容包括C程序设计和软件工程基础两部分。
其中:C程序设计部分要求考生掌握C语言的基本内容及程序设计的基本方法、常用算法与编程技巧,掌握结构化程序设计思想,选择适当的数据类型表示实际问题,能使用函数进行模块化程序设计,掌握应用计算机解决和处理实际问题的思维方法与基本能力。
软件工程基础部分要求考生掌握软件工程的基本概念、基本原理、基本方法和技术,理解规范化、文档化在软件生命周期过程中的重要性,并能运用相关理论和方法解决软件工程中的实际问题。
三、考查范围或考试内容概要C程序设计部分第一章程序设计与C语言1.了解计算机语言的基本概念。
2.了解C语言的背景、特点。
3.掌握C语言程序的结构。
第二章算法——程序的灵魂1.了解算法的概念、特性。
2.了解结构化程序设计方法。
3.掌握算法的描述方法。
第三章最简单的C程序设计——顺序程序设计1.掌握C语言的常量与变量;整型、浮点型、字符型数据。
2021年全国硕士研究生入学考试湖北师范大学自命题考试科目考试大纲(科目名称:高级语言程序设计科目代码:821)一、考查目标高级语言程序设计科目考试要求考生系统掌握面向过程程序设计的基本知识、基础技能和结构化的程序设计方法,并能运用相关理论和方法分析、解决实际问题。
重点考查学生对C程序设计常用算法的理解及应用算法编写程序的能力。
二、考试形式与试卷结构(一)试卷成绩及考试时间本试卷满分为150分,考试时间180分钟。
(二)答题方式答题方式为闭卷、笔试。
(三)试卷题型结构1、单项选择题:15小题,每小题2分,共30分2、填空题:10小题,每小题2分,共20分3、程序分析题:5小题,每小题4分,共20分4、程序填空题:5小题,每小题4分,共20分5、程序设计题:6小题,每小题10分,共60分(四)主要参考书目谭浩强. C程序设计(第五版).北京:清华大学出版社,2017年。
三、考查范围第1章程序设计和C语言1、掌握程序的构成,main函数和其他函数。
2、头文件,数据说明,函数的开始和结束标志以及程序中的注释。
3、源程序的书写格式。
第3章顺序程序设计1、掌握C语言的基本数据类型。
2、掌握 C语言标识符的构成规则,定义变量、符号常量的方法。
3、掌握C语言的基本运算符、及运算优先级和结合性。
4、掌握不同类型数据间的转换规则,包括隐式类型转换、强制类型转换。
5、掌握表达式的概念,能够准确的判断表达式的结果类型和值。
特别是赋值表达式、自加自减表达式、逗号表达式、问号表达式的使用。
6、掌握C语言语句的构成,表达式语句,空语句,复合语句。
7、掌握输入输出函数的调用,正确输入数据并正确设计输出格式。
第4章选择结构程序设计1、掌握关系表达式和逻辑表达式的使用方法。
2、掌握选择结构。
包括if、if…else、if…else if结构的使用;以及if结构的嵌套;switch结构的使用。
第5章循环结构程序设计1、掌握基本循环结构的使用,包括while、do…while、for三种结构,以及它们的区别。
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个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。
湖北工程学院2021年普通专升本:《高级语言程序设计(C语言)》考试大纲一、基本要求:考生应按本大纲的要求,正确理解C语言的结构、语法与环境;C语言的基本概念、函数及其调用;各类语句的语法,语义和各种数据类型的使用特点;问题的分析、设计及C语言实现及调试方法,并得到充分的程序设计训练。
本大纲对内容的要求由低到高,对概念和理论分为“了解”和“理解”两个层次;对运算和程序分为“掌握”和“应用”两个层次。
二、考试方法和时间:考试方法为闭卷考试,考试时间为120分钟。
三、考试题型大致比例:选择题:30分,填空题:20分,程序阅读:40分,程序填空:24分,程序设计:36分满分:150分。
四、考试内容和要求:第1章程序设计和C语言考试内容:(1)什么是计算机程序;(2)什么是计算机语言;(3)C语言的发展及其特点;(4)C语言程序的结构;(5)运行C程序的步骤与方法;(6)程序设计的任务。
考试要求:(1)了解:C语言的发展历史及其特点;(2)掌握:运行C程序的步骤和方法;(3)应用:用C语言编写简单的屏幕输出程序第2章算法----程序的灵魂考试内容:(1)算法的概念;(2)算法的特性;(3)算法的几种表示方法;(4)结构化程序设计方法;考试要求:(1)了解:最基本的算法;(2)理解:结构化程序设计方法第3章最简单的C程序设计----顺序程序设计考试内容:(1)数据的表现形式及其运算;(2)运算符和表达式;(3)C语句;(4)数据的输入输出;考试要求:(1)掌握:几种基本数据类型的表示形式,以及定义于基本数据类型之上的各种运算(算术、赋值、关系、逻辑、条件、逗号等);(2)掌握:常量的意义及几种基本数据类型的常量的表示形式,符合常量的定义与使用,变量的定义及自定义标识符的规范;(3)掌握:混合运算的表达式中各种运算符的优先级及结合方向;(4)掌握:输入、输出函数的使用规范第4章选择结构程序设计考试内容:(1)选择结构和条件判断;(2)关系运算符和关系表达式,逻辑运算符和逻辑表达式,条件运算符和条件表达式;(3)if选择控制语句;(4)switch选择控制语句。
南京信息工程大学滨江学院实验(实习)报告
实验(实习)名称指针实验(实习)日期 2011.12 指导教师宣文霞
专业实验班年级大一班次4 班姓名王雅婷学号 20112335052 Eg8-1: 输入两个整数,并使其从大到小输出,用指针变量实现数的比较。
(1)源程序:
#include <stdio.h>
void main()
{ int *p1,*p2,*p,a,b;
scanf("%d,%d",&a,&b);
p1=&a; p2=&b;
if(a<b)
{ p=p1; p1=p2; p2=p;}
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d\n",*p1,*p2);
}
(2)输入数据:13,15
(3)结果输出:
Eg8-2: 输入两个整数,并使其从大到小输出,用函数实现数的交换
(1)源程序:
#include <stdio.h>
void swap(int *p1, int *p2)
{ int p;
p=*p1;
*p1=*p2;
*p2=p;
}
void main()
{ int a,b;
int *p,*q;
scanf("%d,%d",&a,&b);
p=&a; q=&b;31
if(a<b) swap(p,q);
printf("\n%d,%d\n",a,b);
}
(2)输入数据:13,16
(3)结果输出:
(4)如果将swap 函数修改为如下形式,分析如何调试和修改?
void swap(int *p1, int *p2)
{
int *p;
*p=*p1;
*p1=*p2;
*p2=*p;
}
Eg8-3:用指针法输入12 个数,然后按每行4 个数输出。
(1)算法分析:定义一个整型数组和一个整型指针,这样通过数组就可以静态分配内存空间,存储数据;然后将指针与数组相关,使指针指向与数组相同的首地址处,这样就可以通过指针或者数组都可以对存储空间加以操作。
(2)源程序:
#include <stdio.h>
void main()
{ int j,k,a[12],*p ;
p=a; //使指针p 指向与数组a 相同的首地址处
for(j=0;j<12;j++)
scanf("%d",p++); //移动P 的位置,输入数据
p=a; //指针重定位
for(j=0;j<12;j++)
{
if(j%4==0)
printf("\n"); //按每行4 个数输出
printf("%4d",*p++);
}
printf("\n");
}
(3)输入数据:0 1 2 3 4 5 6 7 8 9 10 11
(4)结果输出:
Eg8-4: 从键盘输入十个整数,要求用冒泡法(或选择法)实现从大到小的排列输出。
#include <stdio.h>
main()
{
int s[10],t,i,j,x;
printf("input 10 numbers:\n");
for(t=0;t<10;t++)
scanf("%d",&s[t]);
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(s[j]<s[j+1])
{t=s[j];s[j]=s[j+1];s[j+1]=t;}
printf("the result is:\n ");
for(j=0;j<10;j++)
printf("%d",s[ji]);
printf("\n");
}
输入数据:1 2 3 4 5 6 7 8 9 10
结果输出:
Eg8-5: 练习指针数组:有三个字符串“DATA STRUCTURE”、“COPUTER DESIGN”、“C PROGROM”,请按字符顺序输出这三个字符串。
(要求用指针数组指
向这三个字符串。
)
#include<stdio.h>
#include<string.h>
void sort(char *p[]);
int main()
{
char a[]="DATA STRUCTURE ",b[]="COPUTER DESIGN ",c[]="C PROGROM "; char *p[3];
int i;
p[0]=a;
p[1]=b;
p[2]=c;
sort(p);
for(i=0;i<=2;i++)
printf("%s ",p[i]);
printf("\n");
return 0;
}
void sort(char *p[])
{
char *t;
if(strcmp(p[0],p[1])>0)
{
t=p[0];
p[0]=p[1];
p[1]=t;
}
if(strcmp(p[0],p[2])>0)
{
t=p[0];
p[0]=p[2];
p[2]=t;
t=p[1];
p[1]=p[2];
p[2]=t;
}
}
输入数据:“DATA STRUCTURE”、“COPUTER DESIGN”、“C PROGROM”
结果输出:。