实验5

任务1.1

源代码

#include<stdio.h>
#define N 5
void input(int x[],int n);
void output(int x[],int n);
void find_min_max(int x[],int n,int *pmin,int *pmax);
int main(){
 int a[N];
 int min,max;
 printf("录入%d个数据:\n",N);
 input(a,N);
 printf("数据是:\n");
 output(a,N);
 printf("数据处理...\n",N);
 find_min_max(a,N,&min,&max);
 printf("输出结果:\n");
 printf("min=%d,max=%d\n",min,max);
 return 0;
}
void input(int x[],int n){
 int i;
 for(i=0;i<n;i++)
     scanf("%d",&x[i]);    
}
void output(int x[],int n){
 int i;
 for(i=0;i<n;i++)
     printf("%d ",x[i]);
 printf("\n");
    
}
void find_min_max(int x[],int n,int *pmin,int *pmax){
 int i;
 *pmin=*pmax=x[0];
 for(i=0;i<n;i++)
     if(x[i]<*pmin)
         *pmin=x[i];
     else if(x[i]>*pmax)
         *pmax=x[i];
}

 

运行结果

 

回答问题

问题1:找到输入数据的最大值和最小值

问题2:都指向数组第一个元素

任务1.2

源代码

#include <stdio.h>
#define N 5
void input(int x[],int n);
void output(int x[],int n);
int *find_max(int x[],int n);
int main(){
 int a[N];
 int *pmax;
 printf("录入%d个数据:\n",N);
 input(a,N);
 printf("数据是:\n");
 output(a,N);
 printf("数据处理...\n");
 pmax=find_max(a,N);
 printf("输出结果:\n");
 printf("max=%d\n",*pmax);
 return 0;
}
void input(int x[],int n){
 int i;
 for(i=0;i<n;i++)
     scanf("%d",&x[i]);    
}
void output(int x[],int n){
 int i;
 for(i=0;i<n;i++)
     printf("%d ",x[i]);
 printf("\n");
    
}
int *find_max(int x[],int n,int *pmin,int *pmax){
 int max_index=0;
 int i;
 for(i=0;i<n;i++)
     if(x[i]>x[max_index])
         max_index=i;
 return &x[max_index];
}

 

运行结果

 

回答问题

问题1:返回数组中最大值的地址

问题2:可以

任务2.1

源代码

