C语言指针作业记录2020年3月16日

函数调用时参数所传送的内容是:

数组地址传送、简单变量地址传送、变量地址或数组地址传送


若有语句组

char name[32]="beijing", *pn=name; while( pn[0]!='\0'){pn++;}

执行后pn[0]
的值是_____

\0


利用指针指向数组的内容,跟利用索引值取得的数组元素值是相同的;也就是说:*(a+1)与 a[1]都是指向数组的第2个元素。

错误


假设a是一个整型数组的数组名,则a=a+1
的表示不合法。

正确


想要利用指针传递到函数中,

int main (void) {int a[5]={13,32,67,14,95};int i,num=24; replace(a, 4, num);} void replace(int *ptr, int n, int num) {*(ptr+n-1)=num;},

置换后数组a[5]={13, 32, 67, 14, 24}

错误


指针不但可以指向任何一种数据型态的变量,还可以让指针指向另一个指针变量,这种指向指针的指标(pointer of pointer),通称为双重指标。

正确


不能把一个整数常量直接赋值给指针变量

正确


指针变量的初始化可以直接赋地址,比如int *ps=10000;
错误


设指针变量已经指向一个有效地址,则表达式&*p==p
的结果为真.

正确


struct s

{

int id;

char name[32];

}stu, *ps;

ps = &stu;

通过指针ps读入stu成员的id和name的语句为:

scanf("%d", ________id);

scanf("______", ________name);

&ps->

%s

ps->


指针指向一维数组时,比如若有int s[10],*ps;
则对ps的初始化,即 ps=s; 和ps=&s[0];
使得ps指向s的同一个元素。

正确


以下语句组,可以实现从键盘输入一个整数给变量x。

int x, *px; scanf("%d", px);

错误


利用指针指向数组的内容,跟利用索引值取得的数组元素值是相同的;也就是说:&a[1]与 a+1都是指向内存的同一个地址。

正确


若有char *ps="beijing", 则ps[3]的值为____;strlen(ps)的值为________

j

7



/*------------------------------------------------

【程序设计】 Guo S.

--------------------------------------------------

题目:完成函数void fun(char *s),

功能是将s指向的字符串中的所有数字字符前,插入一个#,

比如当s指向a1b2c33时,

执行fun后,s指向的字符串为a#1b#2c#3#3

要求: 利用指针完成.

--------------------------------------------------

注意:部分源程序给出如下。请勿改动主函数

main和其它函数中的任何内容,仅在函

数的花括号中begin和end之间填入所编写的若干语句。

*********Begin**********和********** End **********不可删除

------------------------------------------------*/

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <stdlib.h>

#define N 128

void bky();

void fun1(char *s)

{

/**********Begin**********/

/********** End **********/

}

int main()

{

char s[256];

printf("请输入一个字符串:");

gets(s);

fun1(s);

puts(s);

bky();

return 0;

}

void bky()

{

FILE *IN,*OUT;

int i;

char s[256];

IN=fopen("in.dat","r");

if(IN==NULL)

{

printf("Please Verify The Currernt Dir..it May Be Changed");

return;

}

OUT=fopen("out.dat","w");

if(OUT==NULL)

{

printf("Please Verify The Current Dir.. it May Be Changed");

return;

}

 

for(i=0;i<3;i++)

{

fscanf(IN, "%s", s);

fun1(s);

fprintf(OUT, "%s\n", s);

}

fclose(IN);

fclose(OUT);

}

【参考代码】

char *p, *q, *s0=s;

int len;

len = strlen(s);

p=(char *)malloc( sizeof(char)*(len*2+1) );

 

if(NULL==p){

exit(1);

}

q=p;

while(*s)

{

if( *s>='0'&&*s<='9')

{

*p++ = '#';

}

*p++ = *s++;

}

*p='\0';

strcpy(s0,q);

free(q);

q=p=NULL;

return ;


/*------------------------------------------------

【程序设计】 一、二维数组;排序;guosumei

 

--------------------------------------------------

题目:键盘输入3人成绩(整数)和姓名,按照空格隔开。比如

80 zhangshan

100 lisi

90 zhaoliu

要求:完成函数fun1,

按照成绩排序(从高到低),程序会按照以下输出

100 lisi

90 zhaoliu

80 zhangshan

--------------------------------------------------

注意:部分源程序给出如下。请勿改动主函数

main和其它函数中的任何内容,仅在函

数的花括号中begin和end之间填入所编写的若干语句。

*********Begin**********和********** End **********不可删除

------------------------------------------------*/

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <stdlib.h>

#define N 128

#define L 3

void bky();

//第一个参数为成绩首地址,第二个为姓名的首地址,第三个为数组长度

void fun1(int score[], char name[][32], int num)

{

// 数组长度num

/**********Begin**********/

/********** End **********/

}

