【重拾C语言】六、批量数据组织(三)数组初值;字符串、字符数组、字符串数组;类型定义 typedef

2024-07-30 08:48:47 浏览数 (1)

前言

本文介绍了C语言:数组初值;字符串、字符数组、字符串数组;类型定义 typedef

六、批量数据组织——数组

6.1~3 数组基础知识

【重拾C语言】六、批量数据组织(一)数组(数组类型、声明与操作、多维数组;典例:杨辉三角、矩阵乘积、消去法)-CSDN博客

https://blog.csdn.net/m0_63834988/article/details/133580645?spm=1001.2014.3001.5502

6.4 线性表——分类与检索

【重拾C语言】六、批量数据组织(二)线性表——分类与检索(主元排序、冒泡排序、插入排序、顺序检索、对半检索)_QomolangmaH的博客-CSDN博客

https://blog.csdn.net/m0_63834988/article/details/133620693?spm=1001.2014.3001.5501

6.5 带学号的成绩排序—数组初值

编程序,输入一个班50名学生的”程序设计基础”课程成绩,按成绩由高到低的顺序输出,要求同时输出每个成绩是哪个学生的:

代码语言:javascript复制
#include <stdio.h>

void bubbleSort(int studentIDs[], float scores[], int n) {
    int i, j;
    for (i = 0; i < n-1; i  ) {
        for (j = 0; j < n-i-1; j  ) {
            if (scores[j] < scores[j 1]) {
                // 交换两个学生的成绩
                float tempScore = scores[j];
                scores[j] = scores[j 1];
                scores[j 1] = tempScore;

                // 交换两个学生的学号
                int tempID = studentIDs[j];
                studentIDs[j] = studentIDs[j 1];
                studentIDs[j 1] = tempID;
            }
        }
    }
}

int main() {
    int studentIDs[50];
    float scores[50];
    int i;

    // 输入学生的学号和成绩
    for (i = 0; i < 50; i  ) {
        printf("请输入第%d个学生的学号和成绩:", i 1);
        scanf("%d %f", &studentIDs[i], &scores[i]);
    }

    // 对成绩进行排序
    bubbleSort(studentIDs, scores, 50);

    // 输出排序后的成绩和学生信息
    printf("按成绩由高到低排序后的结果为:n");
    for (i = 0; i < 50; i  ) {
        printf("学生学号:%d,成绩:%.2fn", studentIDs[i], scores[i]);
    }

    return 0;
}

6.6 表示姓名—字符串

在C语言中,字符串是由字符组成的数组。可以使用字符数组来表示姓名。例如,可以定义一个字符数组来存储姓名,并对其进行操作和处理。

代码语言:javascript复制
#include <stdio.h>
#include <string.h>

int main() {
    char name[50]; // 定义一个字符数组来存储姓名,数组大小根据实际情况确定

    printf("请输入姓名:");
    scanf("%s", name); // 从用户输入中读取姓名并存储到字符数组中

    printf("您输入的姓名是:%sn", name); // 输出姓名

    int length = sizeof(name) / sizeof(name[0]); // 计算数组的长度
    printf("姓名数组的长度是:%dn", length);
    int length1 = strlen(name); // 计算姓名字符串的长度
    printf("姓名占用的长度是:%dn", length1);

    return 0;
}
6.6.0 字符串、字符数组和字符串数组
  • 字符串(String):
    • 字符串是由字符组成的字符数组。
    • 字符串以null字符('')作为结束符,表示字符串的结束。
    • 字符串可以使用双引号括起来表示,例如:"Hello, World!"。
    • C语言提供了一系列的字符串操作函数,如strcpystrcmp等,用于处理字符串。
  • 字符数组(Character Array):
    • 字符数组是一维数组,每个元素都是字符类型
    • 字符数组可以存储一串字符,但没有结束符来标识字符串的结束
    • 字符数组可以用于存储单个字符串,或者作为其他数据结构的组成部分。
  • 字符串数组(String Array):
    • 字符串数组是一个二维字符数组,每个元素都是一个字符串(字符数组)
    • 字符串数组用于存储多个字符串,每个字符串占据数组的一个元素。
    • 字符串数组的每个元素(字符串)可以具有不同的长度。
    • 字符串数组可以用于存储一系列相关的字符串,例如存储学生的姓名、存储文件中的多行文本等。
    • 字符串操作函数可以对字符串数组的每个元素进行操作。
代码语言:javascript复制
#include <stdio.h>
#include <string.h>

int main() {
    // 字符串
    char str[] = "Hello, World!";
    printf("字符串: %sn", str);

    // 字符数组
    char charArr[] = {'H', 'e', 'l', 'l', 'o', ''};
    printf("字符数组: %sn", charArr);

    // 字符串数组
    char strArr[][20] = {"Apple", "Banana", "Orange"};
    int numStrings = sizeof(strArr) / sizeof(strArr[0]);
    printf("字符串数组:n");
    for (int i = 0; i < numStrings; i  ) {
        printf("%sn", strArr[i]);
    }

    return 0;
}
6.6.1 字符串操作(复制、连接、比较)

C语言提供了许多用于字符串操作的库函数,例如字符串的复制、连接、比较等。可以使用这些函数来对字符串进行各种操作。

