课后练习–指针

  • Post author:
  • Post category:其他


// TheChapterOfTen.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

void sort(int* arr, int n);
char* my_new(int n);
void change_english_name();
int my_strcmp(char* p1, char* p2);
void find_numbers();
void reverse();

int main()
{
	/*
	//常量指针是指向“常量”的指针,即指针本身可以指向别的对象,但是不能通过该指针修改对象
	//该对象可以通过其他的方式进行修改,它常用于函数的参数,以避免误改了实参。
	char ch = 'a', ch1 = 'x';
	const char* p = &ch;//定义常量指针
	p = &ch1;//可以指向别的对象
	//*p = 'b';//编译报错,错误,不能通过该指针修改对象

	char* p1 = &ch;
	*p1 = 'c';//不是常量指针,所以可以通过该指针修改对象
	printf("ch = %c", ch);

	char ch2 = '2';
	char* p2;
	p2 = &ch2;
	*/

	/*
	//1、
	int arr[] = { 12, 3, 44, 9, 22, 11, 30, 18 };
	int n = sizeof(arr) / sizeof(int);
	sort(arr, n);
	for (int i = 0; i < n; i++) {
		printf("%d \t", arr[i]);
	}
	*/

	/*
	//2、
	char* p = my_new(10);
	if (NULL != p) {
		char* temp = p;
		for (int i = 0; i < 10; i++) {
			if (i == 9) {
				*temp = '\0';
			}
			else {
				*temp = i + '0';
				printf("%c ", *temp);
				temp++;
			}
		}
		//字符串以'\0'结尾,否则输出有问题
		printf("\n%s\n", p);
	}
	*/

	//3、
	//change_english_name();

	//4、
	//char c1[] = "good", c2[] = "goodness";
	//printf("比较的结果:%d", my_strcmp(c1, c2));

	//5、
	//find_numbers();

	//7、
	//reverse();
}

//1、编写一个C程序,用指向指针的指针对n个整数进行排序并输出结果,
//要求将排序单独写成一个函数,n个整数在主函数中输入,最后在主函数中输出
//有点问题
void sort(int* arr , int n) {
	int* p = arr;
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < n - 1 - i; j++) {
			if (*(p + j) > *(p + j + 1)) {
				int temp = *(p + j);
				*(p + j) = *(p + j + 1);
				*(p + j + 1) = temp;
			}
		}
	}
}


//2、编写一个C程序,要求编写一个函数new,对n个字符开辟连续的存储空间,此函数
//应返回一个指向字符串开始空间的指针(地址),new(n)表示分配n个字节的内存空间
char* my_new(int n) {
	char* p;
	if (p = (char*)malloc(n)) {
		return p;
	}
	return NULL;
}


//3、编写一个C程序,输入月份,输出该月的英文名,例如;输入“3”,则输出“March”
//要求用指针数组来处理
void change_english_name() {
	char arr_month[12][10] = {"January", "February", "March", "April", "May", "June", 
		"July", "August", "September", "October", "November", "December"};

	char* month_name[12];
	//为什么这样就不行?是VS的原因吗?
	//char* month_name[] = { "January", "February", "March", "April", "May", "June",
	//	"July", "August", "September", "October", "November", "December" };
	for (int i = 0; i < 12; i++) {
		month_name[i] = arr_month[i];
	}
	char** p;
	p = month_name;

	printf("请输入月份:");
	int month;
	scanf_s("%d", &month);
	switch (month) {
		case 1: {
			printf("%s", *p);
			break;
		}
		case 2: {
			printf("%s", *(p+1));
			break;
		}
		case 3: {
			printf("%s", *(p + 2));
			break;
		}
		case 4: {
			printf("%s", *(p + 3));
			break;
		}
		case 5: {
			printf("%s", *(p + 4));
			break;
		}
		case 6: {
			printf("%s", *(p + 5));
			break;
		}
		case 7: {
			printf("%s", *(p + 6));
			break;
		}
		case 8: {
			printf("%s", *(p + 7));
			break;
		}
		case 9: {
			printf("%s", *(p + 8));
			break;
		}
		case 10: {
			printf("%s", *(p + 9));
			break;
		}
		case 11: {
			printf("%s", *(p + 10));
			break;
		}
		case 12: {
			printf("%s", *(p + 11));
			break;
		}
	}
}

//4、编写一个C程序,实现两个字符串的比较,即自己写一个strcmp函数,
//原型为:int strcmp(char* p1, char* p2);
int my_strcmp(char* p1, char* p2) {
	while (1) {
		//相等
		if (*p1 == '\0' && *p2 == '\0') {
			return 0;
		}

		//不相等
		int result = *p1 - *p2;
		if (result != 0) {
			return result;
		}
		p1++;
		p2++;
	}
}

//5、输入一个字符串,它应有数字和非数字字符,例如:a123x456 128379? sala32412lhjhl132
//编写一个C程序,将其中连续的数字作为一个整数,并依次存放到数组a中,例如:123存入a[0]中,
//456存入a[1]中,统计共有多少个整数,并输出这些整数。
void find_numbers() {
	printf("请输入一个字符串:");
	char c[100];
	gets_s(c);
	printf("str = %s\n", c);
	char* p = c;
	int arr[10];
	int* p_arr = arr;
	int num = 0;
	int count_num = 0;
	while (*p != '\0') {
		if (*p >= '0' && *p <= '9') {
			num = num * 10 + *p - 48;
		}
		else if(num != 0){
			*(p_arr + count_num) = num;
			num = 0;
			count_num++;
		}
		p++;
	}

	//考虑字符串以数字结尾的情况,例如a123b456c789
	if (num != 0) {
		*(p_arr + count_num) = num;
		num = 0;
		count_num++;
	}
	printf("字符串中有%d个整数\n", count_num);
	for (int i = 0; i < count_num; i++) {
		printf("%d\t", *(p_arr+i));
	}
}

//6、一个班有4个学生,5门课程,编写一个C程序,实现如下3个功能:
//(1)、求第一门课程的平均分
//(2)、找出有两门以上课程不及格的学生,输出他们的学号和全部课程的成绩及平均成绩
//(3)、找出平均成绩在90分以上或者全部课程成绩在85分以上的学生
void stu_score() {
	//没多大意义,不写了
}

//7、编写一个C程序,将n个数按输入时的逆序来排列
void reverse() {
	printf("请输入10个数:");
	int arr[10];
	int* p = arr;
	for (int i = 0; i < 10; i++) {
		scanf_s("%d", p + i);
	}
	
	for (int i = 0; i < 5; i++) {
		int temp = *(p + i);
		*(p + i) = *(p + 9 - i);
		*(p + 9 - i) = temp;
	}

	for (int i = 0; i < 10; i++) {
		printf("%d\t", *(p+i));
	}
}



版权声明:本文为weixin_40602639原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。