华科C++期末考复习自用

数据类型

1.将小写字母换成大写字母

#include <iostream>
using namespace std;
void main()
{
	char c1,c2;
	cin >> c1;
	c2 = c1 - 'a' + 'A';
	cout << c2 << endl;
	return;
}

 

2.指针变量、取地址运算符&、指针运算符*的理解

#include <iostream>
using namespace std;
void main()
{
	int a=100;
	int * pointer_a;
	pointer_a = &a;
	cout << a << endl;//100
	cout << pointer_a << endl;//00000030CCBCFC64
	cout << *pointer_a << endl;//100
	return;
}

 

分支

1.常见的是判断三角形的类型,但是用海伦公式算三角形面积:

#include<cmath>
s=(d1+d2+d3)/2;
area=sqrt((s-d1)*(s-d2)*(s-d3));

比较简单,选择题注意一下switch语句就好了

 

循环

1.正整数m分解为质因数之积

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int m, k, c = 0;
	cin >> m;
	k = 2;
	cout << m << '=';
	while (m != 1)
	{
		while (m % k == 0)
		{
			m /= k;
			c++;
			if (c > 1)
				cout << '*';
			cout << k;
		}
		k++;
	}
	cout << endl;
	return 0;
}

 

2.用迭代法求a的平方根的近似值(取精度为1e-5,用库函数fabs求表达式的绝对值)

#include<iostream> 
#include<cmath>
using namespace std;
int main()
{
	double x0, x1, a;
	cin >> a;
	x1 = a / 2;
	do
	{
		x0 = x1;
		x1 = (x0 + a / x0) / 2;
	} while (fabs(x1 - x0) >= 1e-5);
	cout << x1 << endl;
	return 0;
}

 

3.判断素数(使用标志变量)

#include<iostream> 
#include<cmath>
using namespace std;
int main()
{
	int m, i, flag = 0;
	cin >> m;
	int n = sqrt(m);
	for(i=2;i<=n;i++)
		if (m % i == 0)
		{
			flag = 1;
			break;
		}
	if (flag == 0)
		cout << m << "是素数" << endl;
	else
		cout << m << "不是素数" << endl;
	return 0;
}

 

4.求n之内的所有完全数//该数恰好等于它的所有因子和,如:6=1+2+3

#include<iostream> 
using namespace std;
int main()
{
	int n;
	cin >> n;
	int a, sum_yz,m=0,p=0;
	int yz[10];
	for (a = 1; a < n; a++)
	{
		sum_yz = 0;
		for (int i = 1; i < a; i++)
		{
			if (a % i == 0)
				sum_yz += i;
		}
		if (a == sum_yz)
			cout << a << endl;
	}
	return 0;
}

 

一维数组

1.求10个0~100之间随机数中的最大值和最小值及下标(用rand()生成随机数)

#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
	int arr[10];
	int i, max, min, submax, submin;
	for (i = 0; i < 10; i++)
		arr[i] = rand() % 100;
	for (i = 0; i < 10; i++)
		cout << arr[i] << ' ';
	cout << endl;
	max = min = arr[0];
	submax = submin = 0;
	for (i = 0; i < 10; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
			submax = i;
		}
		if (arr[i] < min)
		{
			min = arr[i];
			submin = i;
		}
	}
	cout << "最大值是" << max << ",下标是" << submax << endl;
	cout << "最小值是" << min << ",下标是" << submin << endl;
	return 0;
}

 

2.判断回文数(剥离各位数字)

#include<iostream>
using namespace std;
int main()
{
	int arr[10];
	int num, renum=0;
	int i = 0, j, n;
	cin >> num;
	n = num;
	do
	{
		arr[i] = n % 10;
		n /= 10;
		i++;
	} while (n > 0);
	for (j = 0; j < i; j++)
		renum = renum * 10 + arr[j];
	if (num == renum)
		cout << num << "是回文数" << endl;
	else
		cout << num << "不是回文数" << endl;
	return 0;
}

 

