实验4
task1_1
1 #include<stdio.h> 2 #define N 4 3 4 void test1(){ 5 int a[N] = {1,9,8,4}; 6 int i; 7 printf("sieof(a) = %d\n",sizeof(a)); 8 9 for(i = 0;i<N;++i){ 10 printf("%p:%d\n",&a[i], a[i]); 11 } 12 printf("a = %p\n",a); 13 } 14 15 void test2(){ 16 char b[N] = {'1','9','8','4'}; 17 int i; 18 printf("sizeof(b) = %d\n",sizeof(b)); 19 20 for(i = 0;i<N;++i) 21 printf("%p:%c\n",&b[i],b[i]); 22 printf("b = %p\n",b); 23 } 24 int main() 25 { 26 printf("测试1:int类型一维数组\n"); 27 test1(); 28 printf("\n测试2:char类型一维数组\n"); 29 test2(); 30 return 0; 31 }

1. int型数组a,在内存中是连续存放的,每个元素占用4个内存字节单元,数组名a对应的值,和&a[0]一样
2. char型数组b,在内存中是连续存放的,每个元素占用1个内存字节单元,数组名b对应的值,和&b[0]一样
task1_2
1 #include <stdio.h> 2 #define N 2 3 #define M 4 4 5 void test1() { 6 int a[N][M] = {{1,9,8,4},{2,0,4,9}}; 7 int i,j; 8 printf("sizeof(a)=%d\n",sizeof(a)); 9 for(i = 0;i<N;++i) 10 for(j = 0;j<M;++j) 11 printf("%p:%d\n",&a[i][j],a[i][j]); 12 printf("\n"); 13 14 printf("a = %p\n", a); 15 printf("a[0] = %p\n", a[0]); 16 printf("a[1] = %p\n", a[1]); 17 printf("\n"); 18 } 19 20 void test2() { 21 char b[N][M] = {{'1', '9', '8', '4'}, {'2', '0', '4', '9'}}; 22 int i, j; 23 24 25 printf("sizeof(b) = %d\n", sizeof(b)); 26 27 for (i = 0; i < N; ++i) 28 for (j = 0; j < M; ++j) 29 printf("%p: %c\n", &b[i][j], b[i][j]); 30 printf("\n"); 31 32 printf("b = %p\n", b); 33 printf("b[0] = %p\n", b[0]); 34 printf("b[1] = %p\n", b[1]); 35 } 36 37 int main() { 38 printf("测试1: int型两维数组"); 39 test1(); 40 41 printf("\n测试2: char型两维数组"); 42 test2(); 43 44 return 0; 45 }

1. int型二维数组a,在内存中按行连续存放,每个元素占用4个内存字节单元
数组名a的值、a[0]的值、 &a[0][0]的值,在数字字面值上一样
2. char型二维数组b,在内存中按行连续存放,每个元素占用1个内存字节单元
数组名b的值、b[0]的值、 &b[0][0]的值,在数字字面值上一样
3. 对于二维数组,a[0], a[1]的值之间相差4
b[0]和b[1]的值,它们之间相差1
相差一个sizeof(int)和sizeof(char)
task 2
1 #include <stdio.h> 2 #include <string.h> 3 4 #define N 80 5 6 void swap_str(char s1[N], char s2[N]); 7 void test1(); 8 void test2(); 9 10 int main() 11 { 12 printf("测试1: 用两个一维char数组,实现两个字符串交换\n"); 13 test1(); 14 15 printf("\n测试2: 用二维char数组,实现两个字符串交换\n"); 16 test2(); 17 return 0; 18 } 19 20 void test1(){ 21 char views1[N] = "hey,C,I hate u."; 22 char views2[N] = "hey,C,I love u."; 23 24 printf("交换前:\n"); 25 puts(views1); 26 puts(views2); 27 28 swap_str(views1,views2); 29 30 printf("交换后:\n"); 31 puts(views1); 32 puts(views2); 33 } 34 35 void test2(){ 36 char views[2][N] = {"hey,C,I hate u.", 37 "hey,C,I love u."}; 38 39 printf("交换前:\n"); 40 puts(views[0]); 41 puts(views[1]); 42 43 swap_str(views[0],views[1]); 44 45 printf("交换后:\n"); 46 puts(views[0]); 47 puts(views[1]); 48 } 49 50 void swap_str(char s1[N] , char s2[N]){ 51 char tmp[N]; 52 53 strcpy(tmp,s1); 54 strcpy(s1,s2); 55 strcpy(s2,tmp); 56 57 }

task 3_1
1 #include <stdio.h> 2 3 #define N 80 4 5 int count(char x[]); 6 7 int main() 8 { 9 char words[N+1]; 10 int n; 11 12 while(gets(words)!=NULL){ 13 n = count(words); 14 printf("单词数:%d\n\n",n); 15 } 16 return 0; 17 } 18 19 int count(char x[]){ 20 int i; 21 int word_flag = 0; 22 int number = 0; 23 24 for(i = 0;x[i]!='\0';i++){ 25 if(x[i]==' ') 26 word_flag = 0; 27 else if(word_flag==0){ 28 word_flag = 1; 29 number++; 30 } 31 } 32 return number; 33 }

