當前位置:首頁 > IT技術 > 編程語言 > 正文

浙大版《C語言程序設計》第四版(何欽銘顏暉) 第11章 指針進階 課后習題答案
2022-05-11 10:55:33

你也可以上程序咖(https://meta.chengxuka.com),打開大學幕題板塊,不但有答案,講解,還可以在線答題。

WX20220412-135428@2x

一、選擇題

1.下面程序段的運行結果是( )。

int x[5] = {2, 4, 6, 8, 10}, *p, **pp;
p = x;
pp = &p;
printf("%d", *(p++));
printf("%d
", **pp);

A.4 4

B.2 4

C.2 2

D.4 6

答:B

解析:

題目中先定義了 int 類型的數(shù)組 x,又定義兩個指針。

然后 p = x,表示將 x 的基地址賦值給 p,所以 p 指向數(shù)組中第一個元素。

第一次打印 *(p++),獲取 p 指向的元素,打印 2, 然后指針位置向后移動一個位置。

因為 pp = &p,表示將 p 的地址賦值給 pp,所以 pp 指向 p,p 經(jīng)過上次打印時的 ++,已經(jīng)向后一定一個,所以第二個打印 **pp,打印的就是 4。

2.對于以下變量定義,正確的賦值是( )。

int *p[3], a[3];

A. p=a

B. *p=a[0]

C. p=&a[0]

D. p[0]=&a[0]

答:B

解析:

定義為int *p[3],a[3];
可知這里 p 是一個指針數(shù)組,p 為數(shù)組名,所以不能作為賦值號的左操作數(shù),所以選項 A 和 C 不對
*p 即 p[0],所以選項 B 等效于 p[0]=a,如上所說,數(shù)組 p 的元素是指針,所以選項 D 是不合適的

3.下列程序段的輸出是( )。

int i, a[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p[4];
for (i = 0; i < 4; i++)
{
	p[i] = &a[i * 3];
}
printf("%d
", p[3][2]);

A.12

B.8

C.6

D.上述程序有錯誤

答:A

解析:

題目中定義了一維數(shù)組 a[12],以及一個指針數(shù)組 p。

當 i=0 時,第一次循環(huán):p[0]=&a[0] ,p[0] 指向 a[0]

當 i=1 時,第二次循環(huán):p[1]=&a[3] ,p[1] 指向 a[3]

當 i=2 時,第三次循環(huán):p[2]=&a[6] ,p[2] 指向 a[6]

當 i=3 時,第四次循環(huán):p[3]=&a[9] ,p[3] 指向 a[9]

當 i=4 時,循環(huán)結束。

p[3][2],相當于 p[3]+2,因為 p[3] 指向 a[9] ,所以 p[3][2] 指向 a[11],a[11] 所對應的值是 12 ,所以輸出12。

4.設有如下定義的鏈表,則值為 7 的表達式是( )。

struct st
{
  int n;
  struct st *next;
} a[3] = {5, &a[1], 7, &a[2], 9, NULL}, *p = a;

A. p->n

B. (p->n)++

C. p->next->n

D. ++p->n

答:C

解析:

題目中 *p=a,表示指針 p 指向 a 的基地址。

選項 A,打印數(shù)組 a 中第一個元素的 n 的值,輸出 5。

選項 B,也是打印 5。因為是后加。

選項 C,p 指向 a 的基地址,默認第一個元素, p->next,表示它的下一個元素,就是 7 和 &a[2],打印它的 n,就是 7。

選項 D,因為 -> 的優(yōu)先級高于 ++,所以這里取 p -> n,數(shù)組中第一個元素的 n ,為 5,前置++,所以打印 6。

5.下面程序段輸入一行字符,按輸入的逆序建立一個鏈表。

struct node
	{
		char info;
		struct node *link;

	} * top, *p;
	char c;
	top = NULL;
	while ((c = getchar()) != '
')
	{
		p = (struct node *)malloc(sizeof(struct node));
		p->info = c;
		___________;
		top = p;
	}

A. top->link=p

B. p->link= top

C. top=p->link

D. p=top->link

答:B

解析:

因為要逆序建立鏈表,所以讓 p->link 賦值為 top,然后 top賦值為 p。

二、填空題

1.下面程序段的輸出結果是( )。

const char *s[3] = {"point", "continue", "break"};
	for (int i = 2; i >= 0; i--)
		for (int j = 2; j > i; j--)
			printf("%s
", s[i] + j);

答:

ntinue

int

oint

解析:

這里是兩層循環(huán)嵌套,

i=2時,j=2時,內(nèi)層循環(huán)條件不滿足。

i=1時,j=2時,打印 s[i]+j ,就是 s[1]+2,對應continue,但是因為要加 2,所以從下標為 2 的字符開始,就是 ntinue。

? j=1時,內(nèi)層循環(huán)條件不滿足。

i=0時,j=2時,打印 s[i]+j ,就是 s[0]+2,對應point,但是因為要加 2,所以從下標為 2 的字符開始,就是 int。

? j=1時,打印 s[i]+j ,就是 s[0]+1,對應point,但是因為要加 2,所以從下標為 2 的字符開始,就是o int。

2.下面程序段的輸出結果是( )。

const char *st[] = {"Hello", "world", "!"}, **p = st;
p++;
printf("%s-%c
", *p, **p);
(*p)++;
printf("%s-%c-%c
", *p, **p, (**p) + 1);

答:

world-w

orld-o-p

解析:

首先定義了指針數(shù)組 st,存儲的是 3 個字符串的地址。然后又定義了二級指針變量 p,這里 p 存儲的是 st 的基地址。

然后 p++,那么指向了里面的第二個字符串的地址。*p 打印該字符串。world,**p,打印字符 w。

然后 (*p)++,那么指針向后移動一位,從 o 開始,打印 orld,**p 打印 o, (**p) + 1 先取 **p 就是 o 然后再加 1,就是 p。

3.下面程序段的輸出結果是( )。

static int a[4][4];
int *p[4], i, j;
for (i = 0; i < 4; i++)
  p[i] = &a[i][0];
for (i = 0; i < 4; i++)
{
  *(p[i] + i) = 1;
  *(p[i] + 4 - (i + 1)) = 1;
}
for (i = 0; i < 4; i++)
{
  for (j = 0; j < 4; j++)
    printf("%2d", p[i][j]);
  printf("
");
}

答:

1 0 0 1

0 1 1 0

0 1 1 0

1 0 0 1

解析:

首先定義了一個 4X4 的矩陣,默認都是 0 。

0 0 0 0

0 0 0 0

0 0 0 0

0 0 0 0

然后又定義了一個指針數(shù)組 p。

第一個 for 循環(huán)中:p[0] 存儲 a[0][0] 的地址。p[1] 存儲 a[1][0] 的地址。p[2] 存儲 a[2][0] 的地址。p[3] 存儲 a[3][0] 的地址。

第二個 for 循環(huán)中:

i = 0 時,

*(p[i] + i) = 1 ,表示 *(p[0]+0) ,表示 第一行第一個元素修改值為 1。
*(p[i] + 4 - (i + 1)) = 1 ,表示 *(p[0]+3) , 表示第一行第四個元素修改值為 1。

i = 1 時,

*(p[i] + i) = 1 ,表示 *(p[1]+1) ,表示 第二行第二個元素修改值為 1。
*(p[i] + 4 - (i + 1)) = 1 ,表示 *(p[1]+2) , 表示第二行第三個元素修改值為 1。

i = 2 時,

*(p[i] + i) = 1 ,表示 *(p[2]+2) ,表示 第三行第三個元素修改值為 1。
*(p[i] + 4 - (i + 1)) = 1 ,表示 *(p[2]+2) , 表示第三行第二個元素修改值為 1。

i = 3 時,

*(p[i] + i) = 1 ,表示 *(p[3]+3) ,表示 第四行第四個元素修改值為 1。
*(p[i] + 4 - (i + 1)) = 1 ,表示 *(p[3]+0) , 表示第四行第一個元素修改值為 1。

第三個 for 循環(huán),打印這個矩陣,所以最終結果為:

1 0 0 1

0 1 1 0

0 1 1 0

1 0 0 1

4.找出最小字符串。輸出多個字符串中最小的字符串。請?zhí)羁铡?/p>

	const char *st[] = {"bag", "good", "This", "are", "zoo", "park"};
	const char *smin = _________;
	for (int i = 1; i < 6; i++)
		if (_________ < 0)
			smin = st[i];
	printf("The min string is %s 
",_________ );

答:

*st

strcmp(st[i], smin)

smin

解析:

首先定義了一個字符指針數(shù)組,想找到里面的最小字符串,首先取第一個字符串賦值給 smin,所以 *smin = *st,然后循環(huán)中依次比較字符串大小,strcmp(st[i], smin) <0 ,那么就取 st[i] 賦給 smin,循環(huán)結束后打印 smin 即可。

5.查找最高分。輸入 n(n<=10)個成績,查找最高分并輸出。請?zhí)羁铡?/p>

#include <stdio.h>
int *GetMax(int score[], int n);
int main(void)
{
	int i, n, score[10], *p;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &score[i]);
	p = _____________;
	printf("Max:%d
", *p);
	return 0;
}
int *GetMax(int score[], int n)
{
	int i, temp, pos = 0;
	temp = score[0];
	for (i = 0; i < n; i++)
		if (score[i] > temp)
		{
			temp = score[i];
			pos = i;
		}
	return _____________;
}

答:

GetMax(score, n)

score + pos 或者 &score[pos]

解析:

就是定義一個函數(shù),找到數(shù)組中的最大值,返回它的地址。所以第一個空調(diào)用函數(shù),參數(shù)傳入數(shù)組和 n 的值。第二個空,就是函數(shù)中返回結果。數(shù)組的本質(zhì)就是存儲數(shù)組的基地址,加上 pos 即可。

6.輸出鏈表中不及格學生的學號和成績。已建立學生"英語"課程的成績鏈表(成績存于 score 域中,學號存于 num 域中),下列函數(shù)的功能是輸出不及格學生的學號和成績。請?zhí)羁铡?/p>


void require(struct student *head)
{
	struct student *p;
	if (head != NULL)
	{
		____________;
		while (p != NULL)
		{
			if (____________)
				printf("%d%.1f
", p->num, p->score);
			p = p->next;
		}
	}
}

答:

p = head

p->score < 60

解析:

第一個空將 head 賦值給 p,第二個空判斷成績是否及格。

三、程序設計題

題目1:輸出月份英文名:輸入月份,輸出對應的英文名稱。要求用指針數(shù)組表示 12 個月的英文名稱。例如,輸入 5 ,輸出 May。試編寫相應程序。

答案代碼:

#include <stdio.h>

char *getmonth(int n);
int main()
{
	// 習題(11.3.1)
	/*
	輸出月份英文名:輸入月份,輸出對應的英文名稱。要求用指針數(shù)組表示 12 個月的英文名稱。例如,輸入 5 ,輸出 May。試編寫相應程序。
	*/

	char *p;
	int n;
	printf("input n:");
	scanf("%d", &n);
	p = getmonth(n);
	if (p == NULL)
		printf("wrong input!
");
	else
		printf("%s
", p);

	return 0;
}

char *getmonth(int n)
{
	int month;
	char *a[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November"};
	if (n > 0 && n < 13)
	{
		switch (n)
		{
		case 1:
			month = 1;
			break;
		case 2:
			month = 2;
			break;
		case 3:
			month = 3;
			break;
		case 4:
			month = 4;
			break;
		case 5:
			month = 5;
			break;
		case 6:
			month = 6;
			break;
		case 7:
			month = 7;
			break;
		case 8:
			month = 8;
			break;
		case 9:
			month = 9;
			break;
		case 10:
			month = 10;
			break;
		case 11:
			month = 11;
			break;
		case 12:
			month = 12;
			break;
		}
		return a[--month];
	}
	else
		return 0;
}

運行結果:

WX20220415-162412@2x

題目2:查找星期:定義一個指針數(shù)組,將下表的星期信息組織起來,輸入一個字符串,在表中查找,若存在,輸出該字符串在表中的序號,否則輸出 -1。試編寫相應程序。

序號 星期
0 Sunday
1 Monday
2 Tuesday
3 Wednesday
4 Thurday
5 Friday
6 Saturday

答案代碼:

#include <stdio.h>
#include <string.h>
int main()
{
	// 習題(11.3.2)
	/*
	查找星期:定義一個指針數(shù)組,將下表的星期信息組織起來,輸入一個字符串,在表中查找,若存在,輸出該字符串在表中的序號,否則輸出 -1。試編寫相應程序。
	*/

	char *p[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
	char s[10];
	printf("input string:");
	scanf("%s", s);
	int i = 0, j = -2;
	for (i = 0; i < 7; i++)
	{
		if (!strcmp(p[i], s))
		{
			j = i;
			break;
		}
	}
	printf("%d
", j);
  return 0;
}

運行結果:

WX20220415-163013@2x

題目3:計算最長的字符串長度:輸入 n(n<10)個字符串,輸出其中最長字符串的有效長度。要求自定義函數(shù) int max_ len(char *s[], int n),用于計算有 n 個無素的指針數(shù)組 s 中最長的字符串的長度。試編寫相應程序。

答案代碼:

#include <stdio.h>
#include <string.h>
int max_len(char *s[], int n);
int main()
{
	// 習題(11.3.3)
	/*
	計算最長的字符串長度:輸入 n(n<10)個字符串,輸出其中最長字符串的有效長度。要求自定義函數(shù) int max_ len(char *s[ ],int n),用于計算有 n 個無素的指針數(shù)組 s 中最長的字符串的長度。試編寫相應程序。
	*/

	int i, n;
	char *s[10];
	char a[10][10];
	printf("input n(n<10):");
	scanf("%d", &n);
	printf("input %d  string :
", n);
	for (i = 0; i < n; i++)
	{
		scanf("%s", a[i]);
		s[i] = a[i];
	}
	printf("%d
", max_len(s, n));
	return 0;
}

int max_len(char *s[], int n)
{
	int i, j = 0;
	for (i = 0; i < n; i++)
	{
		if (strlen(s[i]) > strlen(s[j]))
		{
			j = i;
		}
	}
	return strlen(s[j]);
}

運行結果:

WX20220415-163731@2x

題目4:字符串的連接:輸入兩個字符串,輸出連接后的字符串。要求自定義函數(shù) char *streat(char *s, char *t), 將字符串 t 復制到字符串 s 的末端,并且返回字符串 s 的首地址。試編寫相應程序。

答案代碼:

#include <stdio.h>

char *streat(char *s, char *t);
int main()
{
	// 習題(11.3.4)
	/*
	字符串的連接:輸入兩個字符串,輸出連接后的字符串。要求自定義函數(shù) char *streat(char *s, char *t), 將字符串 t 復制到字符串 s 的末端,并且返回字符串 s 的首地址。
	*/

	char s[80], t[80];
	printf("input 1 string s:");
	gets(s);
	printf("input 2 string t:");
	gets(t);

	printf("%s
", streat(s, t));
	return 0;
}

char *streat(char *s, char *t)
{
	int i = 0;
	int j = 0;
	while (s[i] != '