第七周:字符串 + 数组 + 指针

本文涵盖了C++编程中的字符串删除、安全密码判断、有序字符串合并、选择排序、整数组合、数组元素查找、极值点下标输出以及数据交换和排序。通过示例代码展示了如何实现这些功能,涉及字符串处理、数组操作、条件判断及排序算法等核心概念。
摘要由CSDN通过智能技术生成

1.字符串中的字符删除

题目:

分别用字符数组或字符指针做函数参数,在字符串中删除与某字符相同的字符。

void Delete1(char s[ ], char ch);

void Delete2(char *p, char ch);
【样例输入】

abcdabcd

c
【样例输出】

abdabd

代码:

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

void Delete(char s[ ], char ch)
{
    int num = strlen(s);
    for(int i = 0; i < num; i ++)
    {
        if(s[i] == ch)s[i] = ' '; //ch已经是一个字符,不用加单引号;
    }
}

void Delete2(char *p, char ch)
{
    for(; *p != '\0'; p ++) //注意\0 \0 \0 \0;可以p[i]表示数组;可以写成for(int i = 0;p[i]!='\0';i++) if(p[i] == ch) p[i] = ' ';
    {
        if(*p == ch) *p = ' ';
    }
}

int main()
{
    char s[100];
    char c;
    gets(s);
    cin >> c;
    Delete2(s, c);
    int num = strlen(s);

    for(int i = 0; i < num; i ++)
    {
        if(s[i] == ' ') continue;
        else cout << s[i];
    }

    return 0;
}

2.密码

题目:

假设一个比较安全的密码至少应该满足下面两个条件:

(1)密码长度大于等于8,且不要超过16。

(2)密码中的字符应该来自下面“字符类别”中四组中的至少三组。

这四个字符类别分别为:

1.大写字母:A,B,C…Z;

2.小写字母:a,b,c…z;

3.数字:0,1,2…9;

4.特殊符号:~,!,@,#,$,%,^;

给你一个密码,你的任****务就是判断它是不是一个安全的密码。

请设计函数bool Password(char *str)实现之。

【输入形式】测试实例包含一个密码(长度最大为50),密码仅包括上面的四类字符。

【输出形式】对于测试实例,判断这个密码是不是一个安全的密码,是的话输出YES,否则输出NO。

【样例输入】a1b2c3d4

【样例输出】NO

【测试数据】a1b2c3d4 Aa! AAAAZZab001~~~# ~~9Bccc^ 000000000000000000000abA %“”“”""a12

代码:

#include <iostream>
#include <cstring>
#define N 50

using namespace std;

int flag =0;

bool Password(char *str)
{
    int len = strlen(str); //直接strlen;不用取内容;
    bool flag1 = true, flag2 = true, flag3 = true, flag4 = true; //要注意排除出现过的类型;
    if(len < 8 || len > 16) return false;
    for(int i = 0; i < len; i ++)
    {
        if(str[i] >= 'A' && str[i] <= 'Z')
        {
            if(flag1)
            {
                flag += 1;
                flag1 = false;
            }
        }
        if(str[i] >= 'a' && str[i] <= 'z')
        {
            if(flag2)
            {
                flag += 1;
                flag2 = false;
            }
        }
        if(str[i] >= '0' && str[i] <= '9'){
            if(flag3)
            {
                flag += 1;
                flag3 = false;
            }
        }
        switch(str[i])
        {
            case '~':
            case '!':
            case '#':
            case '$':
            case '%':if(flag4) //都是一种情况;
                    {
                        flag += 1;
                        flag4 = false;
                    }
        }
    }

    if(flag >= 3)return true;
    else return false;
}

int main()
{
    char s[N];
    gets(s);
    if(Password(s)) cout << "YES";
    else cout << "NO";
}

3.合并字符串

题目:

编写一个函数char * str_bin(char* str1, char* str2), str1、str2是两个有序字符串(其中字符按ASCII码从小到大排序),将str2合并到字符串str1中,要求合并后的字符串仍是有序的,允许字符重复。在main函数中测试该函数:从键盘输入两个有序字符串,然后调用该函数,最后输出合并后的结果。str_bin函数的返回值就是该结果串的起始地址。
【输入形式】分行从键盘输入两个有序字符串(不超过100个字符)
【输出形式】输出合并后的有序字符串
【输入样例】
aceg
bdfh
【输出样例】
abcdefgh
【样例说明】
输入两个有序字符串aceg和bdfh,输出合并后的有序字符串abcdefgh

代码:

#include <iostream>
#define N 101

using namespace std;

int len1 =0;