#include<stdio.h>
#include<string.h>
#define N 80
int main(){
 char s1[N]="Learning makes me happy";
 char s2[N]="Learning makes me sleepy";
 char tmp[N];
 printf("sizeo(s1)vs.strlen(s1):\n");
 printf("sizeof(s1)=%d\n",sizeof(s1));
 printf("strlen(s1)=%d\n",strlen(s1));
 
    printf("\nbefore swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);
 
 printf("\nswapping...\n");
 strcpy(tmp,s1);
 strcpy(s1,s2);
 strcpy(s2,tmp);
 
 printf("\nafter swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);
    return 0;
}

 

运行结果

 

回答问题

问题1:80,sizeof(s1) 计算的是数组s1占用的内存,strlen(s1) 统计的是字符串s1的长度

问题2:不能,s1是一个常量指针不能被重新赋值

问题3:是

任务2.2

源代码

#include<stdio.h>
#include<string.h>
#define N 80
int main(){
 char *s1="Learning makes me happy";
 char *s2="Learning makes me sleepy";
 char *tmp;
 printf("sizeo(s1)vs.strlen(s1):\n");
 printf("sizeof(s1)=%d\n",sizeof(s1));
 printf("strlen(s1)=%d\n",strlen(s1));
 
    printf("\nbefore swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);
 
 printf("\nswapping...\n");
 tmp=s1;
 s1=s2;
 s2=tmp;
 
 printf("\nafter swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);
    return 0;
}

 

运行结果

 

回答问题

问题1:指针变量s1中存放的是字符串的起始地址,sizeof(s1) 计算的是指针变量本身占用的内存,strlen(s1) 统计的是指针指向的字符串的长度

问题2:能,task2.1中s1是地址常量,不能再次赋值,task2.2中s1是指针变量,指向字符串的起始地址,可以直接赋值

问题3:交换的是地址,字符串在内存中没有交换

任务3

源代码

#include<stdio.h>
int main (){
 int x[2][4]={{1,9,8,4},{2,0,4,9}};
 int i,j;
 int *ptr1;
 int(*ptr2)[4];
 printf("输出1:使用数组名、下标直接访问二维数组元素\n");
 for(i=0;i<2;i++){
  for(j=0;j<4;j++)
      printf("%d ",x[i][j]);
  printf("\n");
 }
 printf("\n输出2: 使用指针变量ptr1(指向元素)间接访问\n");
 for(ptr1=&x[0][0],i=0;ptr1<&x[0][0]+8;++ptr1,i++){
  printf("%d ",*ptr1);
  if((i+1)%4==0)
      printf("\n");
 }
 printf("\n输出3: 使用指针变量ptr2(指向一维数组)间接访问\n");
 for(ptr2=x;ptr2<x+2;++ptr2){
  for(j=0;j<4;j++)
      printf("%d ",*(*ptr2+j));
  printf("\n");
 }
 return 0;
}

 

运行结果

 回答问题

int (*ptr)[4]; 中,标识符ptr是一个指向包含四个int型元素的数组的指针

int *ptr[4]; 中,标识符ptr是一个数组这个数组包含四个指向int型数据的指针

任务4

源代码

#include<stdio.h> 
#define N 80
void replace(char *str,char old_char,char new_char);
int main(){
    char text[N]="Programming is difficult or not,it is a question.";
    printf("原始文本:\n");
    printf("%s\n",text);
    replace(text,'i','*');
    printf("处理后文本:\n");
    printf("%s\n",text);
    return 0;
}
void replace(char *str,char old_char,char new_char){
    int i;
    while(*str){
        if(*str==old_char)
        *str=new_char;
        str++;
    }
}

 

运行结果

 

回答问题

问题1:将text字符串中的i全部换成*

问题2:可以

任务5

源代码

#include<stdio.h>
#define N 80
char *str_trunc(char *str,char x);
int main(){
    char str[N];
    char ch;
    while(printf("输入字符串:"),gets(str)!=NULL){
        printf("输入一个字符:");
        ch=getchar();
        printf("截断处理...\n");
        str_trunc(str,ch);
        printf("截断处理后的字符串:%s\n\n",str);
        getchar();
    }
    return 0;
}
char *str_trunc(char *str,char x){
    int t=0;
    for(str;*str!='\0';str++){
        if(*str==x){
            *str='\0';
            t=1;
        }
        if(t==1){
            *str='\0';
        }
    }
}

 

运行结果

 

回答问题

从第二次循环开始还未读取字符串便输出,

用于读取回车键

任务6

源代码

#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\tTure\n",pid[i]);
        else
            printf("%s\tFalse\n",pid[i]);
    return 0;
}
int check_id(char *str){
    int i,t=0;
    if(strlen(str)!=18)
        return 0;
    else{
        for(i=0;i<17;i++){
            if(str[i]>='0'&&str[i]<='9')
            t++;
        }
        if((str[i]>='0'&&str[i]<='9')||str[i]=='X')
            t++;
        if(t==18)
        return 1;
        else
        return 0;
    }
}

 

运行结果

 

任务7

源代码

 

#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;
    for(i=0;i<N;i++){
        if(((str[i]>='a')&&(str[i]<='z'))||(str[i]>='A')&&(str[i]<='Z')){
            str[i]+=n;
            if((str[i]>'z')&&(str[i]-n)<='z')
                str[i]=str[i]-'z'+'a'-1;
            else if((str[i]>'Z')&&(str[i]-n)<='Z')
                str[i]=str[i]-'Z'+'A'-1;
        }
    }
}
void decoder(char *str,int n){
    int i;
    for(i=0;i<N;i++){
        if(((str[i]>='a')&&(str[i]<='z'))||(str[i]>='A')&&(str[i]<='Z')){
            str[i]-=n;
            if((str[i]<'A')&&(str[i]+n)>='A')
            str[i]=-'A'+str[i]+'Z'+1;
            else if((str[i]<'a')&&(str[i]+n)>='a')
            str[i]=-'a'+str[i]+'z'+1;
        }
    }
}

 

运行结果

 

 

 

任务8

源代码

 

#include <stdio.h>
#include<string.h>
int main(int argc, char *argv[]) {
    int i,j;
    char *t;
    for(i=1;i<argc;i++)
        for(j=1;j<argc-i;j++)
        {
            if(strcmp(argv[j],argv[j+1])>0)
            {
                t=argv[j];
                argv[j]=argv[j+1];
                argv[j+1]=t;
            }
        }
    for(i=1;i<argc;++i)
        printf("hello, %s\n", argv[i]);
    return 0;
}

 

运行结果

 

 

posted @ 2024-12-07 12:26  syqsyq  阅读(5)  评论(0编辑  收藏  举报