1、编写函数 print_spaced 显示字符串,要求显示出的字符串每个字母之间都有一个空格。要求编写两个同名函数,一个支持字符数组输入,另一个支持 string 类型输入。然后编写 main 函数测试这两个函数,第一个使用字符数组输入,第二个使用 string 类型输入。注意字符串的最后一个字母后面没有空格。
#include<iostream>
#include<string>
using namespace std;
void print_spaced(char*str){
int count=0;
char str2[100]={0};
for(int i=0;str[i]!='\0';++i){
str2[count]=str[i];
count++;
str2[count]=' ';
count++;
}
str2[count-1]='\0';
cout<<str2<<endl;
}
void print_spaced(string str){
int len=str.length();
string str2;
int i;
for (i = 0; i < len - 1; ++i) {
str2 += (str.substr(i * 1, 1) + ' ');
}
str2 = str2 + str.substr(i, 1);
cout << str2 << endl;
}
int main(){
char arr[100];
string str;
cin.getline(arr,99);
getline(cin,str);
print_spaced(arr);
print_spaced(str);
return 0;
}
2、凯撒加密
恺撒加密法加密规则是:将原来的小写字母用字母表中其后面的第 3 个字母的大写形式来替换,大写字母 按同样规则用小写字母替换,对于字母表中最后的三个字母,可将字母表看成是首未衔接的。如字母 c 就 用 F 来替换,字母 y 用 B 来替换,而字母 Z 用 c 代替。编程实现以下功能:输入一个字符串,将其加密后输出。
#include<iostream>
using namespace std;
int main(){
char str[100]={0};
char str2[100]={0};
cin.getline(str,99);
for(int i=0;str[i]!='\0';i++){
if(str[i]>='A'&&str[i]<='Z'){
str2[i]='a'+(str[i]-'A'+3)%26;
}
else if(str[i]>='a'&&str[i]<='z'){
str2[i]='A'+(str[i]-'a'+3)%26;
}
}
cout<<str2;
}
这个大小写字母转换的思路非常好
if(str[i]>='A'&&str[i]<='Z'){
str2[i]='a'+(str[i]-'A'+3)%26;
}
else if(str[i]>='a'&&str[i]<='z'){
str2[i]='A'+(str[i]-'a'+3)%26;
}
3、
按点击率显示歌曲
题目内容:
连续录入 5 首歌的歌名、歌手和点击率清单并按照点击率由高到低的顺序显示歌曲清单的信息。如果点击率相同,则按照录入的顺序显示。
歌曲清单格式如下:
曲名 演唱者 点击率
#include<iostream>
using namespace std;
struct music{
char music_name[20];
char artist[20];
int click;
};
int main(){
music m[5];
for(int i=0;i<5;i++){
cin>>m[i].music_name>>m[i].artist>>m[i].click;
}
for(int i=0;i<4;i++){
for(int j=0;j<4-i;j++){
if(m[j].click<m[j+1].click){
swap(m[j],m[j+1]);
}
}
}
for(int i=0;i<5;i++){
cout<<m[i].music_name<<" "<<m[i].artist<<" "<<m[i].click<<endl;
}
return 0;
}
冒泡排序的思路很好,记忆一下
for(int i=0;i<4;i++){
for(int j=0;j<4-i;j++){
if(m[j].click<m[j+1].click){
swap(m[j],m[j+1]);
}
}
}
4、插入加密(也许今年会考?)
插入式加密是在明文字母中按照指定间隔插入另一些字母以形成密文。例如对明文 china,在间隔为 1 的 位置插入其它字母序列中的字母 a,b,c,d,e,就变成密文 cahbicndae;间隔为 2 时的密文为 chainbac
要求:输入明文和间隔,从存放其它字母的序列(仅包含 a,b,c,d,e)中依次取出对应字母插入到明文中,如果其 它字母序列的字母取完,则从头再取,要求密文中最后一个字母一定是其它字母序列中的字母。
#include<iostream>
#include<string>
using namespace std;
int main(){
string key[5]={"a","b","c","d","e"};
string str;int n,k;
string str2;
cin>>str;
cin>>n;
int len=str.length();
if(len%n==0){
k=len/n;
}
else{
k=len/n+1;
}
for(int i=0;i<k;i++){
str2+=str.substr(i*n,n)+key[i%5];
}
cout<<str2;
}
关键思想
for(int i=0;i<k;i++){
str2+=str.substr(i*n,n)+key[i%5];
}
5、
编写字符串反转函数 mystrrev
题目内容:
编写字符串反转函数 mystrrev,该函数的功能是将指定字符串中的字符顺序颠倒(前变后,后变前)。然后 再编写主函数验证之。注意,输入输出应在主函数中进行。
函数原型为 void mystrrev(char str[])
思路:1、先用指针计算字符串长度
2、再用指针颠倒顺序
#include<iostream>
#include<string>
using namespace std;
void mystrrev(char str[]){
char*head=str,*tail,temp;
int count=0;
while(*head++){
count++;
}
head=str;
tail=str+count-1;
while(head<tail){
temp=*head;
*head=*tail;
*tail=temp;
head++;
tail--;
}
}
int main(){
char str[20];
cin>>str;
mystrrev(str);
cout<<str;
}
对比:使用递归来反转次序
#include<iostream>
#include<string>
using namespace std;
void Revers(int first,int end,char*str,int len){
if(len>(end/2)){
char temp=str[first];
str[first]=str[len-1];
str[len-1]=temp;
Revers(first+1,end,str,len-1);
}
}
void Show(char*arr,int length){
for(int i=0;i<length;i++){
cout<<arr[i];
}
}
int length(char*str){
char*p;
p=str;
int length=0;
while(*p++){
length++;
}
return length;
}
int main(){
char arr[100]={0};
cin.getline(arr,99);
int len=length(arr);
int end=len;
int first=0;
Revers(first,end,arr,len);
Show(arr,len);
return 0;
}
6、返回指针的函数(这个有点薄弱)
编写函数去除字符串中包含的非字母字符(不包括空格),并将小写字母转换成大写字母
题目内容:
编写函数去除字符串中包含的非字母字符(不包括空格),并将小写字母转换成大写字母。
注意,不在函数中输出。输入输出应在主函数中进行。
注意:本题应使用字符数组实现,不能使用字符串处理库函数,不能使用 string 类。
#include<iostream>
using namespace std;
char *del(char*str){
int count=0,length=0;
char arr[200],*p=str;
while(*p++){
length++;
}
p=str;//计算字符串长度
for(int i=0;i<length;i++){
if(str[i]>='a'&&str[i]<='z'){
arr[count]=str[i]-32;
count++;
}
else if(str[i]>='A'&&str[i]<='Z'||str[i]==' '){
arr[count]=str[i];
count++;
}
}
arr[count]='\0';
for(int i=0;i<length;i++){
p[i]=arr[i];
}
return p;
}
int main(){
char arr[200];
cin.getline(arr,199);
cout<<del(arr)<<endl;
}
7、编写函数计算一个英文句子中的单词个数
同学说这个思路很有意思:当一个字符是字母而下一个字符非字母时,单词数+1
#include<iostream>
using namespace std;
int number(char *str){
int i=0;
int num=0;
while(str[i]!='\0'){
if(((str[i]>='A'&&str[i]<='Z')|(str[i]>='a'&&str[i]<='z'))&&(((str[i+1]<'A')|((str[i+1]>'Z')&&(str[i+1]<'a'))|str[i+1]>'z'))){
i++;
num++;
}
else{
i++;
}
}
return num;
}
int main(){
char str[500];
cin.getline(str,500);
cout<<number(str)<<endl;
return 0;
}
8、抽象宠物类的实现(20 分)
题目内容:
定义抽象宠物类 Pet,其中数据成员包括:名字,年龄和颜色;成员函数包括:构造函数;获取成员数据值 的函数;纯虚函数 Speak 和纯虚函数 GetInfo;
定义 Pet 的派生类 Cat 和 Dog,其中 Speak 函数分别显示猫和狗的叫声,而 GetInfo 函数分别输出 Cat 和 Dog 的属性。主函数中定义 Pet 指针变量,分别指向动态生成的 Cat 和 Dog 对象,并通过指针分别调用 GetInfo 函数和 Speak 函数,观察并分析输出结果。
#include<iostream>
#include<string.h>
using namespace std;
class Pet{
protected:
char Name[20];
int Age;
char Color[20];
public:
Pet(char*name,int age,char*color){
strcpy(Name,name);
Age=age;
strcpy(Color,color);
}
~Pet(){};
virtual void Speak()=0;
virtual void Getinfo()=0;
};
class Cat:public Pet{
protected:
char Name[20];
int Age;
char Color[20];
public:
Cat(char*name,int age,char*color):Pet(name,age,color){
strcpy(Name,name);
Age=age;
strcpy(Color,color);
}
~Cat(){};
virtual void Speak(){
cout<<"miao~miao~"<<endl;
}
virtual void Getinfo(){
cout<<"猫的名字是"<<Name<<endl;
cout<<"猫的年龄是"<<Age<<endl;
cout<<"猫的颜色是"<<Color<<endl;
}
};
class Dog:public Pet{
public:
Dog(char*name,int age,char*color):Pet(name,age,color){
strcpy(Name,name);
Age=age;
strcpy(Color,color);
}
~Dog(){};
virtual void Speak(){
cout<<"wang!wang!"<<endl;
}
virtual void Getinfo(){
cout<<"狗的名字是"<<Name<<endl;
cout<<"狗的年龄是"<<Age<<endl;
cout<<"狗的颜色是"<<Color<<endl;
}
};
int main(){
char name[20];
int age;
char color[20];
Pet *p1,*p2;
cin>>name>>age>>color;
Cat *c1=new Cat(name,age,color);
cin>>name>>age>>color;
Dog *d1=new Dog(name,age,color);
c1->Getinfo();
c1->Speak();
d1->Getinfo();
d1->Speak();
}
9、编写函数判断一个整数是否为素数(20 分)
题目内容:
编写函数 int isprime(int a);用来判断整数 a 是否为素数,若是素数,函数返回 1,否则返回 0。调用该函数 找出任意给定的 n 个整数中的素数。 注意,1 不是素数。
#include<iostream>
#include<cmath>
using namespace std;
int isprime(int a){
if(a==1){
return 0;
}
for(int i=2;i<=a/2;i++){
if(a%i==0){
return 0;
break;
}
}
return 1;
}
int main(){
int a[100],b[50];
int*p=b;
int count=0;
for(int i=0;i<99;i++){
cin>>a[i];
if(a[i]==0){
break;
}
if(isprime(a[i])==1){
*p=a[i];
*p++;
count++;
}
}
for(int i=0;i<count-1;i++){
if(i!=(count-1)){
cout<<b[i]<<" ";
}
else{
cout<<b[i];
}
}
return 0;
}
10、编写一个函数,将表示数字的数值(0-12)转换成对应的英文名称(小写)。用户输入阿拉伯数字,程序输出对应数的英文单词。要求必须使用指针数组完成。
#include<iostream>
#include<cmath>
using namespace std;
char*digitname(int n){
static char str[][8]={"zero","one","two","three",
"four","five","six","seven",
"eight","nine","ten","eleven","twelve"};
char(*p)[8]=str;
return p[n];
}
int main(){
unsigned num;
cin>>num;
cout<<digitname(num)<<endl;
return 0;
}
11、怎么动态申请二维数组?(用行指针的做法比较难,多看看)
遍历二维数组
题目内容:
用户首先输入两个整数 m 和 n,然后输入 m*n 个元素,建立一个 m*n 的二维数组。要求使用行指针来遍 历这个二维数组,输出该数组中所有元素的和
#include <iostream>
using namespace std;
int main() {
int m, n;
// 输入数组的行数和列数
cout << "Enter the number of rows (m): ";
cin >> m;
cout << "Enter the number of columns (n): ";
cin >> n;
// 动态分配二维数组
int** arr = new int*[m];
for (int i = 0; i < m; ++i) {
arr[i] = new int[n];
}
// 输入数组元素
cout << "Enter the elements of the array:" << endl;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
cin >> arr[i][j];
}
}
// 使用行指针遍历数组并计算元素和
int sum = 0;
for (int i = 0; i < m; ++i) {
int* row = arr[i]; // 获取当前行的指针
for (int j = 0; j < n; ++j) {
sum += row[j]; // 访问元素并累加
}
}
// 输出元素和
cout << "Sum of all elements: " << sum << endl;
// 释放动态分配的内存
for (int i = 0; i < m; ++i) {
delete[] arr[i];
}
delete[] arr;
return 0;
}
关键掌握这几行!!!
// 动态分配二维数组
int** arr = new int*[m];
for (int i = 0; i < m; ++i) {
arr[i] = new int[n];
}
// 使用行指针遍历数组并计算元素和
int sum = 0;
for (int i = 0; i < m; ++i) {
int* row = arr[i]; // 获取当前行的指针
for (int j = 0; j < n; ++j) {
sum += row[j]; // 访问元素并累加
}
}
12、动态申请大数组
本题要求编写两个函数并测试。
第一个函数原型为 int *new_array(int n); 该函数可以根据参数 n ,动态申请 n 个元素的整型数组,最后将数组指针返回。
第二个函数原型为 void init_array(int *p, int n,int c); 将指定的 n 个元素的数组每个元素的值均初始化为 c。
用户输入数组大小 n 和待初始化的值 c,调用 new_array 函数申请空间,再调用 init_array 初始化,最后输出这个数组的所有元素。
#include <iostream>
using namespace std;
// 函数:new_array
// 功能:动态分配一个包含 n 个整数的数组,并返回指向该数组的指针
int* new_array(int n)
{
int* p;
p = new int[n];
return p;
}
// 函数:init_array
// 功能:将数组的每个元素初始化为 c
void init_array(int *p, int n, int c)
{
for (int i = 0; i < n; ++i)
p[i] = c;
}
int main()
{
int n, c;
// 输入数组大小 n 和初始化值 c
cin >> n >> c;
// 动态分配数组并返回指针
int *arr = new_array(n);
// 初始化数组元素为 c
init_array(arr, n, c);
// 输出数组元素
for (int i = 0; i < n; ++i)
{
if (i == n - 1)
cout << *arr;
else
cout << *arr << ' ';
arr++; // 移动指针到下一个数组元素
}
// 释放动态分配的内存
delete[] arr;
return 0;
}
13、
矩阵对角线元素之和
题目内容:
编写函数,求 n 阶方阵的对角线元素之和。编写主程序,用户输入矩阵的阶数 n,动态申请 n*n 的存储空间,再输入 n 行、n 列的元素,调用函数求矩阵的对角元素之和,在主函数中输出这个和。设元素均为整数。n>=1
#include <iostream>
using namespace std;
// 函数:sumDiagonal
// 功能:计算 n 阶方阵的对角线元素之和
int sumDiagonal(int *a, int n) {
int sum = 0;
// 遍历主对角线上的元素,即 a[i][i]
for (int i = 0; i < n; ++i) {
sum += a[i * n + i];
}
return sum;
}
int main() {
int n;
cout << "请输入矩阵的阶数 n:" << endl;
cin >> n;
// 动态分配 n*n 的存储空间
int *matrix = new int[n * n];
cout << "请输入矩阵的元素:" << endl;
// 输入矩阵元素
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> matrix[i * n + j];
}
}
// 调用函数求矩阵对角元素之和
int diagonalSum = sumDiagonal(matrix, n);
cout << "矩阵的对角线元素之和为:" << diagonalSum << endl;
// 释放动态分配的内存
delete[] matrix;
return 0;
}