一、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;
}