# 20250303-Rain

## 1. 指针交换

```cpp
/*
1. 李四在写排序时, 经常需要交换两个元素的值. 但手动写出来显得代码不够优雅, 李四是一个有品味的
人, 他希望有一个函数能实现两个值的交换.
实现swap函数 该函数可以交换指针指向的值

void swap(int *a, int *b);
测试样例:
 int main(){
 int a = 3, b = 4;
 swap(&a, &b);
 printf("%d,%d\n",a,b); //此处应打印4,3
 }
*/

#include <iostream>

using namespace std;

/*
功能: 交换两个指针指向的整数值
参数:
int *a: 待交换变量1的地址
int *b: 待交换变量2的地址
返回值:
void
*/
void swap(int *a, int *b)
{
  int temp = *a;
  *a = *b;
  *b = temp;
}

int main(void)
{
  int a = 3, b = 4;
  swap(&a, &b);
  cout << a << ',' << b << endl;
  return 0;
}

```

## 2. 密码验证

```cpp
/*
 2. 开挂很危险
最近网络盗号严重, 张三又喜欢开外挂(大家不要学)
于是张三打算出一个安全的密码, 避免开外挂后被盗号
请各位小伙伴帮忙, 判定一下张三的密码是否安全
安全密码的判定:
 1. 长度在8~16之间
 2. 开头必须是大写
 3* 密码最少包含一个小写字母, 一个数字, 一个特殊符号
特殊符号包括~!@#$%*
设计一个程序 输入密码字符串
如果密码安全, 打印true, 否则打印false
 (字符串长度<100)
样例输入:
Aa123!!!!!
样例输出:
true
*/

#include <iostream>
#include <string>

using namespace std;

int main(void)
{
  string S;
  cout << "Please input 'S': ";
  cin >> S;

  bool flag = true;
  // 1. 长度在8~16之间
  if (S.length() < 8 || S.length() > 16)
  {
    flag = false;
  }

  // 2. 开头必须是大写
  if (!isupper(S[0]))
  {
    flag = false;
  }

  // 3* 密码最少包含一个小写字母, 一个数字, 一个特殊符号
  bool lower = false;
  bool num = false;
  bool sym = false;
  for (auto c : S)
  {
    if (islower(c))
    {
      lower = true;
    }
    if (isdigit(c))
    {
      num = true;
    }
    if (c == '~' || c == '!' || c == '@' || c == '#' || c == '$' || c == '%' || c == '*')
    {
      sym = true;
    }
  }
  if (flag && lower && num && sym)
  {
    cout << "true" << endl;
  }
  else
  {
    cout << "false" << endl;
  }
  return 0;
}
```

## 3. 密码加密

```cpp
/*
3. 密码加密
自从上次张三密码变复杂后, 再也没有被盗过号
但他觉得密码还是不够复杂, 于是又进行了二次加密
然后..他忘记二次加密后的密码了
小伙伴赶紧帮他找找
张三的加密方式是这样的:
对于每个字母和数字, 按字母表/数字顺序往后挪5位
(如果超过了 则从头开始, 比如'z'转换后变成'e', '9'转换后变成'4')
符号不变
如密码: AaZz09!!!
加密后: FfEe54!!!
设计一个程序, 输入加密前的密码  打印加密后的密码
(密码长度 <= 16)
样例输入: AaZz09!!!
样例输出: FfEe54!!!
*/

#include <iostream>
#include <string>

using namespace std;

int main(void)
{
  string S;
  cout << "Please input 'S': ";
  cin >> S;
  for (auto &c : S)
  {
    if (isupper(c))
    {
      c = (c - 'A' + 5) % 26 + 'A';
    }
    else if (islower(c))
    {
      c = (c - 'a' + 5) % 26 + 'a';
    }
    else if (isdigit(c))
    {
      c = (c - '0' + 5) % 10 + '0';
    }
  }
  cout << S << endl;
  return 0;
}
```
