数据类型
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类等等,写的函数不难,题目巨长但能耐心读就是小问题