3.矩阵转置和矩阵相乘

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
	int m1[3][6];
	int m2[3][4];
	int rem1[6][3], mul[6][4];
	int i, j, k;
	cout << "m1:" << endl;
	for (i = 0; i < 3; i++)
		for (j = 0; j < 6; j++)
			cin >> m1[i][j];
	cout << "m2:" << endl;
	for (i = 0; i < 3; i++)
		for (j = 0; j < 4; j++)
			cin >> m2[i][j];

	for (i = 0; i < 3; i++)
		for (j = 0; j < 6; j++)
			rem1[j][i] = m1[i][j];
	for (i = 0; i < 6; i++)
	{
		for (j = 0; j < 4; j++)
		{
			mul[i][j] = 0;
			for (k = 0; k < 3; k++)
				mul[i][j] += rem1[i][k] * m2[k][j];
		}
	}
	cout << "rem1:" << endl;
	for (i = 0; i < 6; i++)
	{
		for (j = 0; j < 3; j++)
			cout << setw(5) << rem1[i][j];
		cout << endl;
	}
	cout << "mul:" << endl;
	for (i = 0; i < 6; i++)
	{
		for (j = 0; j < 4; j++)
			cout << setw(5) << mul[i][j];
		cout << endl;
	}
	return 0;
}

 

函数

1.给出一个不包含识别码的 ISBN 号码(前 11 位),计算其识别码,并输出完整的 ISBN 号码。

      每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 位数字、1 位识别码和 3 位分隔符,其规定格式如:“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),  最后一位是识别码,例如“0-670-82162-4”就是一个标准的 ISBN 码。

      ISBN 码的首位数字表示书籍的出版语言,例如,符号“0”代表英语;第一个分隔符“-”之后的三位数字代表出版社,第二个分隔符后的五位数字“82162”代表该书在该出版社的编号;最后一位识别码的计算方法:

      1、第 1 位数字乘以 1,加上第 2 位数字乘以 2,再加上第 3 位数字乘以 3,……,以此类推;

      2、再把所得结果对 11 求余,所得的余数即为识别码,如果余数为 10,则识别码为大写字母 X。

  主函数如下所示,请编写函数ISBN( ),完善程序。

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

    char charISBN11[12], charISBN13[14];

    cin>>charISBN11;

    ISBN(charISBN13,charISBN11);

    cout<<charISBN13<<endl;

    return 0;

}

#include <iostream>
#include <string>
using namespace std;
void ISBN(char* isbn13, char* isbn11)
{
    for (int i = 0; i < 11; i++) {
        isbn13[i] = isbn11[i];
    }
    isbn13[11] = '-';
    int iden = 0;
    for (int i = 0, j = 1; i < 11; i++) {
        if (isbn13[i] >= '0' && isbn13[i] <= '9') {
            iden += (int)(isbn13[i] - '0') * j;
            j++;
        }
    }
    iden = iden % 11;
    if (iden < 10)
        isbn13[12] = iden + '0';
    else isbn13[12] = 'X';
    isbn13[13] = '\0';
    return ;
}
int main()
{
    char charISBN11[12], charISBN13[14];
    cin >> charISBN11;
    ISBN(charISBN13, charISBN11);
    cout << charISBN13 << endl;
    return 0;
}

 

2.输入一段英文句子(不包含标点符号),求其中最长的一个单词(如果有多个相同长度的最长单词,以最左边的为准),并输出该单词。 

主函数已给出,请编写函数longest(  ),完善程序。

#include <iostream>

using namespace std;

int main()

{

     char c1[1000];

     char c2[100];

     cin.getline(c1,1000);

     longest(c1,c2);

     cout<<c2<<endl;

     return 0;

}

