考研程序设计30题系列(1~10题)

注: 数据来源网学天地,如有侵权,告知删除。 练习程序用!

1. 字符串转整数

问题

答案

#include <iostream>

using namespace std;
int main() {

    string str;
    int sum=0; // 用于存储转换后的整数
    int flag = 1; //默认为正数
    int i=0;  // 字符串下标

    cout<<"请输入一个字符串";
    cin>>str;


    if(str[0] == '-') {
        // 字符串为负数的情况处理!

        flag=-1;
        i=1;
    }


    for( ;i<str.length(); i++) {
        int temp = str[i] - '0'; // 字符串从高位依次取出数字

        sum = sum*10 + temp;
    }


    // 正负处理
    sum = flag*sum;

    // 输出
    cout<<sum;


    return 0;
}


运行结果:

在这里插入图片描述

2. 二维数组数据按列存储到一维数组

问题:
在这里插入图片描述

答案

#include <iostream>

using namespace std;

int main() {

    string strArray[3][3];

    string strs[9];


    // 数组赋值
    cout<<"输入二维数组的数据:"<<endl;
    for(int i=0; i<3; i++) {
        for(int j=0; j<3; j++) {
            cin>>strArray[i][j];
        }
    }

    // 存放到一维
    // ij控制二维,k控制一维
    int k=0;
    for(int i=0; i<3; i++) {
        for(int j=0; j<3; j++) {
            strs[k++] =  strArray[j][i];
        }
    }

    // 输出查看
    for(int i=0; i<k; i++) {
        cout<<strs[i]<<ends;
    }

    return 0;
}

运行结果:
在这里插入图片描述

3. 统计字符串个数

问题:
在这里插入图片描述

答案

#include <iostream>

using namespace std;

// 统计字符个数函数
int getLen(string str);

int main() {

    string str;
    char dd[100];
    cout<<"请输入一个字符:"<<endl;
    getline(cin,str);
    cout<<str<<endl;

    int n = getLen(str);

    cout<<n;

    return 0;
}

int getLen(string str) {

    int sum=0;


    for(int i=0; i<str.length(); i++) {

        if(str[i] >= 'a' && str[i] <= 'z') {
            while(str[i] >= 'a' && str[i] <= 'z' && i<str.length()) {
                i++;
            }
            sum++;
        }
    }

    return sum;
}

运行结果:

在这里插入图片描述

4. 统计各年龄段人数

问题:
在这里插入图片描述

答案

#include <iostream>
#include <math.h>

using namespace std;



int main() {

    // 用于统计年龄段人数

    int dd[11] = {0};

    int n;
    cout<<"请输入n:"<<endl;
    cin>>n;


    for(int i=0; i<n; i++){
        int year = rand()%200; // 随机生成200以内的年龄

        int t = year/10;

        switch(t) {
            case 0:
                dd[0]++;
                break;
            case 1:
                dd[1]++;
                break;
            case 2:
                dd[2]++;
                break;
            case 3:
                dd[3]++;
                break;
            case 4:
                dd[4]++;
                break;
            case 5:
                dd[5]++;
                break;
            case 6:
                dd[6]++;
                break;
            case 7:
                dd[7]++;
                break;
            case 8:
                dd[8]++;
                break;
            case 9:
                dd[9]++;
                break;
            default:
                dd[10]++;
        }

    }


    for(int i=0; i<11; i++) {
        cout<<"d["<<i<<"]"<<"共"<<dd[i]<<"人"<<endl;

    }
    return 0;
}

运行结果:
在这里插入图片描述

5. 删除重复数据,就保留一个

问题:
在这里插入图片描述

答案

#include <iostream>

using namespace std;

// 简单选择排序
void paiXu(int *nums) {
    int i=0;
    while(nums[i+1]) {
        // 第一次循环执行到倒数第二个元素

        int min=i;  // 默认最小的是i指向的元素
        for(int j=i+1; nums[j]; j++) {

            if(nums[j]<nums[i]) {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
            }
        }
        i++;
    }
}

// 处理相同字符
void chuLi(int *nums) {

    // 通过空间换时间

    int t[100];
    int i=0, j=0; // 从第一个开始比较

    t[j] = nums[i++];
    while(nums[i+1]) {
        if(t[j] != nums[i]) {
            // j指向当前元素,所以赋值赋值到下一个位置。
            t[++j] = nums[i++];
        }

        i++;
    }

    for(int i=0; t[i]; i++) {
        cout<<t[i]<<endl;
    }


}

int main() {


    int nums[10] = {1,5,2,4,2,5,4,3,5};

    // 简单选择排序
    paiXu(nums);

    chuLi(nums);


    return 0;
}

运行结果:

在这里插入图片描述

6. 字符串移动问题

解析: 这类移动类问题,均可转换为反转函数的函数实现

