一、C数组:
C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
声明数组
在 C 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:
type arrayName [ arraySize ];
初始化数组
在 C 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
访问数组元素
数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:
double salary = balance[9];
获取数组长度
数组长度可以使用 sizeof 运算符来获取数组的长度,例如:
int numbers[] = {1, 2, 3, 4, 5}; int length = sizeof(numbers) / sizeof(numbers[0]);
利用数组解决问题:
1.将数组逆序重存放:
#include <stdio.h>int main() {int n;int a[500];scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);}for (int i = n; i >= 1; i--) {printf("%d ", a[i]);}return 0;
}
2.年龄与疾病:
#include <stdio.h>int main() {int a;scanf("%d", &a);int arr[100];float count18 = 0;float count35 = 0;float count60 = 0;float count61 = 0;for (int i = 0; i < a; i++) {scanf("%d", &arr[i]);int age = arr[i];for (int i = 0; i < a; i++) {if ( age <= 18) {count18++;} else if ( age <= 35) {count35++;} else if (age <= 60) {count60++;} else {count61++;}}}printf("%.2f%%\n", count18 / a * 10 );printf("%.2f%%\n", count35 / a * 10 );printf("%.2f%%\n", count60 / a * 10 );printf("%.2f%%\n", count61 / a * 10 );}
3.向量点积计算:
#include <stdio.h>
int main() {int a;scanf("%d", &a);int arr[1000];int brr[1000];for (int i = 0; i < a; i++) {scanf("%d", &arr[i]);}for (int i = 0; i < a; i++) {scanf("%d", &brr[i]);}int num = 0;for (int i = 0; i < a; i++) {num += arr[i] * brr[i];}printf("%d\n", num);}
4.开关灯:
错误提交代码:
#include <stdio.h>int main() {int N;scanf("%d", &N);int arr[5000];for (int i = 1; i * i <= N; i++) {printf("%d", i * i);}
}
错误原因:
仅寻找表层规律,认为只需要输出样例范围内给出的平方数,不可能适用于所有条件,遗憾仅得10分。
改正代码:
#include <stdio.h>
#include <stdbool.h>int main() {int N;scanf("%d", &N);// 初始化灯的状态:true表示开,false表示关,初始全部为开bool light[N];for (int i = 1; i <= N; ++i) {light[i] = true;}for (int k = 1; k <= N; ++k) {for (int i = k; i <= N; i += k) {light[i] = !light[i];}}bool isFirst = true;for (int i = 1; i <= N; ++i) {if (!light[i]) {if (isFirst) {printf("%d", i);isFirst = false;} else {printf(" %d", i);}}}return 0;
}
二、字符串:
C 字符串
在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。
空字符(Null character)又称结束符,缩写 NUL,是一个数值为 0 的控制字符,\0 是转义字符,意思是告诉编译器,这不是字符 0,而是空字符。
下面的声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末尾存储了空字符 \0,所以字符数组的大小比单词 RUNOOB 的字符数多一个。
char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
依据数组初始化规则,您可以把上面的语句写成以下语句:
char site[] = "RUNOOB";
C 中有大量操作字符串的函数:
序号 | 函数 & 目的 |
---|---|
1 | strcpy(s1, s2); 复制字符串 s2 到字符串 s1。 |
2 | strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。 |
3 | strlen(s1); 返回字符串 s1 的长度。 |
4 | strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。 |
5 | strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。 |
6 | strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。 |
下面的实例使用了上述的一些函数:
实例
#include <stdio.h>
#include <string.h>int main ()
{char str1[14] = "runoob";char str2[14] = "google";char str3[14];int len ;/* 复制 str1 到 str3 */strcpy(str3, str1);printf("strcpy( str3, str1) : %s\n", str3 );/* 连接 str1 和 str2 */strcat( str1, str2);printf("strcat( str1, str2): %s\n", str1 );/* 连接后,str1 的总长度 */len = strlen(str1);printf("strlen(str1) : %d\n", len );return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
strcpy( str3, str1) : runoob strcat( str1, str2): runoobgoogle strlen(str1) : 12
利用字符串解决问题:
1.统计数字字符个数:
#include <stdio.h>
#include <string.h>int main() {char arr[500];scanf("%[^\n]", &arr);int len = strlen(arr);int count = 0;for (int i = 0; i < len; i++) {char c = arr[i];if (c >= '0' && c <= '9') {count++;}}printf("%d", count);return 0;
}
2.输出亲朋字符串:
#include <stdio.h>
#include <cstring>int main() {char s[1000];scanf("%s", s);int len = strlen(s);for (int i = 0; i < len; i++) {char c = s[i];// 获取当前索引i对应的字符char n;// 定义变量n,用于存储下一个字符// 判断当前字符是否是字符串的最后一个字符if (i == len - 1) {n = s[0];// 如果是最后一个字符,下一个字符取第一个字符} else {n = s[i + 1];//否则下一个字符取当前字符的后一位字符}printf("%c", c + n);// 输出当前字符c与下一个字符n的ASCII值相加后得到的新字符}return 0;
}