#include <iostream>
using namespace std;
void longest(char* p1, char* p2)
{
	int len[999] = { 0 }, i = 0;
	char* signal[999] = { 0 }, * point = p1;
	while (1)
	{
		if (*point == '\0')
		{
			signal[i] = point;
			if (i >= 1)
			{
				len[i] = signal[i] - signal[i - 1];
			}
			i++;
			break;
		}
		if (*point == ' ')
		{
			signal[i] = point;
			if (i >= 1)
			{
				len[i] = signal[i] - signal[i - 1];
			}
			i++;
		}
		point++;
	}
	len[0] = signal[0] - p1;
	int max = len[0];
	int	flag = 0 ;
	for (int j = 0; j <= i; j++)
	{
		if (max < len[j])
		{
			max = len[j];
			flag = j;
		}
	}
	int k = 0;
	if (flag == 0)
	{
		for (char* p = p1; p < signal[0]; p++)
		{
			p2[k] = *p;
			k++;
		}
		p2[k] = '\0';
	}
	else
	{
		for (char* p = signal[flag - 1] + 1; p < signal[flag]; p++)
		{
			p2[k] = *p;
			k++;
		}
		p2[k] = '\0';
	}
}

int main()
{
	char c1[1000];
	char c2[100];
	cin.getline(c1, 1000);
	longest(c1, c2);
	cout << c2 << endl;
	return 0;
}

 

3.输入6个不等长字符串,将这6个字符串按照字符串长度排序,并按从长到短的顺序输出字符串(Visual Studio提供的C++编译器里,字符串复制函数名是strcpy_s,用strcpy会被警告,冒泡排序

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	char str[6][45] = { '\0' }, a[45] = { '\0' };
	int i;
	for (i = 0; i < 6; i++)
	{
		cin >> str[i];
	}
	for (int j = 0; j < 5; j++)
		for (i = 0; i < 5; i++)
		{
			if (strlen(str[i]) < strlen(str[i + 1]))
			{
				strcpy(a, str[i]);
				strcpy(str[i], str[i + 1]);
				strcpy(str[i + 1], a);
			}
		}
	for (i = 0; i < 6; i++)
	{
		cout << str[i] << endl;
	}
	return 0;
}

4.输入4个字符串,按字母表顺序排序输出(中文看拼音✔,选择排序

#include <iostream>
#include <string>
using namespace std;
int main()
{
	const int max = 20;
	char name[4][ max ];
	int i,j;
	for (i = 0; i < 4; i++)
		cin >> name[i];
	char str[max];
	for(i=0;i<3;i++)
		for (j = i + 1; j < 4; j++)
		{
			if (strcmp(name[i], name[j]) > 0)
			{
				strcpy(str, name[i]);
				strcpy(name[i], name[j]);
				strcpy(name[j],str);
			}
		}
	cout << "排序后" << endl;
	for (i = 0; i < 4; i++)
		cout << name[i] << endl;
	return 0;
}

5.输入母串s和子串sz,计子串在母串中出现的次数(还可以根据次数是否为0,判断sz是否为s的子串,子串在母串开始的位置也可由i得到)

#include <iostream>
#include <string>
using namespace std;
int str(char* sz, char* s)
{
	int c = 0;
	int i=0, j;
	while (s[i] != '\0')
	{
		for (j = 0; sz[j] !='\0'; j++)
			if (s[i + j] != sz[j]) break;
		if (sz[j] == '\0')
		{
			c++; i += j;
		}
		else i++;
	}
	return c;
}
int main()
{
	char s[100], sz[100];
	cout << "输入母串:";
	cin.getline(s, 99);
	cout << "输入子串:";
	cin.getline(sz, 99);
	cout << "子串在母串中出现" << str(sz, s) << "次" << endl;
	return 0;
}

5.插入一个数据到一个有序的一维数组中,要求插入后,该数组保持原有顺序

#include <iostream>
using namespace std;
void InsSort(int* a, const int s, int n)
{
	int* point, flag = 0;
	for (point = a; *point != 0; point++)
	{
		if (n < *point)
		{
			break;
		}
		flag++;
	}
	for (int i = s; i >= flag; i--)
	{
		a[i] = a[i - 1];
	}
	a[flag] = n;
}


int main()
{
	int data[11] = { 12,34,56,78,90,167,258,389,945,1890 };
	int num, i;
	cin >> num;
	InsSort(data, 10, num);
	for (i = 0; i < 11; i++)
		cout << data[i] << " ";
	cout << endl;
	return 0;
}

6.汉诺塔问题

有三个柱子A、B和C,A柱子上从上到下放有n个盘子,盘子大小不同,下面盘子的直径比上面盘子的直径更大。现在要将A柱子上所有的盘子移动到C柱子上,移动过程中可以借助B柱子,但需要满足以下三个规则:

1.每次只能移动一个盘子;

2.盘子可以放在空柱子上,也可以放在比自己直径更大的盘子上;

3.在任意时刻,大盘子必须在下面,小盘子必须在上面。

要求:编写两个函数

void move(int n,char s,char d);//用来输出移动信息,n为盘子编号,s为移动起点,d为移动终点

void hanoi(int n,char s,char m,char d);//将n个盘子从s借助m移动到d

#include <iostream>
using namespace std;
void hanoi(int n,char A,char B,char C)
{
    if (n == 1)
        cout << "move disk " << n << " from " << A << " to " << C << endl;
    else
    {
        hanoi(n - 1, A, C, B);
        cout << "move disk " << n << " from " << A << " to " << C << endl;
        hanoi(n - 1, B, A, C);
    }
}
int main()
{
    int  n;
    cin >> n;
    hanoi(n, 'A', 'B', 'C');
    return 0;
}

7.将输入图案排列出输入数字的样子显示出来(这点阵字库给的图怪抽象的,这题看不懂,但实现的东西还怪有意思的XD

#include <iostream>
using namespace std;
void print(int, char, int*);
int main()
{
	int led[10][5] = {
		{15,9,9,9,15},{1,1,1,1,1},{15,1,15,8,15},
		{15,1,15,1,15},{9,9,15,1,1},{15,8,15,1,15},
		{15,8,15,9,15},{15,1,1,1,1},{15,9,15,9,15},
		{15,9,15,1,15} };
	int n;
	cout << "请输入1个数字:";
	cin >> n;
	char c;
	cout << "请输入要显示的图案:";
	cin >> c;
	print(n, c, &led[0][0]);
	return 0;
}
void print(int n, char c, int* p)
{
	p += n * 5;
	int i, j, r, w, t;
	for (i = 0; i < 5; i++)
	{
		//从高位开始解码,4位2二进制数,最高位位权为8
		w = 8;
		t = p[i];
		for (j = 0; j < 4; j++)
		{
			r = t / w;
			if (r == 1)cout << c; else cout << ' ';
			t = t % w;
			w = w / 2;
		}
		cout << endl;
	}
}

 

 

定义一个描述二维坐标系中点对象的类point,具有描述其极径、极角和到另一点的距离的成员函数(点的坐标可以输入

#include <iostream>
#include <cmath>
using namespace std;
class point
{
	double x, y;
public:
	point() { x = y = 0; }
	point(double a, double b) { x = a; y = b; }
	double r() { return sqrt(x * x + y * y); }
	double theta() { return atan(y / x); }
	double distance(point& p) { return sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y)); }
};
int main()
{
	int x1, y1, x2, y2;
	cout << "输入A,B的坐标:";
	cin >> x1;
	cin >> y1;
	cin >> x2;
	cin >> y2;
	point A(x1, y1), B(x2, y2);
	cout << "A的极径:" << A.r() << " A的极角:" << A.theta() << endl;
	cout << "AB之间的距离:" << A.distance(B) << endl;
	return 0;
}

这里有一些烦人的戏剧类,身份证类,兔子买菜类,NPC类等等,写的函数不难,题目巨长但能耐心读就是小问题

 

 

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值