实验4
task1
1. int型数组a,在内存中是连续存放的,每个元素占用4个内存字节单元,数组名a对应的值,和&a[0]一样
2. char型数组b,在内存中是连续存放的,每个元素占用1个内存字节单元,数组名b对应的值,和&b[0]一样
3. int型二维数组a,在内存中按行连续存放,每个元素占用4个内存字节单元
数组名a的值、a[0]的值、 &a[0][0]的值,在数字字面值上一样
4. char型二维数组b,在内存中按行连续存放,每个元素占用1个内存字节单元
数组名b的值、b[0]的值、 &b[0][0]的值,在数字字面值上一样
5. 对于二维数组,a[0], a[1]的值之间相差4
b[0]和b[1]的值,它们之间相差1
相差一个sizeof(int)和sizeof(char)
task2
1 #include <stdio.h> 2 #include <string.h> 3 #define N 80 4 void swap_str(char s1[N], char s2[N]); 5 void test1(); 6 void test2(); 7 int main() { 8 printf("测试1: 用两个一维char数组,实现两个字符串交换\n"); 9 test1(); 10 printf("\n测试2: 用二维char数组,实现两个字符串交换\n"); 11 test2(); 12 return 0; 13 } 14 void test1() { 15 char views1[N] = "hey, C, I hate u."; 16 char views2[N] = "hey, C, I love u."; 17 printf("交换前: \n"); 18 puts(views1); 19 puts(views2); 20 swap_str(views1, views2); 21 printf("交换后: \n"); 22 puts(views1); 23 puts(views2); 24 } 25 void test2() { 26 char views[2][N] = {"hey, C, I hate u.", 27 "hey, C, I love u."}; 28 printf("交换前: \n"); 29 puts(views[0]); 30 puts(views[1]); 31 swap_str(views[0], views[1]); 32 printf("交换后: \n"); 33 puts(views[0]); 34 puts(views[1]); 35 } 36 void swap_str(char s1[N], char s2[N]) { 37 char tmp[N]; 38 strcpy(tmp, s1); 39 strcpy(s1, s2); 40 strcpy(s2, tmp); 41 }
函数模块swap_str()的形参是一维数组。为什么test1()和test2()模块中调用时,实参的书写形式一个不加[]、一个加[]?
因为test1中,view代表一个一维数组
而在test2中代表一个二维数组,view[x]则是一个一维数组
task3_1
1 #include <stdio.h> 2 #define N 80 3 int count(char x[]); 4 int main() { 5 char words[N + 1]; 6 int n; 7 while (gets(words) != NULL) { 8 n = count(words); 9 printf("单词数: %d\n\n", n); 10 } 11 return 0; 12 } 13 int count(char x[]) { 14 int i; 15 int word_flag = 0; // 用作单词标志,一个新单词开始,值为1;单词结束,值为0 16 int number = 0; // 统计单词个数 17 for (i = 0; x[i] != '\0'; i++) { 18 if (x[i] == ' ') 19 word_flag = 0; 20 else if (word_flag == 0) { 21 word_flag = 1; 22 number++; 23 } 24 } 25 return number; 26 }
task3_2
#include <stdio.h> #define N 1000 int main() { char line[N]; int word_len; // 记录当前单词长度 int max_len; // 记录最长单词长度 int end; // 记录最长单词结束位置 int i; while (gets(line) != NULL) { word_len = 0; max_len = 0; end = 0; i = 0; while (1) { // 跳过连续空格 while (line[i] == ' ') { word_len = 0; // 单词长度置0,为新单词统计做准备 i++; } // 在一个单词中,统计当前单词长度 while (line[i] != '\0' && line[i] != ' ') { word_len++; i++; } // 更新更长单词长度,并,记录最长单词结束位置 if (max_len < word_len) { max_len = word_len; end = i; // end保存的是单词结束的下一个坐标位置 } // 遍历到文本结束时,终止循环 if (line[i] == '\0') break; } // 输出最长单词 printf("最长单词: "); for (i = end - max_len; i < end; ++i) printf("%c", line[i]); printf("\n\n"); } return 0; }
task4
#include <stdio.h> #include <math.h> #define N 100 void dec_to_n(int x, int n); // 函数声明 int main() { int x; printf("输入一个十进制整数: "); while (scanf("%d", &x) != EOF) { dec_to_n(x, 2); // 函数调用: 把x转换成二进制输出 dec_to_n(x, 8); // 函数调用: 把x转换成八进制输出 dec_to_n(x, 16); // 函数调用: 把x转换成十六进制输出 printf("\n输入一个十进制整数: "); } return 0; } void dec_to_n(int x, int n) { char s[10] = { 0 }; int a[10]; int cnt = 0; while (x > 0) { a[cnt] = x % n; x /= n; cnt++; } for (int i = 0; i < cnt; i++) { s[i] = a[i] + 48; if (s[i] == ':') { s[i] = 'A'; } else if (s[i] == ';') { s[i] = 'B'; } else if (s[i] == '<') { s[i] = 'C'; } else if (s[i] == '=') { s[i] = 'D'; } else if (s[i] == '>') { s[i] = 'E'; } else if (s[i] == '?') { s[i] = 'F'; } } for (int cntt = cnt - 1; cntt >= 0; cntt--) { printf("%c", s[cntt]); } printf("\n"); }
task5
1 #include <stdio.h> 2 #define N 5 3 // 函数声明 4 void input(int x[], int n); 5 void output(int x[], int n); 6 double average(int x[], int n); 7 void bubble_sort(int x[], int n); 8 int main() { 9 int scores[N]; 10 double ave; 11 printf("录入%d个分数:\n", N); 12 input(scores, N); 13 printf("\n输出课程分数: \n"); 14 output(scores, N); 15 printf("\n课程分数处理: 计算均分、排序...\n"); 16 ave = average(scores, N); 17 bubble_sort(scores, N); 18 printf("\n输出课程均分: %.2f\n", ave); 19 printf("\n输出课程分数(高->低):\n"); 20 output(scores, N); 21 return 0; 22 } 23 // 函数定义 24 // 输入n个整数保存到整型数组x中 25 void input(int x[], int n) { 26 int i; 27 for (i = 0; i < n; ++i) 28 scanf("%d", &x[i]); 29 } 30 // 输出整型数组x中n个元素 31 void output(int x[], int n) { 32 int i; 33 for (i = 0; i < n; ++i) 34 printf("%d ", x[i]); 35 printf("\n"); 36 } 37 // 计算整型数组x中n个元素均值,并返回 38 double average(int x[], int n) { 39 double ave; 40 double sum = 0; 41 for (int cnt = 0; cnt < n; cnt++) { 42 sum += x[cnt]; 43 } 44 ave = 1.0 * sum / n; 45 return ave; 46 } 47 48 // 对整型数组x中的n个元素降序排序 49 void bubble_sort(int x[], int n) { 50 int round; 51 for (int cnt = 0; cnt < n; cnt++) { 52 round = n - cnt; 53 for (int cnt = 0; cnt < round; cnt++) { 54 if (x[cnt] <= x[cnt + 1]) { 55 int i = x[cnt]; 56 x[cnt] = x[cnt + 1]; 57 x[cnt + 1] = i; 58 } 59 } 60 } 61 return x; 62 }
task6
1 #include <stdio.h> 2 #include <string.h> 3 #define N 5 4 #define M 20 5 // 函数声明 6 void output(char str[][M], int n); 7 void bubble_sort(char str[][M], int n); 8 int main() { 9 char name[][M] = { "Bob", "Bill", "Joseph", "Taylor", "George" }; 10 int i; 11 printf("输出初始名单:\n"); 12 output(name, N); 13 printf("\n排序中...\n"); 14 bubble_sort(name, N); // 函数调用 15 printf("\n按字典序输出名单:\n"); 16 output(name, N); 17 return 0; 18 } 19 // 函数定义 20 // 功能:按行输出二维数组中的字符串 21 void output(char str[][M], int n) { 22 int i; 23 for (i = 0; i < n; ++i) 24 printf("%s\n", str[i]); 25 } 26 27 void bubble_sort(char str[][M], int n) { 28 int round; 29 for (int cnt = 0; cnt < n; cnt++) { 30 round = n - cnt; 31 for (int cnt = 0; cnt < round; cnt++) { 32 if (strcmp(str[cnt], str[cnt + 1]) > 0) { 33 char i[M]; 34 strcpy(i, str[cnt + 1]); 35 strcpy(str[cnt + 1], str[cnt]); 36 strcpy(str[cnt], i); 37 } 38 } 39 } 40 }
task7
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 char a[110]; 6 while (scanf("%s", a) != EOF) { 7 int flag = 0; 8 for (int n = 0; n < strlen(a); n++) { 9 for (int s = n + 1; s < strlen(a); s++) { 10 if (a[n] == a[s]) { 11 flag = 1; 12 break; 13 } 14 } 15 if (flag == 1) { 16 break; 17 } 18 } 19 if (flag == 1) { 20 printf("YES\n\n"); 21 } 22 else if (flag == 0) { 23 printf("NO\n\n"); 24 } 25 } 26 return 0; 27 }
task8
1 #include <stdio.h> 2 #include <string.h> 3 #define N 100 4 #define M 4 5 void output(int x[][N], int n); // 函数声明 6 void rotate_to_right(int x[][N], int n); // 函数声明 7 int main() { 8 int t[][N] = { {21, 12, 13, 24}, 9 {25, 16, 47, 38}, 10 {29, 11, 32, 54}, 11 {42, 21, 33, 10} }; 12 printf("原始矩阵:\n"); 13 output(t, M); // 函数调用 14 rotate_to_right(t, M); // 函数调用 15 printf("变换后矩阵:\n"); 16 output(t, M); // 函数调用 17 return 0; 18 } 19 // 函数定义 20 // 功能: 输出一个n*n的矩阵x 21 void output(int x[][N], int n) { 22 int i, j; 23 for (i = 0; i < n; ++i) { 24 for (j = 0; j < n; ++j) 25 printf("%4d", x[i][j]); 26 printf("\n"); 27 } 28 } 29 30 void rotate_to_right(int x[][N], int n) { 31 int mid[M]; 32 for (int j = 0; j < n; j++) { 33 mid[j] = x[j][M - 1]; 34 } 35 for (int j = 0; j < n; j++) { 36 for (int i = n-1; i >= 1; i--) { 37 x[j][i] = x[j][i - 1]; 38 } 39 } 40 for (int i = 0; i < n; i++) { 41 x[i][0] = mid[i]; 42 } 43 }
task9
1 #include <stdio.h> 2 int main() 3 { 4 int a[110][110] = { 0 }; 5 int n; 6 while (scanf("%d", &n) != EOF) { 7 int nn = n * n; 8 a[0][(n - 1) / 2] = 1; 9 int i, j; 10 int count = 2; 11 i = 0; 12 j = (n - 1) / 2; 13 while (count <= nn) { 14 i--; 15 j++; 16 if (i == -1) { 17 i += n; 18 } 19 if (j == n) { 20 j -= n; 21 } 22 if (a[i][j] != 0) { 23 i++; 24 j--; 25 if (i == n) { 26 i -= n; 27 } 28 if (j == -1) { 29 j += n; 30 } 31 i++; 32 } 33 34 a[i][j] = count; 35 count++; 36 } 37 38 for (i = 0; i < n; i++) { 39 for (j = 0; j < n; j++) { 40 printf("%d\t", a[i][j]); 41 } 42 printf("\n"); 43 } 44 int sum = 0; 45 for (i = 0; i < n; i++) { 46 sum += a[0][i]; 47 } 48 printf("相同的和为:%d\n", sum); 49 for (i = 0; i < n; i++) { 50 for (j = 0; j < n; j++) { 51 a[i][j] = 0; 52 } 53 } 54 } 55 return 0; 56 }