实验五

任务一

task1_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 max,min;
    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:将 p_max和p_min改为最小值和最大值(对实参进行操作)

2:都指向数组元素x[0]

task1_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");
    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 i;
    int max_index=0;
    for(i=0;i<n;i++)
     if(x[i]>x[max_index])
     max_index=i;
    
    return &x[max_index];
}

 

 

 

 

运行结果:

 

 

 

问题:

1:找到最大值的地址

2:可以

任务2

task2_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 temp[N];
    printf("sizeof(s1)vs strlrn(s1):\n");
    printf("sizeof(s1)=%d",sizeof(s1));
    printf("strlen(s1)=%d",strlen(s1));
    
    printf("\nbefore swap:\n");
    printf("s1:%s\n",s1);
    printf("s2:%s\n",s2);
    
    printf("\nswapping...\n");
    strcpy(temp,s1);
    strcpy(s1,s2);
    strcpy(s2,temp);
    printf("\nafter swap:\n");
    printf("s1:%s\n",s1);
    printf("s2:%s\n",s2);
    return 0;
}

 

 

 

运行结果:

 

 

 

问题

1:80  数组s1占多少字节  统计数组s1中的除去\0的具体字符数

2:不可以,字符数组除了初始化时无法直接进行赋值

3:交换的

task2_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 *temp;
    printf("sizeof(s1) vs strlen(s1):\n");
    printf("sizeof(s1)=%d\n",sizeof(s1));
    printf("strlen(s1)=%d\n",strlen(s1));
    
    printf("\nbefore:\n");
    printf("s1:%s\n",s1);
    printf("s2:%s\n",s2);
    
    printf("\nswapping...\n");
    temp=s1;
    s1=s2;
    s2=temp;
    
    printf("\nafter swap:\n");
    printf("s1:%s\n",s1);
    printf("s2:%s\n",s2);
    return 0;
 } 

 

 

运行结果:

 

 

 

问题:

1:字符串"Learning makes me happy"的字符的首地址,计算的是指针变量s1所占的字节,统计的是从首地址开始一直到\0之前的字符数

2;可以,task2_1的line6是将字符串整个输送到字符数组中,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<2;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]="Programing 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 c)
{
    int i=0;
    while(*(str+i)!=c)
{
    i++;
    }
*(str+i)='\0';
return str;    
}

 

 

运行结果:

 

 

 

问题:

 如果删去,后续就无法输入字符串,起到吞没回车的作用

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

// 函数定义
// 功能: 检查指针str指向的身份证号码串形式上是否合法
// 形式合法,返回1,否则,返回0
int check_id(char *str) {
    int i=0;
    while(*(str+i)) 
     { i++; }
    if(i!=18)
    return 0;
    for(i=0;i<17;i++)
{     if(!(*(str+i)>='0'&&*(str+i)<='9'))
    return 0;
    }
    if(*(str+i)>='0'&&*(str+i)<='9'||*(str+i)=='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)
{
    int i;
    for(i=0;*(str+i)!=0;i++)
    {
        if(*(str+i)>='a'&&*(str+i)<='z'-n||*(str+i)>='A'&&*(str+i)<='Z'-n)
        *(str+i)+=n;
        else if(*(str+i)>'z'-n&&*(str+i)<='z'||*(str+i)>'Z'-n&&*(str+i)<='Z')
           *(str+i)=*(str+i)+n-26;
    }    
}
void decoder(char *str,int n)
{
    int i;
    for(i=0;*(str+i)!=0;i++)
{
  if(*(str+i)>='a'+n&&*(str+i)<='z'||*(str+i)>='A'+n&&*(str+i)<='Z')        
*(str+i)-=n;        
  else if(*(str+i)>='a'&&*(str+i)<'a'+n||*(str+i)>='A'&&*(str+i)<'A'+n)
*(str+i)=*(str+i)-n+26;
}
        
}

 

 

运行结果:

 

 

 

任务8:

源代码:

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

 

 

 

运行结果:

 

posted @ 2024-12-07 11:31  布莱恩韩  阅读(6)  评论(0编辑  收藏  举报