int main()

{

int num=3, n, m,k=1;

int score[3];

char name[3][32];

for(n=0;n<num;n++){

printf("请输入第%d个整数成绩和姓名(空格隔开):\n", n+1);

scanf("%d%s", &score[n], name[n]);

}

 

fun1(score, name, num);

for(n=0;n<num;n++){

printf("%d %s\n", score[n], name[n] );

}

bky();

return 0;

}

void bky()

{

FILE *IN,*OUT;

int num=3, n, m,k=1;

int score[3];

char name[3][32];

IN=fopen("in.dat","r");

if(IN==NULL)

{

printf("Please Verify The Currernt Dir..it May Be Changed");

return;

}

OUT=fopen("out.dat","w");

if(OUT==NULL)

{

printf("Please Verify The Current Dir.. it May Be Changed");

return;

}

for(n=0;n<num;n++){

fscanf(IN, "%d%s", &score[n], name[n]);

}

 

fun1(score, name, num);

for(n=0;n<num;n++){

fprintf(OUT, "%d %s\n", score[n], name[n] );

}

fclose(IN);

fclose(OUT);

}

【参考代码】

int i,j,t;

char temp[32];

for(i=0;i<num;i++)

for(j=i+1;j<num;j++)

{

if( score[i]<score[j])

{

t=score[i]; score[i]=score[j];

score[j]=t;

strcpy(temp, name[i]);

strcpy(name[i], name[j]);

strcpy(name[j], temp);

}

}

return ;
/*------------------------------------------------

【程序设计】Guo S.

--------------------------------------------------

题目:输入一个字符串,将连续数字字符作为整数输出。

设只有英文大小写字符和数字组成,比如a123b4x576AAZ36,将其中连续的数字字符作为一个整数,

依次存放到一维数组中,比如整数123、4、576和36分别存放于num[0],num[1],num[2]和num[3]中,

输出字符串中构成整数的个数,以及各个整数。

完成函数 int fun1(char *str, int num[])

// 函数返回数字的个数,即num的个数

//

// 数组num, 设str中连续数字中,不超过32

// num[0]存放第一个连续的数字,

// num[2]存放第二个连续的数字,

// 以此类推

本例题中,则需输出个数4,以及具体数值123、4、576和36。

共有4个数字:

123

4

576

36

要求: 字符串部分、存放结果的部分,均用指针完成.

--------------------------------------------------

注意:部分源程序给出如下。请勿改动主函数

main和其它函数中的任何内容,仅在函

数的花括号中begin和end之间填入所编写的若干语句。

*********Begin**********和********** End **********不可删除

------------------------------------------------*/

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <stdlib.h>

#define N 128

void bky();

int fun1(char *str, int num[])

{

// 函数返回数字的个数,即num的个数

//

// 数组num, 设str中连续数字中,不超过32

// num[0]存放第一个连续的数字,

// num[2]存放第二个连续的数字,

// 以此类推

/**********Begin**********/

/********** End **********/

}

int main()

{

char str[N];

int num[32], number, j;

printf("输入一个字符串: ");

scanf("%s", str);

 

number=fun1(str, num);

printf("共有%d个数字:\n", number);

 

for(j=0;j<number;j++)

printf("%d\n",num[j]);

bky();

return 0;

}

void bky()

{

FILE *IN,*OUT;

int i;

char str[N];

int num[32], number, j;

IN=fopen("in.dat","r");

if(IN==NULL)

{

printf("Please Verify The Currernt Dir..it May Be Changed");

return;

}

OUT=fopen("out.dat","w");

if(OUT==NULL)

{

printf("Please Verify The Current Dir.. it May Be Changed");

return;

}

for(i=0;i<6;i++)

{

fscanf(IN, "%s", str);

number=fun1(str, num);

fprintf(OUT, "共有%d个数字:\n", number);

for(j=0;j<number;j++)

fprintf(OUT, "%d\n",num[j]);

}

fclose(IN);

fclose(OUT);

}

【参考代码】

int len,i,*nump,isum=0, flg, number=0;

len =strlen(str);

nump=num;

 

for(i=0;i<32;i++)

num[i] = 0;

 

while( *str ){ //ab12c0c568dd666:结果是12,0,568,666四个数字

isum=0;

flg=0;

while( *str>='0' && *str<='9') {

isum = isum*10 + (*str-'0');

str++;

flg=1;

}

if(flg) {

*nump=isum;

nump++;

str--;

number++;

}

str++;

}

