实验五

实验一

源代码:

 1 #include<stdio.h>
 2 #define N 5
 3 void input(int x[],int n);
 4 void output(int x[],int n);
 5 void find_min_max(int x[],int n,int *pmin,int *pmax);
 6 int main(){
 7     int a[N];
 8     int min,max;
 9     printf("录入%d个数据:\n",N);
10     input(a,N);
11     printf("数据是:\n");
12     output(a,N);
13     printf("数据处理...\n");
14     find_min_max(a,N,&min,&max);
15     printf("数据结果:\n");
16     printf("min=%d,max=%d\n",min,max);
17     return 0;
18 }
19 void input(int x[],int n){
20     int i;
21     for(i=0;i<n;i++)
22        scanf("%d",&x[i]);
23 }
24 void output(int x[],int n){
25     int i;
26     for(i=0;i<n;++i)
27     printf("%d",x[i]);
28     printf("\n");
29 }
30 void find_min_max(int x[],int n,int *pmin,int*pmax){
31    int i;
32   *pmin=*pmax=x[0];
33   for(i=0;i<n;i++)
34     if(x[i]<*pmin)
35     *pmin=x[i];
36     else if(x[i]>*pmax)
37     *pmax=x[i]; 
38 } 

运行结果:

 

问题一:find_min_max函数的作用是运用地址,找到数据中间的最小值与最大值,并且将他们赋值到一个新的地址

问题二:pmin与pmax的地址分别指向x[0],即数组中的第一个数据

实验一变式:

源代码:

 1 #include<stdio.h>
 2 #define N 5
 3 void input(int x[],int n);
 4 void output(int x[],int n);
 5 void *find_max(int x[],int n);
 6 int main(){
 7     int a[N];
 8     int *pmax;
 9     printf("录入%d个数据:\n",N);
10     input(a,N);
11     printf("数据是:\n");
12     output(a,N);
13     printf("数据处理...\n");
14     pmax=find_max(a,N);
15     printf("数据结果:\n");
16     printf("max=%d\n",*pmax);
17     return 0;
18 }
19 void input(int x[],int n){
20     int i;
21     for(i=0;i<n;i++)
22        scanf("%d",&x[i]);
23 }
24 void output(int x[],int n){
25     int i;
26     for(i=0;i<n;++i)
27     printf("%d",x[i]);
28     printf("\n");
29 }
30 void *find_max(int x[],int n){
31    int max_index=0;
32    int i;
33   for(i=0;i<n;++i)
34     if(x[i]>x[max_index])
35     max_index=i;
36     return &x[max_index];
37 } 

 

运行结果:

 

问题一:返回最大值

问题二:替换代码后可以正常运行

实验二
源代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 80
 4 int main() {
 5   char s1[N] = "Learning makes me happy";
 6   char s2[N] = "Learning makes me sleepy";
 7   char tmp[N];
 8   printf("sizeof(s1) vs. strlen(s1): \n");
 9   printf("sizeof(s1) = %d\n", sizeof(s1));
10   printf("strlen(s1) = %d\n", strlen(s1));
11   printf("\nbefore swap: \n");
12   printf("s1: %s\n", s1);
13   printf("s2: %s\n", s2);
14   printf("\nswapping...\n");
15   strcpy(tmp, s1);
16   strcpy(s1, s2);
17   strcpy(s2, tmp);
18   printf("\nafter swap: \n");
19   printf("s1: %s\n", s1);
20   printf("s2: %s\n", s2);
21  return 0;
22 }

 

运行结果:

 

问题一:数组大小是s1内容的长度加上末尾终止符的长度;sizeof是计算s1的长度加上空格数;strlem是计算s1的字符个数、

问题二:可以

问题三:会互换的

变式

源代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 80
 4 int main() {
 5     char *s1 = "Learning makes me happy";
 6     char *s2 = "Learning makes me sleepy";
 7     char *tmp;
 8     printf("sizeof(s1) vs. strlen(s1): \n");
 9     printf("sizeof(s1) = %d\n", sizeof(s1));
10     printf("strlen(s1) = %d\n", strlen(s1));
11     printf("\nbefore swap: \n");
12     printf("s1: %s\n", s1);
13     printf("s2: %s\n", s2);
14     printf("\nswapping...\n");
15     tmp = s1;
16     s1 = s2;
17     s2 = tmp;
18     printf("\nafter swap: \n");
19     printf("s1: %s\n", s1);
20     printf("s2: %s\n", s2);
21     return 0;
22 }

 

运行结果:

 

问题一:存放s1的首地址;计算s1的字节数;统计s1的字符个数

问题二:可以

问题三;交换他们的地址;内存没换

实验三

源代码:

 1 #include <stdio.h>
 2 int main() {
 3     int x[2][4] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
 4     int i, j;
 5     int *ptr1;    
 6     int(*ptr2)[4]; 
 7     printf("输出1: 使用数组名、下标直接访问二维数组元素\n");
 8     for (i = 0; i < 2; ++i) {
 9         for (j = 0; j < 4; ++j)
10             printf("%d ", x[i][j]);
11         printf("\n");
12     }
13     printf("\n输出2: 使用指针变量ptr1(指向元素)间接访问\n");
14     for (ptr1 = &x[0][0], i = 0; ptr1 < &x[0][0] + 8; ++ptr1, ++i) {
15         printf("%d ", *ptr1);
16         if ((i + 1) % 4 == 0)
17             printf("\n");
18     }              
19     printf("\n输出3: 使用指针变量ptr2(指向一维数组)间接访问\n");
20     for (ptr2 = x; ptr2 < x + 2; ++ptr2) {
21         for (j = 0; j < 4; ++j)
22             printf("%d ", *(*ptr2 + j));
23         printf("\n");
24     }
25     return 0;
26 }

 


