C語言經典編程之數組,編程數組
1、元素互換
定義一個整型數組num[10],隨機初始化數組中元素值,然後將頭尾元素兩兩互換,將交換後的數組值輸出。
【代碼】
#include <stdio.h>int main(void){ int num[10] = {}; int i = 0; int temp; for(i = 0; i < 10; i++) { scanf("%d", &num[i]); } for(i = 0; i < 10 / 2; i++) { temp = num[i]; num[i] = num[9 - i]; num[9 - i] = temp; } for(i = 0; i < 10; i++) { printf("%d ", num[i]); } printf("\n"); return 0;}
2、矩陣翻轉
定義一個二維數組a[3][4],隨機初始化數組中的元素值,然後將a數組舉證翻轉後存入到b[4][3]中,並將b輸出。
【分析】
輸入:
3 5 1 4
7 2 6 8
0 9 4 6
輸出:
3 7 0
5 2 9
1 6 4
4 8 6
【代碼】
#include <stdio.h>int main(void){ int a[3][4] = {}; int b[4][3] = {}; int i = 0; int j = 0; int temp; for(i = 0; i < 3; i++) { for(j = 0; j < 4; j++) { scanf("%d", &a[i][j]); } } for(i = 0; i < 3; i++) { for(j = 0; j < 4; j++) { b[j][i] = a[i][j]; } } for(i = 0; i < 4; i++) { for(j = 0; j < 3; j++) { printf("%d ", b[i][j]); } printf("\n"); } printf("\n"); return 0;}
3、圍圈報數
有m個人圍成一圈,開始報數,報到n,退出,問最後剩下的是幾號。(從1號開始)
【分析】
將m個人存到一個數組a[m]中,並將其中的所有元素都記為1,當開始報數,報到n時,該人退出,即將該元素的值置為0。當報數報到數組的最後一個元素時,重新返回第一個元素報數。以此重複,直至剩下最後一個值為1的元素。
【代碼】
#include <stdio.h>int main(void){ int m = 0;//人數 int n = 0;//報數 int a[10] = {}; int i = 0, j = 0, k = 0;//k表示目前出圈的人數// printf("input:"); scanf("%d %d", &m, &n);// printf("input:"); for(i = 1; i <= m; i++) { a[i] = 1; } i = 1; while(1) { if(a[i] == 1) { j++; } if(j == n) { a[i] = 0; j = 0; k++; } if(k == m - 1) break; i++; if(i > m) { i = 1; } }// printf("output:\n"); for(i = 1; i <= m; i++) { if(a[i] == 1) printf("%d\n", i); } return 0;}
4、遞增、遞減序列
輸入十個數,任意相鄰的兩個數不同,輸出所有的遞增,遞減序列。
【分析】
輸入:
1 5 9 8 12 21 3 0 -1 9
輸出:
1 5 9
9 8
8 12 21
21 3 0 -1
-1 9
【代碼】
#include <stdio.h>int main(void){ int i, k = -1; int a[10]; for(i = 0; i < 10; i++) { scanf("%d", &a[i]); } for(i = 1; i < 10; i++) { if(k == (a[i] > a[i - 1])) { printf(" %d", a[i]); } else { k = (a[i] > a[i - 1]); printf("\n%d %d", a[i - 1], a[i]); } } printf("\n"); return 0;}
5、出現次數最多的數
輸入10個數,找出出現次數最多的數(如果多個並列,則按數字出現順序分別輸出)
【分析】
輸入:
1 5 27 33 24 1 27 18 19 20
輸出:
1 27
【代碼】
#include <stdio.h>int main(void){ int a[10]; int i = 0, j = 0; int count[10] = {1,1,1,1,1,1,1,1,1,1}; int max = 0; for(i = 0; i < 10; i++) { scanf("%d", &a[i]); } for(i = 0; i < 9; i++) { //count[i] = 0; for(j = i + 1; j < 10; j++) { if(a[i] == a[j]) { if(count[i] != 0) { count[i] ++; } count[j] = 0; } } /* for(i = 0; i < 10; i++) { if(count[i] != 0) { printf("%d ", a[i]); } }*/ max = 0; for(i = 1; i < 10; i++) { if(count[i] > count[max]) { max = i; } } for(i = 0; i < 10; i++) { if(count[i] == count[max]) { printf("%d ", a[i]); } } return 0;}
6、螺旋型NxN矩陣
輸入兩個數,第一個數決定一個nXn的矩陣,第二個數決定從1開始賦值,賦值的上限。
【分析】
輸入:
5 23
輸出:
1 2 3 4 5
16 17 18 19 6
15 0 0 20 7
14 23 22 21 8
13 12 11 10 9
【代碼】
#include <stdio.h>int main(void){ int i, j, r = 1; int k = 1; int n, m; int a[20][20] = {}; scanf("%d %d", &n, &m); for(j = 0; j < n; j++) { a[0][j] = k++; } for(i = n - 1; i >= n / 2; i --) { for(j = r; j <= i; j++) { a[j][i] = k++; } for(j = i; j >= r; j--) { a[i][j - 1] = k++; } for(j = i; j > r; j--) { a[j - 1][r - 1] = k++; } for(j = r; j < i; j++) { a[r][j] = k++; } r ++; } for(i = 0; i < n; i ++) { for(j = 0; j < n; j ++) { if(a[i][j] > m) { a[i][j] = 0; } printf("%3d", a[i][j]); } printf("\n"); } return 0;}
7、數組插值
有一個已經排好序的數組。現輸入一個數,要求按原來的規律將它插入數組中。
【難度係數】▲▲
【分析】
【代碼】
#include <stdio.h>int main(void){int arr[5] = {1,2,3,5,6};int i = 0;int index = 0;int num = 0;scanf("%d", &num);//找到應該插入的位置for(i = 0; i < 5; i ++){if(num < arr[i]){index = i;break;}}//如果num應該插入下標為0~4的位置,則進行插入//否則不插入if(i != 5){for(i = 4; i > index; i --){arr[i] = arr[i - 1];}arr[index] = num;}for(i = 0; i < 5; i ++){printf("%d ", arr[i]);}printf("\n");return 0;}
8、數組逆序
將一個數組逆序
【難度係數】▲▲▲
【分析】
【代碼】
#include <stdio.h>int main(void){int arr[] = {1,2,3,4,5,6};int i = 0;int temp = 0;int len = sizeof(arr)/sizeof(arr[0]);for(i = 0; i < len/2; i ++){temp = arr[i];arr[i] = arr[len - 1 - i];arr[len - 1 - i] = temp;}for(i = 0; i < len; i ++){printf("%d ", arr[i]);}printf("\n");return 0;}
9、楊輝三角
列印出楊輝三角形(要求列印出10行如)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
【難度係數】▲▲▲▲▲
【分析】
楊輝三角:
規律:
當為第一列或者是行和列相等時值為1
否則 a[i][j] = a[i - 1][j - 1] + a[i - 1][j]
【代碼】
#include <stdio.h>int main(void){int arr[10][10] = {};int i, j;for(i = 0; i < 10; i ++){for(j = 0; j <= i; j ++){if(j == 0 || i == j)arr[i][j] = 1;elsearr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];printf("%4d", arr[i][j]);}printf("\n");}return 0;}
10、尾數前置
有n個整數,使其前面各數順序向後移m個位置,最後m個數變成最前面的m個數。
【難度係數】▲▲▲▲
【分析】
C語言規定:聲明數組時,數組的長度必須是常量,但是gcc編譯器允許聲明數組時包含變數,但是在聲明數組之前變數必須被賦值且一旦聲明,數組的長度不能再改變,聲明數組時不能被初始化,但後面可以賦值。
【代碼】
#include <stdio.h>void arr_move(int arr[], int len, int m){int i = 0, j = 0;int temp = 0;for(i = len - m; i < len; i ++){temp = arr[i];for(j = i; j > i - (len - m); j --){arr[j] = arr[j - 1];}arr[j] = temp;}}int main(void){int n = 0;int i = 0;int m = 0;scanf("%d", &n);int arr[n];for(i = 0; i < n; i ++){arr[i] = i + 1;printf("%d ", arr[i]);}printf("\n");scanf("%d", &m);arr_move(arr, n, m);for(i = 0; i < n; i ++){printf("%d ", arr[i]);}printf("\n");return 0;}
11、統計字串
輸入一行字元,最大長度為100,統計出其中有多少個字串,不算標點。例如:
輸入:Hi, Welcome to saif!!
輸出:4
【難度係數】▲▲▲
【分析】
【代碼】
#include <stdio.h>int is_alpha(char ch){if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') return 1;elsereturn 0;}int is_digit(char ch){if(ch >= '0' && ch <= '9')return 1;elsereturn 0;}int is_biaodian(char ch){if(ch < '0' || ch > '9' && ch < 'A' || ch > 'Z' && ch < 'a' || ch > 'z')return 1;else return 0;}int main(void){char str[100] = {};int counter = 0;int i = 0;scanf("%[^\n]", str);while(str[i] != '\0'){if((is_alpha(str[i]) || is_digit(str[i]))&& is_biaodian(str[i + 1])){counter ++;}i ++;}printf("\n%d\n", counter);return 0;}
12、找長度最長的字串
輸入一行字元,找出其中長度最大的單詞。要求從鍵盤輸入一行字元,列印出其中長度最大的字串。例如:
輸入:when i was young i'd listen to the radio waiting for my favorite songs
輸出:favorite
【難度係數】▲▲▲▲
【分析】
【代碼】
#include <stdio.h>int main(void){char str[100] = {};int i = 0;int counter = 0;int max = 0;int index = 0;int pos = 0;scanf("%[^\n]", str);while(1){if(str[i] != ' '){counter ++;printf("counter = %d\n", counter);}if(str[i] == ' ' || str[i] == '\0'){if(max < counter){max = counter;index = pos;printf("max = %d, index = %d\n", max, index);}}if(str[i] == ' ' && str[i + 1] != ' '){pos = i + 1;counter = 0;printf("pos = %d\n", pos);}if(str[i] == '\0')break;i ++;}i = index;while(str[i] != ' ' && str[i] != '\0'){printf("%c", str[i]);i ++;}printf("\n");return 0;}
13、矩陣轉置
例如:
1 2 3 4 1 5 3 4
5 6 7 8 ->2 6 2 7
3 2 5 9 3 7 5 2
4 7 2 3 4 8 9 3
【難度係數】▲▲▲▲
【分析】
【代碼】
#include <stdio.h>int main(void){int n = 0;int i, j;int temp = 0;scanf("%d", &n);int arr[n][n];for(i = 0; i < n; i ++){for(j = 0; j < n; j ++){scanf("%d", &arr[i][j]);}}for(i = 0; i < n; i ++){for(j = 0; j < n; j ++){printf("%d", arr[i][j]);}printf("\n");}for(i = 0; i < n; i ++){for(j = 0; j < i; j ++){temp = arr[i][j];arr[i][j] = arr[j][i];arr[j][i] = temp;}}for(i = 0; i < n; i ++){for(j = 0; j < n; j ++){printf("%d", arr[i][j]);}printf("\n");}return 0;}