char * str_bin(char* str1, char* str2){
    for(int i = 0; str1[i] != '\0'; i ++)
    {
        len1 ++;
    }
    for(int i = len1, j = 0; str2[j] != '\0'; i ++, j ++)
    {
        str1[i] = str2[j];
        len1 ++;
    }
    str1[len1] = '\0';
    for(int i = 0; str1[i] != '\0'; i ++)
    {
        for(int j = i + 1; str1[j] != '\0'; j ++)
        {
            if(str1[i] > str1[j])
            {
                char temp;
                temp = str1[i];
                str1[i] = str1[j];
                str1[j] = temp;
            }
        }
    }
    return str1;
}
int main()
{
    char str1[N];
    char str2[N];
    gets(str1);
    gets(str2);
    puts(str_bin(str1,str2)); 
    return  0;
}

4.选择排序

题目:

定义函数void Sort(int a[],int n),用选择法对数组a中的元素升序排列。自定义main函数,并在其中调用Sort函数。

【输入形式】

首先打印提示"Input n:";然后直接在冒号后面输入正整数n,表示数据的个数;回车;

打印提示"Input array of n integers:";其中n应该用如上输入的具体的数值代替;然后直接在冒号后面连续输入n个整数数值,每个数值之间用空格隔开;回车;

【输出形式】

打印"After sorted the array is:";然后直接在冒号后面输出经升序排序后的数组序列,每个数值之间用空格隔开,第一个数值前面无空格,最后一个数值后面无空格;换行;

【运行时的输入输出样例】(下划线部分表示输入)

Input n:6

Input array of 6 integers:1 5 -9 2 4 -6

After sorted the array is:-9 -6 1 2 4 5

代码:

#include <iostream>
#define N 100
using namespace std;

void Sort(int a[], int n)
{
    int i, j, k, temp;
    for(i = 0; i < n; i ++)
    {
        k = i;
        for( j = i + 1; j < n; j ++)
        {
            if(a[j] < a[k])
            {
                k = j;
            }
        }
        if(k != i)
        {
            temp = a[i];
            a[i] = a[k];
            a[k] = temp;
        }
    }
}

int main()
{
    int n = 0;
    int s[N];
    int i = 0;
    cout << "Input n:";
    cin >> n;
    cout << "Input array of n integers:";
    while(1)
    {
        cin >> s[i];
        i ++;
        if(i == n)break;
    }
    Sort(s, n);
    cout << "After sorted the array is";
    for(int i = 0; i < n; i ++)
    {
        cout << s[i] << " ";
    }
    return 0;
}

5.满足条件的整数

题目:

假设a、b、c均为整数,且满足a,b,c 大于1,并且小于等于100,找出所有符合条件:“a的平方 + b的平方 = c的平方”的整数组。

【要求】

1、编写函数void Fun(int a, int b)寻找符合条件的三个数,其中ab分别表示数据起止范围1~100。

2、编写函数void Print(int a, int b ,int c)按照规定的输出格式打印等式,由fun函数调用print函数执行输出功能。

3、主函数不允许出现循环语句,所有功能均在子函数中实现。

【输入形式】无输入
【输出形式】

按a从小到大的顺序输出所有满足条件的整数组(若a相同,则按b从小到大的顺序输出),每行一组,每一组数据的输出样式为:

3*3 + 4*4 = 5*5

注意:

1、3*3 + 4*4 = 5*5 和 4*4 + 3*3 = 5*5虽然是同一组数据,后者不需要输出;

2、加号和等号左右各有一个空格

3、9*9 + 12*12 = 15*15 (在前)

9*9 + 40*40 = 41*41 (在后)

【输出】

3*3 + 4*4 = 5*5

5*5 + 12*12 = 13*13

6*6 + 8*8 = 10*10

7*7 + 24*24 = 25*25

8*8 + 15*15 = 17*17

9*9 + 12*12 = 15*15

9*9 + 40*40 = 41*41

10*10 + 24*24 = 26*26

11*11 + 60*60 = 61*61

12*12 + 16*16 = 20*20

12*12 + 35*35 = 37*37

13*13 + 84*84 = 85*85

14*14 + 48*48 = 50*50

15*15 + 20*20 = 25*25

15*15 + 36*36 = 39*39

16*16 + 30*30 = 34*34

16*16 + 63*63 = 65*65

18*18 + 24*24 = 30*30

18*18 + 80*80 = 82*82

20*20 + 21*21 = 29*29

20*20 + 48*48 = 52*52

21*21 + 28*28 = 35*35

21*21 + 72*72 = 75*75

24*24 + 32*32 = 40*40

24*24 + 45*45 = 51*51

24*24 + 70*70 = 74*74

25*25 + 60*60 = 65*65

27*27 + 36*36 = 45*45

28*28 + 45*45 = 53*53

28*28 + 96*96 = 100*100

