bupt c++ 上机(4)

指针。

搞不太懂。混过来了。QAQ

问题 A: VC++实验6.1 求最大值

题目描述

编写相应的程序用指针实现:从键盘输入3个整型数va、vb、vc,通过一个指向整型的指针iptr,输出3个数中的最大值。

输入

1 2 3

输出

3

#include 
using namespace std;
int main() {
	int a, b, c;
	cin >> a >> b >> c;
	int *iptr = NULL;
	if (a >= b) 
		if (a > c) iptr = &a;
		else iptr = &c;
	if (a < b) 
		if (b > c) iptr = &b;
		else iptr = &c;
	cout << *iptr << endl;
	return 0;
}

问题 B: VC++实验6.2 求平均值

题目描述

编写一个函数get_average()获取整型数组元素的平均值。要求这个函数既可以用来求一维数组元素的平均值,也可以求二维数组元素的平均值。在main()函数中通过具体的一维数组Array_1D和二维数组Array_2D测试这个函数。假定一维数组为a[5],二维数组为b[2][3],一维数组和二维数组的变量值由键盘分别输入,在屏幕上输出一维数组和二维数组的平均值,平均值间用一个空格分开。

输入

1 2 3 4 5

1 2 3 4 5 6

输出

3 3.5

 

#include 
using namespace std;
int main() {
	int a[5] = {0};
	int b[2][3] = {0};
	for (int i = 0; i < 5; i++) 
		cin >> a[i];
	for (int i = 0; i < 2; i++)
		for (int j = 0; j < 3; j++)
			cin >> b[i][j];
	int num1(0), num2(0);
	int *p1 = a, (*p2)[3];
	p2 = b;
	for (int i = 0; i < 5; i++) 
		num1 += *(p1 + i);
	for (int i = 0; i < 6; i++) 
		num2 += *(*p2 + i);
	float aver1 = (float)num1 / 5;
	float aver2 = (float)num2 / 6;
	cout << aver1 << " " << aver2 << endl;
	return 0;
}

问题 C: VC++实验6.3 字符串变量的交换

题目描述

编制程序,调用指针作为参数的函数,实现下面两字符串变量的交换。 char* ap="hello"; char* bp="how are you"; 交换的结果为:ap 指向"how are you",bp 指向"hello"。 (注意:输出语句中的;和.为英文符号)

输入

输出

ap指向how are you;

bp指向hello.

#include 
using namespace std;
int main() {
	char *ap = "hello.";
	char *bp = "how are you;";
	char *t = NULL;
	t = ap; ap = bp; bp = t;
	cout << "ap指向" << ap << endl;
	cout << "bp指向" << bp << endl;
}

问题 D: VC++实验6.4 动态申请数组

题目描述

动态申请一个一维整型数组,要求用户从键盘输入元素个数,采用new运算符分配空间,从键盘输入数组变量的值.写一个函数void Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序(升序)。将排序后的数组变量的值输出到屏幕上,各数值间用一个空格隔开。

输入

10 1 2 3 4 5 0 7 8 0 10

输出

1 2 3 4 5 7 8 10 0 0

#include 
using namespace std;
int n; 

bool compare(int a, int b) {
	if (!a) return 1;
	if (!b) return 0;
	return a > b;
}

int main() {
	cin >> n;
	int *p = NULL;
	p = new int[n];
	int *pos = p, *pp = p;
	for (int i = 0; i < n; i++) {
		int k; cin >> k;
		*pos = k; pos++;
	}
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n - i - 1; j++) {
			if (compare(*(pp + j), *(pp + j + 1))) {
				int t = *(pp + j);
				*(pp + j) = *(pp + j + 1);
				*(pp + j + 1) = t;
			} 
		}
	for (int i = 0; i < n - 1; i++) 
		cout << *(p + i) << " ";
	cout << *(p + n - 1);
	delete [] p;
	return 0;
}

问题 E: VC++实验6.5 字符指针数组

题目描述

用字符指针数组,将给定的5个字符串(可以是任意5个国家名字)进行排序并输出。

输入

China American France Spain Greece

输出

American

China

France

Greece

Spain

#include 
#include 
using namespace std;
int main() {
	char *name[5];
	char a[5][100];
	for (int i = 0; i < 5; i++)
		cin >> a[i];
	for (int i = 0; i < 5; i++)
		name[i] = a[i];
	for (int i = 0; i < 5; i++)
		for (int j = 0; j < 4 - i; j++) {
			if (strcmp(name[j], name[j + 1]) > 0) {
				char *t = name[j];
				name[j] = name[j + 1];
				name[j + 1] = t;
			}
		}
	for (int i = 0; i < 5; i++)
		cout << name[i] << endl;
	return 0;
}

问题 F: VC++实验6.6 结构体和指针

题目描述

已知有3名学生及五门课程的成绩,要求根据学生的各科平均分排序(降序),并输出学生的所有信息和平均分(用指针数组完成)。

输入

Jane 90 80 75 60 85

Mark 85 78 98 85 86

Lily 56 65 75 68 80

输出

Mark 85 78 98 85 86 86.4

Jane 90 80 75 60 85 78

Lily 56 65 75 68 80 68.8

#include 
using namespace std;
struct student {
	char name[10];
	int score[5];
	float aver;
} ;

student a[3];

int main() {
	for (int i = 0; i < 3; i++) {
		cin >> a[i].name;
		float num = 0;
		for (int j = 0; j < 5; j++) {
			cin >> a[i].score[j];
			num += (float)a[i].score[j];
		}
		a[i].aver = num / 5;
	}
	student *p[3];
	for (int i = 0; i < 3; i++)
		p[i] = &a[i];
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 2 - i; j++) {
			if (p[j] -> aver < p[j + 1] -> aver) {
				student *temp;
				temp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = temp;
			}
		}
	for (int i = 0; i < 3; i++) {
		cout << p[i] -> name << " ";
		for (int j = 0; j < 5; j++)
			cout << p[i] -> score[j] << " ";
		cout << p[i] -> aver << endl;
	}
	return 0;
}

问题 G: VC++实验6.7 数组合并

题目描述

将两个数组a和b合并,合并后的数组按升序输出。 说明:1)数组a和b的大小和元素的值从键盘输入;先输入数组大小,再输入数组的值; 2)合并后的数组输出时,各数值间以空格分开。

输入

2 1 2

4 1 2 3 4

输出

1 1 2 2 3 4

emmm, 这题还是用水方法吧。

//这个不会要用。。还是水吧
#include 
using namespace std;
int n, n2;
int main() {
	cin >> n;
	int *p = new int[100];
	int *p1 = p;
	int *p2 = p;
	for (int i = 0; i < n; i++) {
		int k; cin >> k;
		*p1 = k; p1++;
	}
	cin >> n2;
	for (int j = 0; j < n2; j++) {
		int k; cin >> k;
		*p1 = k; p1++;
	}
	for (int i = 0; i < n + n2; i++)
		for (int j = 0; j < n + n2 - i - 1; j++) {
			if (*(p2 +j) > *(p2 + j + 1)) {
				int t = *(p2 + j);
				*(p2 + j) = *(p2 + j + 1);
				*(p2 + j + 1) = t;
			}
		}
	for (int i = 0; i < n + n2 - 1; i++)
		cout << *(p + i) << " ";
	cout << *(p + n + n2 - 1) << endl;
	delete [] p;
	return 0;
}

问题 H: VC++实验6.8 数据插入

题目描述

请编写函数实现将一个数值插入到数组中适当的位置,使新数组按降序排列,并将插入的位置输出到屏幕上。 说明:1)原数组大小和数值由键盘输入,动态创建数组; 2)插入的数值由键盘输入。

3)如果插入数据与原数组中某数据相同,则插在该数据之前。

输入

10 1 4 5 2 3 6 7 8 10 9

11

输出

1

一开始错了,发现如果比所有的都小我的循环完了pos仍然为0

#include  
using namespace std;
int flag = 0;
int main() {
	int n, ins;
	cin >> n;
	int *p = new int[1000];
	int *p1 = p;
	int *p2 = p;
	for (int i = 0; i < n; i++) {
		int k; cin >> k;
		*p1 = k; p1++;

	} cin >> ins;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n - i - 1; j++) {
			if (*(p2 +j) < *(p2 + j + 1)) {
				int t = *(p2 + j);
				*(p2 + j) = *(p2 + j + 1);
				*(p2 + j + 1) = t;
			}
		}
	int pos = 0;
	for (int i = 0; i < n; i++) 
		if (*(p + i) <= ins) {
			pos = i;
			flag = 1;
			break;
		}
	if (!flag) pos = n;
	for (int i = n; i > pos; i--)
		*(p + i) = *(p + i - 1);
	*(p + pos) = ins;
	// for (int i = 0; i <= n; i++)
	// 	cout << *(p + i) << endl;
	cout << pos + 1 << endl;
	delete [] p;
	return 0;
}

 

你可能感兴趣的:(code)