return number;
/*------------------------------------------------

【程序设计】

--------------------------------------------------

题目:编程实现:

完成函数 void fun1(int *n, int num)

// 指针n指向存放num*num个整数,num为奇数

// 将最大一个数存放到中间,其他按从小到大以此存放

键盘输入大于等于3且小于等于11的奇数N,以及N*N的二维数组的值,将最大值存放到中间,将从小到大的值依次放数组中。

比如当输入3,以及

41 3 4

1 5 2

3 6 9

则有最大值41,存放到数组的中间,其余按照从小到大放入:

1 2 3

3 41 4

5 6 9

要求: 利用指针指向二维数组完成.

--------------------------------------------------

注意:部分源程序给出如下。请勿改动主函数

main和其它函数中的任何内容,仅在函

数的花括号中begin和end之间填入所编写的若干语句。

*********Begin**********和********** End **********不可删除

------------------------------------------------*/

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <stdlib.h>

#define N 128

void bky();

void fun1(int *n, int num)

{

// 指针n指向存放num*num个整数,num为奇数

// 将最大一个数存放到中间,其他按从小到大以此存放

 

/**********Begin**********/

 

/********** End **********/

}

int main()

{

int *x, num, n, m,k=1;

do{

printf("输入一个大于等于3,且小于等于11的奇数: ");

scanf("%d", &num);

}while( num<3 || num>11 || num%2==0);

 

x=(int *)malloc(sizeof(int)*num*num);

 

for(n=0;n<num;n++){

for(m=0;m<num;m++){

printf("请输入第%d个数:", k);

scanf("%d", (x+n*num+m));

k++;

}

}

 

fun1(x, num);

for(n=0;n<num;n++){

for(m=0;m<num;m++){

printf("%d ", *(x+n*num+m));

}

printf("\n");

}

bky();

return 0;

}

void bky()

{

FILE *IN,*OUT;

int i;

int *x, num, n, m,k=1,*p1,*p2;

x=(int *)malloc(sizeof(int)*121);

IN=fopen("in.dat","r");

if(IN==NULL)

{

printf("Please Verify The Currernt Dir..it May Be Changed");

return;

}

OUT=fopen("out.dat","w");

if(OUT==NULL)

{

printf("Please Verify The Current Dir.. it May Be Changed");

return;

}

 

for(i=0;i<3;i++)

{

fscanf(IN, "%d", &num);

p1=x;

for(n=0;n<num;n++){

for(m=0;m<num;m++){

fscanf(IN, "%d", p1);

p1++;

}

}

 

fun1(x, num);

 

p1=x;

for(n=0;n<num;n++){

for(m=0;m<num;m++){

fprintf(OUT, "%d ", *p1);

p1++;

}

fprintf(OUT,"\n");

}

}

fclose(IN);

fclose(OUT);

}

【参考代码】

int i,j,k, max, temp, *p1, N2, *p2;

N2 = num*num;

 

max=*n;

 

for(i=0;i<N2-1;i++)

{

p1=n+i;

for(j=i, p2 = n+j; j<N2;j++){

if(*p1 > *p2){

temp = *p1;

*p1 = *p2;

*p2 = temp;

}

p2++;

}

}

 

k = N2/2;

max = *(n+N2-1);

for(i=N2-1;i>k;i--)

*(n+i)=*(n+i-1);

*(n+k)=max;

 

return ;
/*------------------------------------------------

【程序设计】Guo S.

--------------------------------------------------

题目:

完成函数void fun1(char *str),将指针str指向的字符串反转。

即:当字符串为abc123时,则将字符串变为321cba

要求: 字符串部分的处理用指针完成.

输入字符串部分,在程序的其他部分完成,无需考虑。

--------------------------------------------------

注意:部分源程序给出如下。请勿改动主函数

main和其它函数中的任何内容,仅在函

数的花括号中begin和end之间填入所编写的若干语句。

*********Begin**********和********** End **********不可删除

------------------------------------------------*/

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <stdlib.h>

#define N 128

void bky();

void fun1(char *str)

{

/**********Begin**********/

 

/********** End **********/

}

int main()

{

char str[N];

double ave;

printf("输入一个字符串: ");

scanf("%s", str);

fun1(str);

printf("%s\n",str);

bky();

return 0;

}

void bky()

{

FILE *IN,*OUT;

int i;

 

char str[N];

double ave;

IN=fopen("in.dat","r");

if(IN==NULL)

{

printf("Please Verify The Currernt Dir..it May Be Changed");

return;

}

OUT=fopen("out.dat","w");

if(OUT==NULL)

{

printf("Please Verify The Current Dir.. it May Be Changed");

return;

}

for(i=0;i<4;i++)

{

fscanf(IN,"%s", str);

fun1(str);

fprintf(OUT, "%s\n",str);

 

}

fclose(IN);

fclose(OUT);

}

【参考代码】

char temp, *p;

int len;

int i;

len =strlen(str);

p=str+len-1;

 

while(p>str){

temp = *p;

*p = *str;

*str = temp;

p--;

str++;

}

return ;
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注