30*30 + 40*40 = 50*50

30*30 + 72*72 = 78*78

32*32 + 60*60 = 68*68

33*33 + 44*44 = 55*55

33*33 + 56*56 = 65*65

35*35 + 84*84 = 91*91

36*36 + 48*48 = 60*60

36*36 + 77*77 = 85*85

39*39 + 52*52 = 65*65

39*39 + 80*80 = 89*89

40*40 + 42*42 = 58*58

40*40 + 75*75 = 85*85

42*42 + 56*56 = 70*70

45*45 + 60*60 = 75*75

48*48 + 55*55 = 73*73

48*48 + 64*64 = 80*80

51*51 + 68*68 = 85*85

54*54 + 72*72 = 90*90

57*57 + 76*76 = 95*95

60*60 + 63*63 = 87*87

60*60 + 80*80 = 100*100

65*65 + 72*72 = 97*97

【提示】主函数就仅仅一条调用Fun函数的语句;Fun函数中设计三重循环,判断a*a+b*b==c*c时,且a<b时,调用Print函数执行输出,a<b可以在for里判断,也可以在输出前判断。

代码:

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

void Print(int a, int b ,int c)
{
    if(a < b)
    cout << a << '*' << a << " + " << b << '*' << b << " = " << c << '*' << c << endl; //单引号表示一个字符,输出符号加空格用双引;
}

void Fun(int a, int b)
{
    for(int i = 1; i <= 100; i ++)
    {
        for(int j = 1; j <= 100; j ++)
        {
            int m = sqrt(i * i + j * j);
            if(m * m == i * i + j * j && m <= 100) Print(i, j, m);
        }
    }
}

int main()
{
    int a, b;
    Fun(a, b);
    return 0;
}

6.查找元素

题目:

在数组中查找指定元素。输入一个正整数n(1<n<=10),然后输入n个整数存入数组a中,再输入一个整数x,在数组a中查找x,如果找到则输出相应的最小下标,否则输出"Not found"。要求定义并调用函数int search(int list[], int n, int x),它的功能是在数组list中查找元素x,若找到则返回相应的最小下标,否则返回-1。

【输入形式】

首先打印提示"Input n:";然后直接在冒号后面输入正整数n,表示数据的个数;回车;

打印提示"Input n integers:";其中n应该用如上输入的具体的数值代替;然后直接在冒号后面连续输入n个整数数值,每个数值之间用空格隔开;回车;

打印提示"Input x:";然后直接在冒号后面输入数值x,代表查找的数值;回车;

【输出形式】

有两种情况:

如果指定的x数值在数组中查到,则输出"index = ";被找到的数值在数组中的下标值;回车;

如果指定的x数值在数组中没有查到,则输出"Not found";回车;

【运行时的输入输出样例1】(下划线部分表示输入)

Input n:3

Input 3 integers:1 2 -6

Input x:2

index = 1

【运行时的输入输出样例2】(下划线部分表示输入)

Input n:5

Input 5 integers:1 2 2 5 4

Input x:0

Not found

代码:

#include <iostream>
#define N 10
using namespace std;

int flag = 0;

int search(int list[], int n, int x)
{
    for(int i = 0; i < n; i ++)
    {
        if(list[i] == x)
        {
            flag = 1;
            return i;
        }
    }
    if(flag == 0)return 0;
}

int main()
{
    int n;
    int s[N];
    int x;
    cout << "Input n:";
    do{
        cin >> n;
    }while(n <= 1 || n > 10);
    cout << "Input n integers:";
    for(int i = 0; i < n; i ++)
    {
        cin >> s[i];
    }
    cout << "Input x:";
    cin >> x;
    int r = search(s, n, x);
    if(r == 0 && flag == 0) cout << "Not found";
    else cout << "index = " << r;
    return 0;
}

7.交换数组中最大最小元素位置

题目:

利用案例1中的swap函数,从键盘输入10个整数,用函数编程实现计算其最大值和最小值,并互换它们在数组中的位置。

要求:1)定义swap(int *x, int *y)函数,实现两个数据的交换;

​ 2)定义函数FindMaxMinid(int arr[], int nCount, int *max_id, int *min_id),找到数组arr中最大元素和最小元素的下标;

​ 3)在main函数中实现数组的输入;调用FindMaxMinid函数;并交换两个元素的位置。
【输入形式】
【输出形式】
【样例输入】

1 2 3 4 5 6 7 8 9 10
【样例输出】

10 2 3 4 5 6 7 8 9 1

代码:

#include <iostream>
#define N 10
using namespace std;

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

