实验五

task1.

 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 
 7 int main()
 8 {
 9     int a[N];
10     int min,max;
11     printf("录入%d个数据:\n",N);
12     input(a,N);
13     
14     printf("数据是:\n");
15     output(a,N);
16     
17     printf("数据处理...\n");
18     find_min_max(a,N,&min,&max);
19     printf("输入结果:\n");
20     printf("min=%d,max=%d\n",min,max);
21     
22     return 0; 
23 }
24 void input(int x[],int n)
25 {
26     int i;
27     
28     for(i=0;i<n;++i)
29         scanf("%d",&x[i]);
30 }
31 void output(int x[],int n)
32 {
33     int i;
34     for(i=0;i<n;++i)
35         printf("%d ",x[i]);
36     printf("\n"); 
37 }
38 void find_min_max(int x[],int n,int *pmin,int *pmax)
39 {
40     int i;
41     
42     *pmin=*pmax=x[0];
43     
44     for(i=0;i<n;++i)
45         if(x[i]<*pmin)
46             *pmin=x[i];
47         else if(*pmax<x[i])
48             *pmax=x[i]; 
49 }

answer1:fine_min_max功能是找出数组中最大值,最小值。

answer2:"指针变量在使用之前必须指向确定的地址"。执行到line45时,指针变量pmin、pmax 分别指向数组第一个元素,遍历数组元素后分别指向最小值,最大值。

task2.

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

answer1:数组s1大小为80字节,sizeof(s1)计算占用内存空间,strlen(s1)统计实际有效字符长度。

answer2:line7不能代换,是初始化错误。

answer3:执行line19-line21后,s1,s2的内容交换。

task3.

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

answer1:int (*ptr)[4]; 中,标识符ptr表示的语义是指向四个一维数组的首地址。

answer2:int *ptr[4];中,标识符ptr表示的语义是指向长度为四的一维整形数组的首地址。

task4.

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

answer1:根据用户输入的字符替换字符串相对应的字符。

answer2:可以替换为*str!='\0'。

task5.

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

answer:去掉line18,只读入一次所需字符串,其作用是在每次筛选完后继续读入下一个字符串。

task6.

#include<stdio.h>
#include<string.h>
#define N 5
int check_id(char *str);
int main()
{
    char *pid[N]={"31010120000721656X",
                  "3301061996x0203301",
                  "53010220051126571",
                  "510104199211197977",
                  "53010220051126133Y"};
    int i;
    
    for(i=0;i<N;++i)
    {
        if(check_id(pid[i]))
            printf("%s\tTrue\n",pid[i]);
        else
            printf("%s\tFalse\n",pid[i]);
                             
    }
    return 0;
}
int check_id(char *str)
{    
    int num=0;
    while(*str)
    {    
        num++;
        if(*str<48)
            return 0;
        if(*str>57)
        {
            if((*str==88)&&(*(str+1)==0)&&(num==18))
                return 1;
            else 
                return 0;
        }    
        str++;
    }
    if(num==18)
        return 1;
 } 

task7.

#include<stdio.h>
#define N 80 
void encoder(char *str,int n);;
void decoder(char *str,int n);
int main()
{
    char words[N];
    int n;
    
    printf("输入英文文本:");
    gets(words);
    
    printf("输入n:");
    scanf("%d",&n);
    
    printf("编码后的英文文本:");
    encoder(words,n);
    printf("%s\n",words);
    
    printf("对编码后的英文文本解码:");
    decoder(words,n);
     printf("%s\n",words);
     
     return 0;
}
void encoder(char *str,int n)
{    
    int i,j;
    while(*str)
    {
        if((65<=*str)&&(*str<=90))
        {
            if(*str<=90-n)
                *str+=n;
            else
            {    
                i=n-(90-*str)-1;
                *str='A'+i;            
            }
                
        }
        if((97<=*str)&&(*str<=122))
        {
            if(*str<=122-n)
                *str+=n;
            else
            {
                j=n-(122-*str)-1;
                *str='a'+j;
            }
            
        }
    str++;
    }
}
void decoder(char *str,int n)
{
    int i,j;
    while(*str)
    {
        if((65<=*str)&&(*str<=90))
        {
            if(*str>=65+n)
                *str-=n;
            else 
            {    
                i=65+n-*str-1;
                *str='Z'-i;
            }
            
        }
        if((97<=*str)&&(*str<=122))
        {
            if(*str>=97+n)
                *str-=n;
            else
            {
                j=97+n-*str-1;
                *str='z'-j;    
            }
                
        }
        str++;
    }
}

 

task8.

 1 #include <stdio.h>
 2 #include<string.h>
 3 
 4 int main(int argc, char *argv[]) {
 5     int i,j,k;
 6     int *temp;
 7 
 8     for(i = 1; i < argc-1; ++i)
 9     {    
10         k=i;
11         for(j = i+1;j<argc;++j)
12             if(strcmp(argv[j],argv[k])<0)
13                 k=j;
14         if(k!=i)
15         {
16             temp=argv[i];
17             argv[i]=argv[k];
18             argv[k]=temp;    
19         }
20     }
21     for(i=1;i<argc;++i)
22         printf("hello, %s\n", argv[i]);
23 
24     return 0;
25 }

 实验总结:复习了以前的知识,并且训练了写代码的速度,关于算法的探究更加深入透彻。

posted @ 2024-12-04 19:54  Goldie0316  阅读(12)  评论(0编辑  收藏  举报