问题:
在这里插入图片描述

答案

  • 核心反转函数:
  1. 注意mid是 (high - low) / 2;(反转只需要执行一般)
  2. 换算是 low + i 与 high-i-1;
#include <iostream>
#include <cstring>

using namespace std;


// 反转字符串指定部分
void fanZhuan(char str[], int low, int high){
    int mid = (high - low) / 2;

    for(int i=0; i<mid; i++) {
        char el;

        el = str[low+i];
        str[low+i] = str[high-i-1];

        str[high-i-1] = el;

    }

}

int main() {
    char str[100]="ABCDEFGHIJK";

    // 整体反转
    fanZhuan(str,0,strlen(str));

    // 左反转
    fanZhuan(str,0, strlen(str)-3);

    // 右侧反转
    fanZhuan(str,strlen(str)-3,strlen(str));

    cout<<str;


    return 0;
}

运行结果:

在这里插入图片描述

7. 获取除了最高位后的数

问题:
在这里插入图片描述

答案

  • 提示
  1. 要注意获得整数的位数!
    假如为6位数, 我们求除了百位的数应该 模除 10的五次方 (因为10的5次方为6位
#include <iostream>

using namespace std;

// 处理函数
unsigned int fun(unsigned int w) {
    // 获取w的最高位, t用于临时处理
    int s = 1, t = w;
    while(t/10) {

        s*=10;
        t/=10;

    }

    // 因为我们要模除去除最高位,所以百位的数,s要为10位

    s/=10;

    return w%s;
}
int main() {
    int w;

    cout<<"请输入w的数值:";
    cin>>w;

    cout<<fun(w);

    return 0;
}

运行结果:
在这里插入图片描述

8. 二维数组操作左下三角

问题:
在这里插入图片描述

答案


using namespace std;

#define N 4

//处理函数(左下三角×n)
void chuLi(int a[][N], int n) {
    for(int i=0; i<N; i++) {
        for(int j=0; j<=i; j++) {
            a[i][j] *= n;
        }
    }
}

int main() {


    int a[N][N] = {
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,16}
    };

    chuLi(a, 2);

    for(int i=0; i<N; i++) {
        for(int j=0; j<N; j++) {
            cout<<a[i][j]<<ends;
        }
        cout<<endl;
    }


    return 0;
}

运行结果:
在这里插入图片描述

9. 数组元素平移

问题:
在这里插入图片描述

答案

但凡这种平移的都可以用反转实现

#include <iostream>
using namespace std;

// 反转函数
void fanZhuan(int a[], int low, int high);
int main() {
    int a[11] = {1,2,3,4,5,6,7,8,9,10};
    int len=0;
    while(a[++len] != '\0');// 统计数组长度
    // 整体反转
    fanZhuan(a, 0,len);
    // 左6位反转
    fanZhuan(a,0,len-4);
    // 右4位反转
    fanZhuan(a,len-4,len);
    // 输出最后数据
    for(int i=0; i<len; i++) {
        cout<<a[i]<<ends;
    }
    return 0;
}
// 反转函数功能实现
void fanZhuan(int a[], int low, int high) {
    int mid = (high - low) / 2;

    // 对low到high元素进行反转
    for(int i=0; i<mid; i++) {
        int t = a[low+i];
        a[low+i] = a[high-i-1];
        a[high-i-1] = t;
    }
}

运行结果:

在这里插入图片描述

10. 删除字符串中的空格

问题:
在这里插入图片描述

答案

本题用两种方式实现:

  1. 辅助空间: 不是空格就追加到新字符串
  2. 原本字符串上进行。 用一个统计已经遇到空格的变量, 每次遇到非空格向前移动已有空格数量
#include <iostream>
#include <string>


using namespace std;


// 辅助空间处理函数
string shanKongGe(string str);

// 原始串上进行操作
string shanKongGe2(string str);

int main() {
    string str;
    cout<<"请输入字符串:";
    getline(cin, str);

    // 调用处理函数
   str = shanKongGe2(str);

   cout<<str;
    return 0;
}

// 辅助空间实现
string shanKongGe(string str){
    string tt = "";

    for(int i=0; i<str.length(); i++) {
        if(str[i] != ' ') {
            tt.append(1,str[i]);
        }
    }

    return tt;

}

// 不借用辅助空间实现
string shanKongGe2(string str) {
    int kongSum=0;// 用于记录扫描到空格的数量
    int i;
    for(i=0; i<str.length(); i++) {
        if(str[i]==' ') {
            kongSum++;
        }else if(kongSum!=0) {
            // 如果不是空格,并且空格数量不是0,则向前移动空格数量
            str[i-kongSum] = str[i];
        }
    }

    // 将最后一个字符填空格
    str[i-1] = ' ';

    return str;

}


运行结果:

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值