void FindMaxMinid(int arr[], int nCount, int *max_id, int *min_id)
{
    for(int i = 0; i < nCount; i ++)
    {
        if(arr[i] > max_id[0]) max_id = &arr[i]; //让指针指向最值;
        if(arr[i] < min_id[0]) min_id = &arr[i];
    }
    swap(max_id, min_id);
}

int main()
{
    int s[N];
    for(int i = 0; i < N; i ++)
    {
        cin >> s[i];
    }
    FindMaxMinid(s, N, s, s);
    for(int i = 0; i < N; i ++)
    {
        cout << s[i] << " ";
    }
    return 0;
}

8.打印极值点下标

题目:

在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻(左边和右边)的整数,或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。

【输入形式】有2×n+1行输入:第一行是要处理的数组的个数n;对其余2×n行,第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。

【输出形式】输出为n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔。

【样例输入】

3

10

10 12 12 11 11 12 23 24 12 12

15

12 12 122 112 222 211 222 221 76 36 31 234 256 76 76

15

12 14 122 112 222 222 222 221 76 36 31 234 256 76 73

【样例输出】

0 7

2 3 4 5 6 10 12

0 2 3 10 12 14

代码:

#include <iostream>
#define N 100
using namespace std;

void Find(int s[], int len)
{
    for(int i = 0; i < len; i ++)
    {
        if(i == 0 && s[i] != s[i + 1]) cout << i << " ";
        if(i != 0 && i != len - 2)
        {
            if(s[i] < s[i + 1] && s[i] < s[i - 1]) cout << i << " ";
            if(s[i] > s[i + 1] && s[i] > s[i - 1]) cout << i << " ";
        }
        if(i == len - 1 && s[i] != s[i - 1]) cout << i << " ";
    }

}

int main()
{
    int s[N];
    int num = 0;
    cin >> num;
    while(num --)
    {
        int len;
        cin >> len;
        for(int i = 0; i < len; i ++)
        {
            cin >> s[i];
        }
        Find(s, len);
    }
    return 0;
}

9.利用指针交换两个数组中的数据并排序

题目:

编写函数int Read(int *x); 录入数组元素,返回值代表元素个数。录入数据时输入0代表数据录入的结束。

编写函数void Print(int *x, int n); 负责输出数组中的元素。

编写函数void Swap(int *x, int m, int *y, int n); 交换主函数里的两个整形数组a和b里的数据值,其中ab中数据元素的实际个数传递给形参m和n。

编写函数void Sort(int *x, int n); 负责实现数组元素从小到大的排序。

【样例输入】

9 3 2 8 5 7 0

6 1 4 0

【样例输出】

6 1 4

9 3 2 8 5 7

1 4 6

2 3 5 7 8 9

【提示】首先依次输出交换后的数组元素值,然后依次输出排序后的数组元素值。

代码:

#include <iostream>
using namespace std;

int a[100];
int b[100];
int c[100];

void QuickSort(int a[], int left, int right)
{
    if (left < right)
    {
        int mid = a[(left + right) / 2];
        int low = left - 1;
        int high = right + 1;
        while (low < high)
        {
            while (a[ ++ low] < mid);
            while (a[ -- high] > mid);
            if (low < high)
                swap(a[low], a[high]);
        }
        QuickSort(a, left, low - 1);
        QuickSort(a, high + 1, right);
    }
}

int main()
{
    int ch;
    int pos = -1;
    while (cin >> ch)
    {
        c[ ++ pos] = ch;
    }
    if (pos == 0) return 0;
    int newpos1 = 0;
    pos = 0;
    while (c[pos] != 0)
    {
        a[newpos1 ++ ] = c[pos ++ ];
    }
    pos ++;
    int newpos2 = 0;
    while (c[pos] != 0)
    {
        b[newpos2 ++ ] = c[pos ++ ];
    }
    for (int i = 0; i < newpos2; ++ i)
        cout << b[i] << " ";
    cout << endl;
    for (int i = 0; i < newpos1; ++ i)
        cout << a[i] << " ";
    QuickSort(b, 0, newpos2 - 1);
    QuickSort(a, 0, newpos1 - 1);
    cout << endl;
    for (int i = 0; i < newpos2; ++ i)
        cout << b[i] << " ";
    cout << endl;
    for (int i = 0; i < newpos1; ++i)
        cout << a[i] << " ";
    return  0;
}

10.利用指针交换两个数据

题目:

编写函数void swap(int *x, int *y); 交换主函数里的两个整形变量a和b的值。输入和输出语句都在主函数内部完成。

【样例输入】

3 4

【样例输出】

4 3

代码:

#include<iostream>
using namespace std;

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}
int main()
{
   int a, b;
   cin >> a >> b;
   swap(a, b);
   cout << a << ' ' << b;
}

欢迎提问,学弟学妹们加油~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只可爱的小猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值