2020/11/5 C++实验回顾

1. 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。

⑴提示
把输入的10个整数存入数组中,10个中最小的放与数组的第一个元素对换,最大的数与数组的第10个元素对换。其他的保持不变。

要求
定义3个函数:
void input(int number[ ]); //此函数实现输入10个元素//
void max_min_value(int array[ ]); //此函数实现交换数组的对应元素//
void output(int array[ ]); //此函数实现输出10个元素//

#include<iostream>
using namespace std;
const int n = 10;
void input(int number[]) {
    int t;
    cout << "请输入10个整数:" << endl;
    for (int i = 0; i < n; i++) {
       cin >> t;
       number[i] = t;
    }
    cout << "数组创建成功" << endl;
}
void max_min_value(int array[]) {
    int min = array[0], max = array[0], minp = 0, maxp = 0, t;
    for (int i = 1; i < n; i++) {
       if (min > array[i]) {
           min = array[i];
           minp = i;
       }
       if (max < array[i]) {
           max = array[i];
           maxp = i;
       }
    }
    t = array[0];
    array[0] = min;
    array[minp] = t;
    t = array[n - 1];
    array[n - 1] = max;
    array[maxp] = t;
    cout << "交换成功" << endl;
}
void output(int array[]) {
    cout << "输出数组:" << endl;
    for (int i = 0; i < n; i++) {
       cout << array[i] << " ";
    }
    cout << endl;
}
int main() {
    int number[n];
    input(number);
    max_min_value(number);
    output(number);
    return 0;
}

Image

2.二维数组统计

编写程序统计一个字符串“C++ is beginer's language”中单词的个数,并将统计的每个单词存入二维数组array[ ][ ]中的一行,即数组array中的元素:array[0]=”C++”, array[1]=”is”, array[2]=”beginer’s”, array[3]=”language”。最后输出每个单词。

#include<iostream>
using namespace std;
const int n = 20;
void input(char a[][n], int& len_row, int& len_all) {
    cout << "请输入字符串:" << endl;
    char t;
    int end = 0;
    for (int i = 0; i < n; i++) {
       for (int j = 0; j < n; j++) {
           t = cin.get();
           if (t == ' ' || t == '
')
              break;
           a[i][j] = t;
           len_all++;
           end = j + 1;
       }
       len_row++;
       a[i][end] = '';
       if (t == '
')
           break;
    }
    cout << "录入成功" << endl;
}
void output(char a[][n], int len_row){
    cout << "二维数组输出:" << endl;
    for (int i = 0; i < len_row; i++) {
       for (int j = 0; j < n; j++) {
           if (a[i][j] == '')
              break;
           cout << a[i][j];
       }
       cout << " ";
    }
    cout << endl;
}
int main() {
    char a[n][n];
    int len_row = 0, len_all = 0;
    input(a, len_row, len_all);
    cout << "字符串总长度为:" << len_all << ",行数为:" << len_row << endl;
    output(a, len_row);
    return 0;
}

Image

3. 循环单链表练习

n个人围成一圈,从第一个人开始报数,报到5的人就退出圈(图中白色的表示退出圈),再从下个人开始报数,问最后剩下的那个人是第几个人。

Image

#include <iostream>
using namespace std;
//定义结构体
typedef struct Node {
    int num;
    string name;
    struct Node* next;
}stNode, * stLink;
//初始化循环单链表
void initStLink(stLink& L) {
    L = (stNode*) new stNode;   //创建头结点
    if (L == NULL)
       cout << "链表初始化失败" << endl;
    L->next = L; //头结点指向自己
    cout << "链表初始化成功" << endl;
}
//销毁链表
void destroyLink(stLink& L) {
    stNode* p = L;
    stNode* q = p->next;
    while (q != L) {
       free(p);
       p = q;
       q = q->next;
    }
    free(p);
    p = NULL;
    q = NULL;
    L = NULL;
    cout << endl << "链表销毁成功" << endl;
}
//尾插入结点
void stInsert(stLink& L, int i, int num, string name) {
    if (i < 1)
       cout << "插入位置不能小于1" << endl;
    stNode* p = L;    //L指向头结点,后续用于扫描
    int j = 0; //记录当前p指向的第几个结点
    while (p != NULL && j < i - 1) {   //循环找到第 i-1 个结点
       p = p->next;
       j++;
    }
    stNode* s = (stNode*) new stNode;
    s->num = num;
    s->name = name;
    s->next = p->next;
    p->next = s;
}
//创建循环链表
void CreateStLink(stLink& L, int n, int* stNum, string* stName) {
    if (n < 1)
       cout << "创建失败(至少有一个结点)" << endl;
    for (int i = 0; i < n; i++) {
       stInsert(L, i + 1, *(stNum + i), *(stName + i));
    }
    cout << "链表创建成功" << endl << endl;
}
//输出链表信息
void dispStLink(stLink L) {
    stNode* p = L->next;
    cout << "输出链表:" << endl;
    while (p != L) {
       cout << p->num << "  " << p->name << endl;
       p = p->next;
    }
    cout << endl;
}
//报数为 m 的出列,并播报最后剩余者
void stFind(stLink& L, int n, int m) {
    stNode* p = L->next; //标记结点
    int call_n = 0;   //报数
    int out_n = 0;    //出局人数
    cout << "游戏开始" << endl;
    while (1) {   //循环报数
       if (p->num != 0) {   //如果没有出局
           if (out_n == (n - 1))    //如果只剩一人
              break; //退出
           call_n++;  //报数
           call_n %= m;  //报到 m 就从0开始
           if (call_n == 0) {   //报数为 m 的
              cout << p->num << "  " << p->name << "  出局!" << endl;    //播报出局
              p->num = 0;   //出局标记
              out_n++;   //出局人数 +1
           }
       }
       p = p->next;  //循环下一个结点
       if (p == L)   //p指向头结点时
           p = p->next;  //跳过头结点
    }
    cout << "最后的剩余者是:" << p->num << "  " << p->name << endl;
}
int main()
{
    int stNum[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    string stName[] = { "孙悟空", "嬴政", "林黛玉", "武松" , "朱莉" , "卡卡罗特" , "中本聪" , "高尔基" };
    int n = sizeof(stNum) / sizeof(stNum[0]); //人数
    int m = 5; //报数
    stLink L;
    initStLink(L);    //初始化
    CreateStLink(L, n, stNum, stName); //创建链表
    dispStLink(L);    //显示链表
    stFind(L, n, m);  //报数出局
    destroyLink(L);   //销毁链表
    return 0;
}

Image

原文地址:https://www.cnblogs.com/Liwker/p/13933404.html