1. 定义一维数组
在C语言中,一维数组是具有相同数据类型的元素的有序集合。定义一维数组的基本语法如下:
data_type array_name[array_size];
其中:
data_type
是数组元素的数据类型,可以是整数、浮点数、字符等。array_name
是数组的名称,你可以自定义。array_size
是数组的大小,指定了数组可以容纳的元素数量。
例 1:对 10 个数组元素依次赋值为0、1、2、3、4、5、6、7、8、9并按倒序输出。
#include <stdio.h>
int main() {
int i;
int a[10]; // 定义一个包含10个整数的数组
// 使用循环为数组元素赋值
for (i = 0; i < 10; i++) {
a[i] = i; // 数组的每个元素赋值为它的索引
}
// 倒序输出数组元素
for (i = 9; i >= 0; i--) {
printf("%d\t", a[i]); // 输出数组元素的值
}
printf("\n");
return 0;
}
运行结果:
例 2:输入 10 个地区的面积(面积为整数),对它们由小到大排序并输出排序后的结果。
用两种不同的排序算法,一种是选择排序,另一种是冒泡排序。
选择法(选择排序):
#include<stdio.h>
int main()
{
int a[10];
int i, j, t;
// 输入10个面积值
printf("请输入10个面积:\n");
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
// 选择排序算法
for (i = 0; i < 9; i++) {
for (j = i + 1; j < 10; j++) {
if (a[i] > a[j]) {
// 交换元素
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
// 输出排序后的面积值
printf("排序后的面积依次是:\n");
for (i = 0; i < 10; i++)
printf("%d\t", a[i]);
printf("\n");
return 0;
}
运行结果:
冒泡法(沉底法、冒泡排序):
#include<stdio.h>
int main()
{
int a[10];
int i, j, t;
// 输入10个面积值
printf("请输入10个面积:\n");
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
// 冒泡排序算法
for (j = 0; j < 9; j++) {
for (i = 0; i < 9 - j; i++) {
if (a[i] > a[i + 1]) {
// 交换元素
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
// 输出排序后的面积值
printf("排序后的面积依次是:\n");
for (i = 0; i < 10; i++)
printf("%d\t", a[i]);
printf("\n");
return 0;
}
运行结果:
选择排序的原理是从未排序部分找到最小值,然后与未排序部分的第一个元素交换,然后将未排序部分缩小,继续这个过程,直到整个数组排序完成。而冒泡排序的原理是比较相邻的元素,如果顺序不对则交换它们,这个过程一直重复,直到整个数组排序完成。
两者的核心思想不同,选择排序每轮只选择一个最小值,而冒泡排序每轮都可能有多次交换操作。这两种算法都可以正确地对输入的面积值进行排序,但选择排序在每轮中只交换一次元素,而冒泡排序可能在每轮中交换多次元素。
2. 定义二维数组
与一维数组类似,二维数组是一个具有两个维度的数组。它通常用于表示矩阵或表格数据。定义二维数组的语法如下:
data_type array_name[row_size][column_size];
其中:
data_type
是数组元素的数据类型,同样可以是整数、浮点数、字符等。array_name
是数组的名称。row_size
和column_size
分别表示二维数组的行数和列数。
例如,定义一个3x3的整数二维数组:
int matrix[3][3];
例1:将一个二维数组
的行列元素互换,存到另一个二维数组 b 中并输出。
#include <stdio.h>
int main() {
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
int b[3][2];
int i, j;
// 使用循环将数组a转置为数组b
for (i = 0; i <= 1; i++) {
for (j = 0; j <= 2; j++) {
b[j][i] = a[i][j];
}
}
// 输出数组b
printf("数组 b 为:\n");
for (j = 0; j <= 2; j++) {
for (i = 0; i <= 1; i++) {
printf("%d\t", b[j][i]);
}
printf("\n");
}
return 0;
}
运行结果:
例 2:已知矩阵
,请编程求出其中值最大的那个元素。
#include <stdio.h>
int main() {
int i, j, max;
int a[3][3] = {{1, 2, 3}, {9, 8, 7}, {-10, 10, -5}};
// 假设最大值为数组的第一个元素
max = a[0][0];
// 使用嵌套循环遍历数组,找到最大值
for (i = 0; i <= 2; i++) {
for (j = 0; j <= 2; j++) {
if (a[i][j] > max) {
max = a[i][j];
}
}
}
// 输出最大值
printf("最大元素的值为 %d\n", max);
return 0;
}
运行结果:
3. 定义字符数组
字符数组是一种特殊的数组,用于存储字符串。字符串是字符的序列,以空字符 '\0'
结尾。定义字符数组的方式如下:
char string_name[length];
其中:
char
表示字符数组的元素类型。string_name
是字符数组的名称。length
是字符数组的长度,包括字符串末尾的空字符'\0'
。
例如,定义一个存储名字的字符数组:
char name[20];
例1:定义一个存储名字的字符数组
#include <stdio.h>
int main() {
// 声明并初始化一个字符数组来存储名字
char name[20]; // 假设名字最多包含19个字符,留一个位置给空字符 '\0'
// 输入名字
printf("请输入你的名字: ");
scanf("%19s", name); // 限制输入的字符数不超过19个,并自动在末尾添加 '\0'
// 打印名字
printf("你好,%s!\n", name);
return 0;
}
运行结果:
4. 输出字符数组
要输出字符数组,你可以使用C语言的标准库函数 printf()
。以下是一个示例:
char name[] = "John";
printf("Name: %s\n", name);
这将输出:Name: John
例1:定义一个字符串“Hi,Everybody!!”,然后输出这个字符串。
#include<stdio.h>
int main() {
char c[15] = {'H', 'i', ',', ' ', 'E', 'v', 'e', 'r', 'y', 'b', 'o', 'd', 'y', '!', '!'};
int i;
for (i = 0; c[i] != '\0'; i++) {
printf("%c", c[i]);
}
printf("\n");
return 0;
}
运行结果:
例2:输出一个
图案
#include<stdio.h>
int main() {
char c[3][3] = {{' ', '*', ' '}, {'*', ' ', '*'}, {' ', '*', ' '}};
int i, j;
for (i = 0; i <= 2; i++) {
for (j = 0; j <= 2; j++) {
printf("%c", c[i][j]);
}
printf("\n");
}
return 0;
}
运行结果:
5. 输入字符数组
要从用户那里接收输入并存储到字符数组中,可以使用标准库函数 scanf()
或 gets()
。以下是一个示例:
使用 scanf()
:
char name[20];
printf("Enter your name: ");
scanf("%s", name);
使用 gets()
(注意:不建议使用,因为它存在安全问题):
char name[20];
printf("Enter your name: ");
gets(name);
例1:输入一行由空格和单词组成的字符(字符数在 80 以内), 请统计有多少个单词。
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main() {
char input[80]; // 声明一个字符数组来存储输入
int wordCount = 0; // 用于统计单词数量
bool inWord = false; // 用于标记是否在单词中
// 提示用户输入字符数组
printf("请输入一行由空格和单词组成的字符 (最多80个字符):\n");
// 使用fgets函数获取用户输入
fgets(input, sizeof(input), stdin);
// 去掉输入中的换行符
size_t len = strlen(input);
if (len > 0 && input[len - 1] == '\n') {
input[len - 1] = '\0';
}
// 遍历输入的字符数组来统计单词数量
for (int i = 0; i < len; i++) {
if (input[i] == ' ' || input[i] == '\t') {
// 遇到空格或制表符,标记不在单词中
inWord = false;
} else {
if (!inWord) {
// 进入新单词,增加单词数量
wordCount++;
inWord = true;
}
}
}
// 输出统计结果
printf("输入的字符包含 %d 个单词。\n", wordCount);
return 0;
}
运行结果: