C程序设计(谭浩强版)第八章课后习题

本章均被要求以指针的方法处理。

1.输入三个整数,按从小到大的顺序输出。

代码如下:

int x, y, z, t,*a,*b,*c;
	printf("请输入x,y,z的值:\n");
	scanf("%d %d %d", &x, &y, &z);
	a = &x, b = &y, c = &z;
	if (x > y) {
		t = *a; *a = *b; *b = t;
	}
	if (x > z) {
		t = *a; *a = *c; *c = t;
	}
	if (y > z) {
		t = *b; *b = *c; *c = t;
	}
	printf("从小到大排序为:\n%d %d %d", x, y, z);

效果:

C程序设计(谭浩强版)第八章课后习题_第1张图片


2. 输入三个字符串,按由小到大的顺序输出

原理和上一题大差不差

代码如下:

	char s1 [234], s2 [234], s3 [234],  t[234];
	printf("排序前:\n");
	gets(s1); gets(s2); gets(s3);
	if (strcmp(s1, s2)>0) {
		strcpy(t, s1);strcpy(s1, s2);strcpy(s2, t);
	}
	if (strcmp(s1, s3)>0) {
		strcpy(t, s1); strcpy(s1, s3); strcpy(s3, t);
	}
	if (strcmp(s2, s3)>0) {
		strcpy(t, s2); strcpy(s2, s3); strcpy(s3, t);
	}
	printf("排序后:\n");
	puts(s1);
	puts(s2);
	puts(s3);

效果:

C程序设计(谭浩强版)第八章课后习题_第2张图片


3.输入十个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。

写三个函数:1、输入十个数;2、进行处理;3、输出十个数

输入函数:

void scanf_(int* a,int n) {
	int* p;
	for (p = a; p < a + n; p++)
		scanf("%d", p);
}

处理函数:

int * deal_int(int* a) {
	int* p, * min, * max, t;
	max = min = a;
	for (p = a + 1; p < a + 10; p++)
	{
		if (*max < *p) max = p;
		else if (*min > *p) min = p;
	}
	t = a [0]; a [0] = *min; *min = t;
	if (max == a) max = min;
	t = a [9]; a [9] = *max; *max = t;
	return a;
}

输出函数:

void array_print(int* arr,int n) {
	for (int i = 0; i < n; i++) {
		printf("%4d", arr [i]);
	}
}
#include
void array_print(int* arr,int n) {
	for (int i = 0; i < n; i++) {
		printf("%4d", arr [i]);
	}
}
int * deal_int(int* a) {
	int* p, * min, * max, t;
	max = min = a;
	for (p = a + 1; p < a + 10; p++)
	{
		if (*max < *p) max = p;
		else if (*min > *p) min = p;
	}
	t = a [0]; a [0] = *min; *min = t;
	if (max == a) max = min;
	t = a [9]; a [9] = *max; *max = t;
	return a;
}
void scanf_(int* a,int n) {
	int* p;
	for (p = a; p < a + n; p++)
		scanf("%d", p);
}
int main(){
	int str [10];
	scanf_(str, 10);
	array_print(deal_int(str), 10);
return 0;
}

效果:

C程序设计(谭浩强版)第八章课后习题_第3张图片


 4.有n个整数,使前面个数顺序向后移m个位置,最后m个数变成最前面m个数。

写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数

代码如下:

#include
void string_int(int* a, int m, int n) {
	int* p, arr_end;
	for (m; m > 0; m--) {
		arr_end = *(a + n - 1);
		for (p = a + n - 1; p > a; p--)
			*p = *(p - 1);
		*a = arr_end;
	}
}
int main(){
	int len, i, m, a [234];
	printf("Enter the lenth:\n");
	scanf("%d", &len);
	for (i = 0; i < len; i++)
		scanf("%d", &a [i]);
	printf("Enter back m:\n");
	scanf("%d", &m);
	string_int(a, m, len);
	for (i = 0; i < len; i++)
		printf("%4d", a [i]);



return 0;
}

 效果:

C程序设计(谭浩强版)第八章课后习题_第4张图片

 5.有n个人围成一个圈,顺序排号。从第一个人开始报数(从1到3报数),凡是报到3的人主动退出圈子,问最后留下的是第几号的那位。

 代码如下:

	int i, k, m, n, num [245], * p;
	printf("Enter a num:\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("%d is left", *p);

效果:

C程序设计(谭浩强版)第八章课后习题_第5张图片

 6.写一函数,求一个字符串的长度。在main函数中输入字符串并输出其长度。

简单写了两种思路;

代码如下:

#include
int lenth_1(char* s) {
	char* p=s;
	while (*p) p++;
	return p - s;
}
int lenth_2(char* s) {
	int i=0;
	while (*s++) i++;
	return i;
}
int main(){
	char str [245];
	gets(str);
	printf("len=%d", lenth1(str));
return 0;
}

效果如下:

C程序设计(谭浩强版)第八章课后习题_第6张图片


 7.有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制为另一个字符串。

代码如下:

#include
void strcpy_string(char* a, int m) {
	char* q, * p;
	q = a;
	for (p = a + m-1; *p;)
		*q++ = *p++;
	*q = '\0';
}
int main(){
	int m;
	char str [234];
	gets(str);
	printf("Enter m:\n");
	scanf("%d",&m);
	strcpy_string(str, m);
	puts(str);
return 0;
}

 效果:

C程序设计(谭浩强版)第八章课后习题_第7张图片

 8.输入一行文字,找出其中大写字母,小写字母、空格、数字以及其他字符各有多少。

代码如下:

int letter = 0, Letter = 0, digi = 0, space = 0, other = 0;
	char num [20],*p;
	printf("input string num:\n");
	gets(num);
	p = num;
	while (*p != '\0') {
		if (*p >= 'A' && *p <= 'Z') Letter++;
		else if (*p >= 'a' && *p <= 'z') letter++;
		else if (*p >= '0' && *p <= '9') digi++;
		else if (*p == ' ') space++;
		else other++;
		p++;
	}
	printf("大写字母%d个 小写字母%d个 数字%d个 空格%d个 其他字符%d个\n", Letter, letter, digi, space, other);

 效果:

C程序设计(谭浩强版)第八章课后习题_第8张图片

 9.写一函数,将一个3X3的整型矩阵转置。

代码如下:

#include
void change_int(int* p) {
	int i, j, t;
	for(i=0;i<3;i++)
		for (j = i; j < 3; j++)
		{
			t = *(p + 3 * i + j);
			*(p + 3 * i + j) = *(p + 3 * j + i);
			*(p + 3 * j + i) = t;
		}
}
//输出二维数组
void double_array_print(int arr[][3], int n, int k) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < k; j++)
			printf("%4d", arr[i][j]);
		printf("\n");
	}
}
int main(){
	int i, j, k = 1, a [3][3], * p;
	for (i = 0; i < 3; i++)
		for (j = 0; j < 3; j++)
			a [i][j] = k++;
	double_array_print(a, 3, 3);
	printf("\n");
	p = a;
	change_int(p);
	double_array_print(a, 3, 3);


return 0;
}

效果:

C程序设计(谭浩强版)第八章课后习题_第9张图片


 10.在主函数中输入10个等长的字符串。用另一函数对它们进行排序。然后在主函数输出这10个已经排序好了的字符串。

代码如下:

#include
void string_change1(char(*p) [20]) {
	int i, j;
	char t [245], * k;
	k = t;
	for(i=0;i<10;i++)
		for(j=0;j<10-i-1;j++)
			if (strcmp(p [j], p [j + 1])>0) {
				strcpy(k,p[j]);
				strcpy(p[j],p[j+1]);
				strcpy(p [j + 1], k);
			}
}
int main(){
    char str [10][20], (*p) [20];
	int i;
	for (i = 0; i < 10; i++)
		scanf("%s", str [i]);
	p = str;
	string_change1(p);
	printf("\n");
	for (i = 0; i < 10; i++)
		puts(p [i]);
return 0;
}

效果:

C程序设计(谭浩强版)第八章课后习题_第10张图片


 11.用指针数组处理上一道题目,字符串不等长。

代码如下:

#include
void nihaoa(char* s[]) {
	int i, j;
	char* t;
	for (i = 0; i < 10; i++)
		for(j=0;j<10-i-1;j++)
			if (strcmp(*(s + j), *(s + j + 1)) > 0) {
				t = *(s + j);
				*(s + j) = *(s + j + 1);
				*(s + j+1)=t;
			}
}
int main(){
	char* p [10], a [10][20];
	int i;
	for (i = 0; i < 10; i++)
		p [i] = a [i];//将第i个字符串的首地址赋给指针数组p的第i个元素
	for (i = 0; i < 10; i++)
		scanf("%s", p [i]);
	nihaoa(p);
	for (i = 0; i < 10; i++)
		puts(p [i]);
return 0;
}

 效果:

C程序设计(谭浩强版)第八章课后习题_第11张图片


 12.将n个数按输入时顺序的逆序排序,用函数实现。

代码如下:

#include
int* sort_convert(int* a, int n) {
	int* q, * p, t;
	for (p = a, q = a + n - 1; p < a + n / 2; p++, q--)
	{
		t = *q; *q = *p; *p = t;
	}
	return a;
}
int main(){
	int n, i, a [256];
	printf("Enter a len:\n");
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &a [i]);
	array_print(sort_convert(a, n), n);
return 0;
}

效果:

C程序设计(谭浩强版)第八章课后习题_第12张图片


 13.写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为

int strcmp(char *p1,char *p2);

代码如下:

#include
int _strcmp(char* p1, char* p2) {
	int i = 0;
	while (*(p1 + i) == *(p2 + i))
		if (*(p1 + i++) == '\0') return 0;
	return (*(p1 + i) - *(p2 + i));
}
int main(){
	char s1 [234], s2 [234];
	gets(s1);
	gets(s2);
	printf("%d", _strcmp(s1, s2));
return 0;
}

 效果:

C程序设计(谭浩强版)第八章课后习题_第13张图片


14.编一程序,输入月份号,输出该月的英文名.

例如,输入3,则输出“March”,要求用指针数组处理。

代码如下:

int main(){
	char* p [] = { "illeaal","January","February","March","April","May","June","July","August","September","October","September","December" };
	int num;
	printf("Enter the month:\n");
	scanf("%d", &num);
	if (num > 0 && num <= 12) {
		puts(*(p + num));
	}
	else printf("Error!");
return 0;
}

效果:

C程序设计(谭浩强版)第八章课后习题_第14张图片


15.(1)编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针(地址),指向字符串开始的空间。new(n)表示分配n个字节的内存空间。

(2)写一函数(free),将前面用new函数占用的空间释放。free(p)表示将p(地址)指向的单元以后的内存段释放。

代码如下:

#define NEWSIZE 1000
char newbuf [NEWSIZE];
char* newp = newbuf;
char* new(int n) {
	if (newp + n <= newbuf + NEWSIZE) {
		newp += n;
		return (newp - n);
}
	else return NULL;
}
void free(char* p)
{
	if (p >= newbuf && p <= newbuf + NEWSIZE)
		newp = p;
}

 16.用指向指针的指针的方法对5个字符串排序并输出。

代码如下:

#include
void pointer(char* *arr) {
	char* t;
	int i, j;
	for(i=0;i<5;i++)
		for(j=0;j<5-i-1;j++)
			if (strcmp(*(arr + j), *(arr + j + 1)) > 0) {
				t = *(arr + j);
				*(arr + j) = *(arr + j + 1);
				*(arr + j + 1) = t;
			}
}
int main(){
char** p, * str [20], arr [5][20];
	int i;
	for (i = 0; i < 5; i++)
		str [i] = arr [i];
	printf("Enter 5 strings:\n");
	for (i = 0; i < 5; i++)
		scanf("%s", str [i]);
	p = str;
	pointer(p);
	for (i = 0; i < 5; i++)
		puts(p[i]);
return 0;
}

效果:

C程序设计(谭浩强版)第八章课后习题_第15张图片


 17.用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n个整数在主函数中输入,最后在主函数中输出。

代码如下:

#include
void point_sort(int** p, int n) {
	int i, j, * t;
	for(i=0;i **(p + j + 1)) {
				t = *(p + j);
				*(p + j) = *(p + j + 1);
				*(p + j + 1) = t;
			}
}
int main()[
	int i, n, arr [20], ** p, * pstr [20];
	printf("Tnput n:\n");
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		pstr [i] = &arr [i];
	printf("Enter nums:\n");
	for (i = 0; i < n; i++)
		scanf("%d", pstr [i]);
	p = pstr;
	point_sort(p,n);
	for (i = 0; i < n; i++)
		printf("%4d", *pstr [i]);
return 0;
}

 效果:

C程序设计(谭浩强版)第八章课后习题_第16张图片

 要考试了,有错误的可以评论或者私信谢谢大家!

你可能感兴趣的:(C程序设计,谭浩强版,第五版,课后习题,c语言,开发语言)