C/C++ 学习笔记(四)——指针

in 编程技术分享 with 0 comment
//
// Created by imbytecat on 2020/5/30.
// 用指针做函数的参数,设计一函数将整型数组各元素的值乘以 10。
//

#include <cstdio>

int main() {
    int numList[5] = {1, 2, 3, 4, 5};
    for (int i = 0; i < 5; i++) {
        printf("%d\n", *(numList + i) * 10);
    }
    return 0;
}
//
// Created by imbytecat on 2020/5/30.
// 用指针做函数的参数。设计一个实现两个浮点型参数交换的函数,并在主函数中测试它,测试参数为:10.1、5.8。
//

#include <cstdio>

void exchange(double *a, double *b) {
    double r;
    r = *a;
    *a = *b;
    *b = r;
}

int main() {
    double a = 10.1, b = 5.8;
    double *p, *q;
    p = &a;
    q = &b;
    exchange(p, q);
    printf("%f %f\n", a, b);
    return 0;
}
//
// Created by imbytecat on 2020/5/31.
// 有 n 个整数,使前面各数顺序向后移 m 个位置,最后 m 个数变成最前面 m 个数。
// 写一函数实现以上功能,在主函数中输入 n 个整数和输出调整后的 n 个数。用指针做函数的参数。
//

#include <cstdio>

int main() {
    void move(int [20], int, int);
    int number[20], n, m, i;
    printf("多少个数?");
    scanf("%d", &n);
    printf(" 输入%d个数 :\n", n);
    for (i = 0; i < n; i++)
        scanf("%d", &number[i]);
    printf("移动多少个位置?");
    scanf("%d", &m);
    move(number, n, m);
    printf("输出:\n");
    for (i = 0; i < n; i++)
        printf("%d  ", number[i]);
    printf("\n");
    return 0;
}

void move(int array[20], int n, int m) {
    int *p, array_end;
    array_end = *(array + n - 1);
    for (p = array + n - 1; p > array; p--)
        *p = *(p - 1);
    *array = array_end;
    m--;
    if (m > 0) move(array, n, m);
}
//
// Created by imbytecat on 2020/5/31.
// 编写约简分数的函数(用分子分母的最大公约数除分子分母),用指针变量做函数的参数。
//

#include<iostream>

void lowterm(int *num, int *den) {
    int n, d, r;
    n = *num;
    d = *den;
    while (d != 0) {
        // 辗转相除法
        r = n % d;
        n = d;
        d = r;
    }
    if (n > 1) {
        *num = *num / n;
        *den = *den / n;
    }
}

int main() {
    int a = 14, b = 21;
    printf("化简前:%d/%d\n", a, b);
    lowterm(&a, &b);
    printf("化简后:%d/%d", a, b);
    return 0;
}
//
// Created by imbytecat on 2020/5/30.
// 在函数中通过指针访问数组元素,实现选择法排序。
//

#include <cstdio>

void xz(int *p, int n) {
    int i, j, k, t, *p1;
    p1 = p;
    for (i = 0; i < n - 1; i++) {
        k = i;
        for (j = i + 1; j < n; j++)
            if (*(p + j) < *(p + k)) {
                t = *(p + j);
                *(p + j) = *(p + k);
                *(p + k) = t;
            }
    }
    for (i = 0; i < n; i++)
        printf(" %d ", *(p1 + i));
    printf("\n");
}

int main() {
    int i;
    int a[10];;
    printf("输入 5 个数:");
    for (i = 0; i < 5; i++)
        scanf("%d", &a[i]);
    printf("\n选择排序");
    xz(a, 5);
    return 0;
}
//
// Created by imbytecat on 2020/5/30.
// 实现 strcat() 函数功能,要求自行编写代码将字符串 b 的内容追加到字符串 a 的尾部。
//

#include <cstdio>

char *myStrcat(char *dest, const char *src) {
    char *p = dest;
    while (*p) p++; // 让指针 P 指向 dest 的最后面
    while (*src) {
        *p = *src;
        p++;
        src++;
    }
    *p = '\0'; // 新字符串的终止符
    return dest;
}

int main() {
    char s[10] = "imbytecat";
    char *c = ".com";
    myStrcat(s, c);
    puts(s);
    return 0;
}
//
// Created by imbytecat on 2020/5/30.
// 用行指针变量求4阶矩阵的主对角线元素之和。
//

#include <cstdio>

#define num 3

