实验五

任务一

#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");
    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;指向x[0]所在的地址

#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 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行*pmax指向x[0]所在的地址而不是x[0]

任务2

#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("sizeof(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 s1的大小是80  sizeof(s1)计算的是s1数组的大小  strlen(s1)计算的是s1内存放的元素的大小

问题2   可以       

问题3  交换

#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("sizeof(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("\nafter swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);
    
    return 0;
}

问题1  s1存放的是地址   sizeof(s1)计算的是数组s1的大小  strlen(s1)计算的是s1中的元素的大小

问题2  task2定义的是一个指针型变量,其中tmp用于存放地址,而task1定义的是数组用于存放字符串

问题3  交换的是s1,s2所指代的地址,两个字符串常量在内存中没有被交换

任务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;
}

任务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  将原字符串中的某一个字符全部替换成另一个字符

问题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){
    char *p=str;
    while (*p!='\0'){
        if (*p==x){
            *p='\0';
        }
        p++;
    }
    return str;
} 

问题 去掉后回车键会被读取到下依次输入的字符串  line18为了避免回车键被下一次执行的程序读取

任务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\tTrue\n", pid[i]);
        else
            printf("%s\tFalse\n", pid[i]);
    return 0;
}




int check_id(char *str) {
    if(strlen(str)!=18)
    return 0;
    int i=0;
    while(i<17){
        if(('0'<=*str)&&(*str<='9')){
        str++;
        i++;
        }
        else return 0;
    }
    if(('0'<=*str)&&(*str<='9')||(*str=='X'))
    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) {
 for(int i=0;str[i]!='\0';i++) {
     if(str[i]>='a'&&str[i]<='z')
     str[i]=(str[i]-'a'+n)%26+'a';
     else if (str[i]>='A'&&str[i]<='Z')
     str[i]=(str[i]-'A'+n)%26+'A';
 }
}





void decoder(char *str, int n) {
    for(int i=0;str[i]!='\0';i++) {
     if(str[i]>='a'&&str[i]<='z')
     str[i]=(str[i]-'a'-n+26)%26+'a';
     else if (str[i]>='A'&&str[i]<='Z')
     str[i]=(str[i]-'A'-n+26)%26+'A';
 }
 
    
}

 任务8

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
    int i,j;
    char* temp;
    for(i = 1; i < argc; i++){
        for(j=1;j<argc-i;j++){
            if(strcmp(argv[j],argv[j+1])>0){
                temp = argv[j];
                argv[j] = argv[j+1];
                argv[j+1] = temp;
            }

        }
    }

    for(i = 1; i < argc; ++i)
        printf("hello, %s\n", argv[i]);

    return 0;
}

 

posted @ 2024-12-08 22:14  陈熠萱  阅读(6)  评论(0编辑  收藏  举报