运行结果:

 

问题一:记录地址

问题二:指针

实验四

源代码:

 1 #include <stdio.h>
 2 #define N 80
 3 void replace(char *str, char old_char, char new_char); // 函数声明
 4 int main() {
 5     char text[N] = "Programming is difficult or not, it is a question.";
 6     printf("原始文本: \n");
 7     printf("%s\n", text);
 8     replace(text, 'i', '*'); 
 9     printf("处理后文本: \n");
10     printf("%s\n", text);
11     return 0;
12 }
13 void replace(char *str, char old_char, char new_char) {
14     int i;
15     while(*str) {
16         if(*str == old_char)
17             *str = new_char;
18         str++;
19     }
20 }

 

运行结果:

 

问题一:将原文本中的i替换成为*

问题二:可以

实验五

源代码:

 1 #include <stdio.h>
 2 #define N 80
 3 char *str_trunc(char *str, char x);
 4 int main() {
 5     char str[N];
 6     char ch;
 7     while(printf("输入字符串: "), gets(str) != NULL) {
 8         printf("输入一个字符: ");
 9         ch = getchar();
10         printf("截断处理...\n");
11         str_trunc(str, ch);         // 函数调用
12         printf("截断处理后的字符串: %s\n\n", str);
13         getchar();
14     }
15     return 0;
16 }
17 char *str_trunc(char *str, char x){
18     char *p=str;
19     while(*p!='\0'){
20         if(*p==x){
21             *p='\0';
22             break;
23         }
24         p++;
25     }
26     return str;
27 }

 

运行结果:

 

问题:确保按下回车键以后不会被意外读取

实验六

源代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 5
 4 int check_id(char *str); // 函数声明
 5 int main()
 6 {
 7     char *pid[N] = {"31010120000721656X",
 8                     "3301061996X0203301",
 9                     "53010220051126571",
10                     "510104199211197977",
11                     "53010220051126133Y"};
12     int i;
13     for (i = 0; i < N; ++i)
14         if (check_id(pid[i])) // 函数调用
15             printf("%s\tTrue\n", pid[i]);
16         else
17             printf("%s\tFalse\n", pid[i]);
18     return 0;
19 }
20 int check_id(char *str) {
21     int len = 0;
22     while (str[len]!= '\0') {
23         len++;
24     }
25     if (len!= 18) return 0;
26 
27     int i;
28     for (i = 0; i < 17; i++) {
29         if (str[i] < '0' || str[i] > '9') return 0;
30     }
31     if (str[17]!= 'X' && (str[17] < '0' || str[17] > '9')) return 0;
32     return 1;
33 }

 

运行结果:

实验七

源代码:

 1 #include <stdio.h>
 2 #define N 80
 3 void encoder(char *str, int n); // 函数声明
 4 void decoder(char *str, int n); // 函数声明
 5 int main() {
 6     char words[N];
 7     int n;
 8     printf("输入英文文本: ");
 9     gets(words);
10     printf("输入n: ");
11     scanf("%d", &n);
12     printf("编码后的英文文本: ");
13     encoder(words, n);      // 函数调用
14     printf("%s\n", words);
15     printf("对编码后的英文文本解码: ");
16     decoder(words, n); // 函数调用
17     printf("%s\n", words);
18     return 0;
19 }
20 void encoder(char *str, int n) {
21     int i = 0;
22     while (str[i]!= '\0') {
23         if (str[i] >= 'A' && str[i] <= 'Z') {
24             str[i] = ((str[i] - 'A' + n) % 26) + 'A';
25         } else if (str[i] >= 'a' && str[i] <= 'z') {
26             str[i] = ((str[i] - 'a' + n) % 26) + 'a';
27         }
28         i++;
29     }
30 }
31 void decoder(char *str, int n) {
32     int i = 0;
33     while (str[i]!= '\0') {
34         if (str[i] >= 'A' && str[i] <= 'Z') {
35             str[i] = ((str[i] - 'A' - n + 26) % 26) + 'A';
36         } else if (str[i] >= 'a' && str[i] <= 'z') {
37             str[i] = ((str[i] - 'a' - n + 26) % 26) + 'a';
38         }
39         i++;
40     }
41 }

 


运行结果:

 

实验八

源代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 int compare(const void *a, const void *b) {
 5     return strcmp(*(char **)a, *(char **)b);
 6 }
 7 int main(int argc, char *argv[]) {
 8     int i;
 9     qsort(argv + 1, argc - 1, sizeof(char *), compare);
10     for (i = 1; i < argc; ++i) {
11         printf("hello, %s\n", argv[i]);
12     }
13     return 0;
14 }

 

运行结果:

 

posted on 2024-12-08 15:04  安宁的空白  阅读(8)  评论(0编辑  收藏  举报