代码语言:javascript复制
#include <stdio.h>
#include <string.h>

int main() {
    char str1[50] = "Hello";
    char str2[50] = "World";

    // 字符串复制
    strcpy(str1, str2);
    printf("复制后的字符串: %sn", str1);

    // 字符串连接
    strcat(str1, str2);
    printf("连接后的字符串: %sn", str1);

    // 字符串比较
    int result = strcmp(str1, str2);
    if (result == 0) {
        printf("字符串相等n");
    } else if (result < 0) {
        printf("字符串1小于字符串2n");
    } else {
        printf("字符串1大于字符串2n");
    }

    return 0;
}
6.6.2 回文字

回文字是指正序和逆序相同的字符串。可以编写一个函数来判断一个字符串是否为回文字:

代码语言:javascript复制
#include <stdio.h>
#include <string.h>

int isPalindrome(char str[]) {
    int len = strlen(str);
    int i, j;

    for (i = 0, j = len - 1; i < j; i  , j--) {
        if (str[i] != str[j]) {
            return 0; // 不是回文字,返回0
        }
    }

    return 1; // 是回文字,返回1
}

int main() {
    char str[50];

    printf("请输入一个字符串:");
    scanf("%s", str);

    if (isPalindrome(str)) {
        printf("是回文字n");
    } else {
        printf("不是回文字n");
    }

    return 0;
}
6.6.3 成绩单(字符串数组)

字符串数组

编程序,输入一个班50名学生的成绩,按成绩由高到低的顺序 输出每名学生的学号、 姓名、成绩:

代码语言:javascript复制
#include <stdio.h>
#include <string.h>

#define MAX_STUDENTS 50
#define MAX_NAME_LENGTH 50

void sortStudents(char students[][MAX_NAME_LENGTH 1], int scores[], int numStudents) {
    int i, j;
    char temp[MAX_NAME_LENGTH 1];
    int tempScore;

    for (i = 0; i < numStudents - 1; i  ) {
        for (j = 0; j < numStudents - i - 1; j  ) {
            if (scores[j] < scores[j   1]) {
                strcpy(temp, students[j]);
                strcpy(students[j], students[j   1]);
                strcpy(students[j   1], temp);

                tempScore = scores[j];
                scores[j] = scores[j   1];
                scores[j   1] = tempScore;
            }
        }
    }
}

int main() {
    char students[MAX_STUDENTS][MAX_NAME_LENGTH 1];
    int scores[MAX_STUDENTS];
    int numStudents, i;

    printf("请输入学生人数(最多50人):");
    scanf("%d", &numStudents);

    if (numStudents > MAX_STUDENTS) {
        printf("学生人数超过最大限制。n");
        return 0;
    }

    for (i = 0; i < numStudents; i  ) {
        printf("请输入第%d名学生的学号:", i   1);
        scanf("%s", students[i]);
        printf("请输入第%d名学生的成绩:", i   1);
        scanf("%d", &scores[i]);
    }

    sortStudents(students, scores, numStudents);

    printf("n按成绩由高到低的顺序输出学生信息:n");
    printf("学号t成绩n");
    for (i = 0; i < numStudents; i  ) {
        printf("%st%dn", students[i], scores[i]);
    }

    return 0;
}

结构体

可以使用结构体来表示成绩单,结构体可以包含姓名、科目和成绩等信息:

代码语言:javascript复制
#include <stdio.h>

struct Score {
    char name[50];
    char subject[50];
    int score;
};

int main() {
    struct Score score1;

    printf("请输入姓名:");
    scanf("%s", score1.name);

    printf("请输入科目:");
    scanf("%s", score1.subject);

    printf("请输入成绩:");
    scanf("%d", &score1.score);

    printf("姓名:%sn", score1.name);
    printf("科目:%sn", score1.subject);
    printf("成绩:%dn", score1.score);

    return 0;
}

(关于结构体的具体使用详见本系列后文)

6.7 类型定义

  • C提供了丰富的数据类型,包括简单数据类型、构造型数据类型等。这些数据类型有些是基本数据类型,有些是用户自定义的数据类型。
  • 到目前为止,对用户自定义的数据类型,都是直接定义它的结构,并直接说明相应类型的变量。
  • 类型定义以保留字 typedef 为引导
    • 可以给用户自定义类型定义名字
    • 或给已经有名字的类型定义别名
代码语言:javascript复制
#include <stdio.h>

typedef int Length; // 定义类型别名 Length,代表长度

int main() {
    Length len = 10; // 使用类型别名 Length

    printf("长度:%dn", len);

    return 0;
}

输出:

代码语言:javascript复制
长度:10

注意:一定要把类型名与变量名区别开

  • 一个类型可以有名字,它只是表示一种数据结构的一个框架,而不存在一个实体,不给它分配存储空间。
  • 只有变量才是一个实体,它具有一块存储空间,并且该块存储空间的结构是相应数据类型的。任何一个类型可以有多个变量,每个变量都具有一块存储空间。
  • 类型定义只定义一个标识符是某类型的名字,只定义了相应框架的一个同义语。即所定义的标识符具有相应类型表示的框架结构。但它没有一个实体,没有一块存储空间,亦即没有具体表示一个变量。

0 人点赞