task 3_2
1 #include <stdio.h> 2 #define N 1000 3 4 int main() { 5 char line[N]; 6 int word_len; 7 int max_len; 8 int end; 9 int i; 10 11 while(gets(line) != NULL) { 12 word_len = 0; 13 max_len = 0; 14 end = 0; 15 16 i = 0; 17 while(1) { 18 while(line[i] == ' ') { 19 word_len = 0; 20 i++; 21 } 22 23 24 while(line[i] != '\0' && line[i] != ' ') { 25 word_len++; 26 i++; 27 } 28 29 if(max_len < word_len) { 30 max_len = word_len; 31 end = i; 32 } 33 34 if(line[i] == '\0') 35 break; 36 } 37 38 printf("最长单词: "); 39 for(i = end - max_len; i < end; ++i) 40 printf("%c", line[i]); 41 printf("\n\n"); 42 } 43 44 return 0; 45 }

task 4
1 #include <stdio.h> 2 #define N 100 3 4 void dec_to_n(int x, int n); 5 6 int main() 7 { 8 int x; 9 printf("输入一个十进制的整数:"); 10 while(scanf("%d",&x)!=EOF){ 11 dec_to_n(x,2); 12 dec_to_n(x,8); 13 dec_to_n(x,16); 14 printf("\n输入一个十进制的整数:"); 15 } 16 return 0; 17 } 18 19 void dec_to_n(int x,int n){ 20 int i; 21 if(n==2){ 22 int two[32]; 23 for(i = 0;i<32;i++) 24 two[i] = 0; 25 int index = 0; 26 while(x>0){ 27 two[index] = x%2; 28 x = x/2; 29 index++; 30 } 31 for(i = index-1;i>=0;i--) 32 printf("%d",two[i]); 33 printf("\n"); 34 } 35 else if(n==8) 36 printf("%o\n",x); 37 else if(n==16) 38 printf("%X\n",x); 39 }

task 5
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 9 int main() 10 { 11 int scores[N]; 12 double ave; 13 14 printf("录入%d个分数:\n",N); 15 input(scores,N); 16 17 printf("\n输出课程分数:\n"); 18 output(scores,N); 19 20 printf("\n课程分数处理:计算均分、排序...\n"); 21 ave = average(scores,N); 22 bubble_sort(scores,N); 23 24 printf("\n输出课程均分:%.2f\n",ave); 25 printf("\n输出课程分数(高->低):\n"); 26 output(scores,N); 27 28 return 0; 29 } 30 31 void input(int x[], int n){ 32 int i; 33 34 for(i = 0;i<n;++i) 35 scanf("%d",&x[i]); 36 } 37 38 void output(int x[], int n) { 39 int i; 40 41 for(i = 0; i < n; ++i) 42 printf("%d ", x[i]); 43 printf("\n"); 44 } 45 46 double average(int x[],int n){ 47 int sum,i;
double ave; 48 sum = 0; 49 for(i = 0;i<n;++i){ 50 sum = sum + x[i]; 51 } 52 ave = (sum*1.0)/n; 53 return ave; 54 } 55 56 void bubble_sort(int x[],int n){ 57 int i,round; 58 for(i = 0;i<n;i++){ 59 round = n - i; 60 for(i = 0;i<round;i++){ 61 if(x[i]<=x[i+1]){ 62 int a = x[i]; 63 x[i] = x[i+1]; 64 x[i+1] = a; 65 } 66 } 67 } 68 69 }

task6
#include<stdio.h> #include<string.h> #define N 5 #define M 20 void output(char str[][M], int n); void bubble_sort(char str[][M], int n); int main() { char name[][M] = {"Bob","Bill","Joseph","Taylor","George"}; int i; printf("输出初试名单:\n"); output(name, N); printf("\n排序中...\n"); bubble_sort(name, N); printf("\n按字典序输出名单:\n"); output(name, N); return 0; } void output(char str[][M], int n){ int i; for(i = 0;i<=n;++i) printf("%s\n",str[i]); } void bubble_sort(char str[][M], int n){ int x,i; for(i = 0;i<n;++i){ x = n - i; for(i = 0;i<x;++i){ if(strcmp(str[i],str[i+1])>0){ char arr[M]; strcpy(arr,str[i+1]); strcpy(str[i+1],str[i]); strcpy(str[i],arr); } } } }

task7
#include<stdio.h> #include<string.h> int main() { char arr[100]; while(scanf("%s",&arr)!=EOF){ int flag = 0; int i,s; for(i = 0;i<strlen(arr);++i){ for(s = i+1;s<strlen(arr);++s){ if(arr[i]==arr[s]){ flag = 1; break; } } if(flag == 1){ break; } } if(flag == 1){ printf("YES\n"); } else if(flag == 0) printf("NO\n"); } return 0; }

task 8
#include<stdio.h> #define N 100 #define M 4 void output(int x[][N], int n); void rotate_to_right(int x[][N], int n); int main() { int t[][N] = {{21,12,13,24}, {25,16,47,38}, {29,11,32,54}, {42,21,33,10}}; printf("原始矩阵:\n"); output(t ,M); rotate_to_right(t, M); printf("变换后矩阵:\n"); output(t, M); return 0; } void output(int x[][N], int n){ int i,j; for(i = 0;i<n;++i){ for(j = 0;j<n;++j) printf("%4d",x[i][j]); printf("\n"); } } void rotate_to_right(int x[][N], int n){ int mid[M]; int i,j; for(i = 0;i<n;++i){ mid[i] = x[i][M-1]; } for(i = 0;i<n;++i){ for(j = n-1;j>=1;j--){ x[i][j] = x[i][j-1]; } } for(i = 0;i<n;++i) x[i][0] = mid[i]; }


浙公网安备 33010602011771号