int main() {
    int a[num][num], total1 = 0, total2 = 0;
    for (int i = 0; i < num; i++) {
        for (int j = 0; j < num; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    for (int i = 0; i < num; i++) {
        for (int j = 0; j < num; j++) {
            if (i == j) {
                total1 += a[i][j];
            }
            if (i + j == 2) {
                total2 += a[i][j];
            }
        }
    }
    printf("主对角线和:%d\n", total1);
    printf("副对角线和:%d\n", total2);
    return 0;
}
//
// Created by imbytecat on 2020/5/31.
// 编程实现:输入星期几的数字后,输出该数字对应的中文全名,例如输入 2,输出"星期二",1~7以外的数字表示退出。要求用指针数组表示。
//

#include <cstdio>

int main() {
    int i, week;
    char *Week[7] = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"};
    printf("输入数字:\n");
    scanf("%d", &week);

    for (; week < 1 || week > 7; printf("您的输入有误,请重新输入\n"), scanf("%d", &week));
    printf("%d对应的星期为:%s\n", week, *(Week + week - 1));
    return 0;
}
//
// Created by imbytecat on 2020/5/31.
// 用函数指针做函数的参数,实现调用加法和乘法。函数原型为 void op(int x, int y, int (*f)(int,int));
//

#include<iostream>

using namespace std;

int Add(int a, int b) {
    return a + b;
}

int Mult(int a, int b) {
    return a * b;
}

int Op(int x, int y, int(*f)(int, int)) {
    return (*f)(x, y);
}

int main() {
    int a, b;
    printf("请输入两个数:");
    scanf("%d%d", a, b);
    int (*p)(int a, int b);
    p = Add;
    cout << "a+b=" << Op(a, b, Add) << endl;
    p = Mult;
    cout << "a*b=" << Op(a, b, Mult) << endl;
    return 0;
}
//
// Created by imbytecat on 2020/5/31.
// 编写函数,计算二维数组 a 中每一行的和,将它存放在一位数组 b 中,在主函数中实现它。
//

#include <cstdio>

int main() {
    int i, j;
    int b[4][5], a[4];
    for (i = 0; i < 4; i++)
        for (j = 0; j < 5; j++)
            scanf("%d", &b[i][j]);
    for (i = 0; i < 4; i++) {
        a[i] = 0;
        for (j = 0; j < 5; j++)
            a[i] += b[i][j];
    }
    printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
    return 0;
}
//
// Created by imbytecat on 2020/5/31.
// 函数 char *fun(char *str, char c) 功能是返回 str 所指字符串中以形参 c 中字符开头的后续字符串的首地址。
// 例如:str 所指字符串为 Hello!,c 中的字符为 e,则函数返回字符串 ello! 的首地址。
// 若 str 所指字符串为空串或不包含 c 中的字符,则函数返回 NULL。请编写实现。
//

#include <cstdio>
#include <cstring>

char *fun(char *str, char c) {
    int n = 0;
    char *p = str;
    if (p != NULL)
        while (p[n] != c && p[n] != '\0') n++;
    if (p[n] == '\0') return NULL;
    return (str + n);
}

int main() {
    char str[99] = "hello!";
    char c = 'e';
    printf("%s ", fun(str, c));
    return 0;
}
//
// Created by imbytecat on 2020/5/30.
// 函数 char *fun(char *str) 的功能是检查一个字符串是否是回文。
// 当字符串是回文时,函数返回字符串:yes!,否则函数返回字符串:no!,并在主函数中输出。
// 所谓回文即正向与反向的拼写都一样,例如:abccba。
//

#include <cstdio>

#define N 80

int fun(char *str) {
    int i, j;
    for (i = 0; str[i] != '\0'; i++);
    j = i - 1;
    for (i = 0; i < j; i++, j--)
        if (str[i] != str[j])
            return 0;
    return 1;
}

int main() {
    char s[N];
    printf("输入字符串:");
    gets(s);
    printf("\n");
    puts(s);
    if (fun(s)) printf("yes!\n");
    else printf("no!\n");
    return 0;
}
//
// Created by imbytecat on 2020/5/30.
// 已有 a、b 两个升序链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。
//

#include <cstdio>
#include <cstdlib>
#include <cstring>

struct student {
    int id;
    char name[1024];
    int score[3];
    struct student *next;
};
typedef struct student stu;

stu *creat(int n) { // 创建链表
    stu *s;
    stu *head;
    stu *p;
    s = (stu *) malloc(sizeof(stu));
    head = s;
    p = head;
    for (int i = 0; i < n; ++i) {
        s = (stu *) malloc(sizeof(stu));
        printf("请输入第%d个学生的信息\n", i + 1);
        printf("请输入学号\n");
        scanf("%d", &s->id);
        printf("请输入姓名\n");
        scanf("%s", &s->name);
        for (int j = 0; j < 3; ++j) {
            printf("请输入第%d门课的成绩\n", j + 1);
            scanf("%d", &s->score[j]);
        }
        s->next = p->next;
        p->next = s;
        p = p->next;
        if (i == n - 1) {
            p->next = NULL;
        }
    }
    return head;
}

void print(stu *head) { // 输出
    for (stu *p = head->next; p != NULL; p = p->next) {
        printf("%d\t%s\t%d\t%d\t%d\n", p->id, p->name, p->score[0], p->score[1], p->score[2]);
    }
}

void swap(stu *p, stu *q) { // 交换函数
    p->id = p->id ^ q->id;
    q->id = p->id ^ q->id;
    p->id = p->id ^ q->id;
    char temp[1024];
    strcpy(temp, p->name);
    strcpy(p->name, q->name);
    strcpy(q->name, temp);
    for (int i = 0; i < 3; ++i) {
        p->score[i] = p->score[i] ^ q->score[i];
        q->score[i] = p->score[i] ^ q->score[i];
        p->score[i] = p->score[i] ^ q->score[i];
    }
}

void fun(stu *a, stu *b) { // 合并并排序
    stu *p;
    for (p = a; p->next != NULL; p = p->next); // 找到a的最后一个指针
    p->next = b->next; // 让它指向b
    free(b);
    for (p = a->next; p != NULL; p = p->next) {
        for (stu *q = p->next; q != NULL; q = q->next) {
            if (p->id > q->id) {
                swap(p, q);
            }
        }
    }
}

int main() {
    int n, m;
    printf("请输入链表a的长度\n");
    scanf("%d", &n);
    printf("请输入链表b的长度\n");
    scanf("%d", &m);
    printf("请输入链表a中的学生信息\n");
    stu *a = creat(n);
    printf("请输入链表b中的学生信息\n");
    stu *b = creat(m);
    printf("链表 a 学生信息\n学号\t姓名\t成绩1\t成绩2\t成绩3\n");
    print(a);
    printf("链表 b 学生信息\n学号\t姓名\t成绩1\t成绩2\t成绩3\n");
    print(b);
    printf("合并排序后为\n学号\t姓名\t成绩1\t成绩2\t成绩3\n");
    fun(a, b);
    print(a);
    system("pause");
    return 0;
}
//
// Created by imbytecat on 2020/5/30.
// 已有 a、b 两个链表。设结点为学号和姓名,从链表 a 中删除与链表 b 中相同学号的那些结点。
//

#include <cstdio>
#include <cstdlib>

struct Student { // 定义结构体Student
    int num;
    char name[20];
    Student *next;
};

void input(Student *stu, int n); // 定义输入函数
void print(Student *stu); // 定义输出函数
Student *del(Student *stu1, Student *stu2); // 定义删除结点函数,返回删除后a链表首地址
int main() {
    Student a[3], b[2]; // 定义结构体变量a和b
    input(a, 3); // 调用输入函数,输入a链表
    input(b, 2); // 调用输入函数,输入b链表
    print(del(a, b)); // 调用输出函数,参数为删除结点函数的返回指针值
    system("pause");
    return 0;
}

// 输入函数
void input(Student *stu, int n) {
    Student *p;
    int i;
    for (p = stu, i = 0; p < stu + n; p++, i++) {
        printf("Please enter No.%d student info: ", i + 1);
        scanf("%d %s", &p->num, p->name);
        i == n - 1 ? stu[i].next = NULL : stu[i].next = &stu[i + 1];
    }
}

// 输出函数
void print(Student *stu) {
    Student *p;
    for (p = stu; p != NULL; p = p->next) {
        printf("%d %s\n", p->num, p->name);
    }
}

// 删除结点函数
Student *del(Student *stu1, Student *stu2) {
    Student *p, *q, *head;
    int i;
    for (p = stu1, head = p, i = 1; p != NULL; p = p->next) {
        for (q = stu2; q != NULL; q = q->next) {
            if (p->num == q->num) { // 判断学号是否相符
                if (head == p) { // 判断是否为头指针,如果是头指针指向链表下一个地址
                    head = p->next;
                } else if (p->next == NULL) { // 判断是否为尾指针,如果是尾指针指向链表上一个地址
                    (p - i)->next = NULL; // i 的作用是判断链表之前是否有删除的结点
                } else { // 除以上条件外,链表上一结点指向下一个结点
                    (p - 1)->next = p->next;
                    i++;
                }
            }
        }
    }
    return head;
}
Responses