实验五

TASK 1

#include<stdio.h>
#define N 4

int main(){
    int x[N]={1,9,8,4};
    int i;
    int *p;
    
    //1.通过数组名和下标遍历输出数组元素
    for(i=0;i<N;++i)
    printf("%d",x[i]);
    printf("\n");
    
    //2.1通过指针变量遍历输出数组元素
    for(p=x;p<x+N;++p)
    printf("%d",*p);//用指针变量地址间接访问 
    printf("\n"); 
    
    //2.2
    p=x;
    for(i=0;i<N;++i)
    printf("%d",p[i]);
        printf("\n"); 
    //2.3
    p=x;
    for(i=0;i<N;++i)
    printf("%d",*(p+i));
    printf("\n");
    
    return 0;
    
}

 

 

 

 

 

TASK 2 

//使用指针变量访问二维数组元素
#include<stdio.h>

int main(){
    int x[2][4]={{1,9,8,4},{2,0,4,9}};
    int i,j;
    int *p;
    int (*q)[4];//指针变量,指向包含4个int型元素的一维数组
    
    //使用数组名和下标访问二维数组元素
    for(i=0;i<2;i++){
        for(j=0;j<4;j++)
        printf("%d",x[i][j]);
        printf("\n");
    } 
    
    //使用指针变量p间接访问二维数组元素
    for(p=&x[0][0],i=0;p<&x[0][0]+8;p++,i++){//p在数组的起始位置,按内存中的存储形式,输出一个就加一,输出四个就换行 
        printf("%d",*p);
        if((i+1)%4==0)//每一行就回车一下 
        printf("\n");
    } 
    
    //使用指针变量q间接访问二维数组元素
     for(q=x;q<x+2;q++)//代表着行的变化 
     {
         for(j=0;j<4;j++)
         printf("%d",*(*q+j));//每一行输出四个元素,在内存中的存储形式的关系地址,地址加一对应的元素的值 
         printf("\n");
     }
     return 0;
} 

 

 

 

 

 

TASK 3

//对比使用字符数组,字符指针变量处理字符串的区别
//使用字符数组处理字符串
#include<stdio.h>
#include<string.h>
#define N 80

int main() 
{
    char s1[]="xixixixi";
    //char s1[]; s1="ixixixi"  不能使用这种写法,因为这是数组,数组名是常量,是不能被改变的,但可以用指针变量 
     char s2[]="ahahhahaha";
    char tmp[N];
    
    printf("sizeof(s1)vs.strlen(s1):\n");
    printf("sizeof(s1)=%d\n",sizeof(s1));
    printf("strlen(s1)=%d\n",strlen(s1));
    //sizeof计算了包括"\0"这个结束标志符,但是strlen只计算了除"\0"以外的有效字符长度 

    strcpy(tmp,s1);
    strcpy(s1,s2);
    strcpy(s2,tmp);//利用函数交换了数组中元素 
    
    printf("%s\n%s\n",s1,s2);
    
    return 0;
}

 

 

 

TASK 4

//用指针变量处理字符串,判断一个字符串是否是回文串
#include<stdio.h>
#define N 80
int func(char *);

int main()
{
    char str[80];
    
    while(gets(str)!=NULL)//当输入的字符串不是空的时候 
    {
        if (func(str))//根据调用的函数的返回值来看是否是回文串 
        printf("yes\n");
        else
        printf("no\n");
    }
    return 0;
}

int func(char *str){
    char *begin,*end;//定义 
    
    begin= end=str;//指针变量,先把得到的数组赋值给两个指针变量 
    
    while(*end)//这个到达字符串的末尾 
    end++;
    
    end--;//减去一个才是最后一个字符的位置 
    
    while(begin<end){//判断条件 
        if(*begin!=*end)//如果不相同,就是两边开始向中间变 
        return 0;//提前返回return 0; 
        else{
            begin++;
            end--;
        }
    }
    return 1;
}

 

 

 

 

 

TASK 5

//使用指针变量处理字符串,去除文本字符中间*号,保留前导*和末尾* 

#include<stdio.h> 
#define N 80

void func(char *);

int main(){
    char s[N];
    
    while(scanf("%s",s)!=EOF){//多次输入 
        func(s);
        puts(s);
    }
    return 0;
}

void func(char *str){
    int i;
    char *p1,*p2,*p;//定义三个指针变量,分别用来放前导和后导 ,以及最后的文本字符 
    
    p1=str;
    while(*p1=='*')//定位到前导*后的第一个字符 
    p1++;
    
    p2=str;
    while(*p2)//定位到'\0'位置 
    p2++;
    p2--;//记得返回到最后一个字符位置 
    
    while(*p2=='*')//移动到后导*位置结束的位置,到达字符位置 
    p2--;
    
    p=str;//分为三个部分,字符前导,保留,粘贴到新的文本 
    i=0;
    while(p<p1){
        str[i]=*p;
        p++;
        i++;
    }
    
    while(p<=p2){
        if(*p!='*'){//第二部分,不是*的字符复制粘贴,并向后移动 ,遇到*,直接跳过原指针中的 
            str[i]=*p;
            i++;
        }
        p++;
    }
    
    while (*p!='\0'){//后导*也一并复制粘贴上 
        str[i]=*p;
        p++;
        i++;
    }
    
    str[i]='\0';//最后没有'\0',手动加上 
}

 

 

 

 

TASK 6

//使用指针数组对字符串排序
//1.1冒泡排序法

#include<stdio.h>
#include<string.h>
void sort(char *name[],int n);//函数声明 

int main(){
    char *course[4]={"haha","xixilahaha","heihei","hohohoho"};//先用指针数组储存字符串 
    
    int i;
    
    sort(coure,4);//对字符串进行排序 
    
    for(i=0;i<4;i++)
    printf("%s\n",course[i]);//输出处理后的字符串 
    
    return 0;
} 
//函数定义 
void sort(char *name[],int n){
    int i,j;
    char *tmp;//用于之后的交换的中间指针变量 
    
    for(i=0;i<n-1;i++){//冒泡排序法,需要排(循环)n-1次,每次需要比较n-1-i[需要减去之前已经比较过的次数,因为前面已经排好了]
    for(j=0;j<n-1-i;j++)//用j记录的是每次开始比较的,从后往前排,向前移动 
    if(strcmp(name[j],name[j+1])>0){//用函数来比较字符串的大小,从小到大排序 
        tmp = name[j];
        name[j]=name[j+1];
        name[j+1]=tmp;
    }
    }
}

 

 

 

 

 

TASK 7

#include <stdio.h>
#include <string.h>
#define N 5

int check_id(char *str); // 函数声明

int main()
{
    char *pid[N] = {"31010120000721656X",
                    "330106199609203301",
                    "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 n,i;
  n=strlen(str);
  if(n!=18)
  return 0;
  
 while(*str!='\0'){
     if(*str<48||(*str>58&&*str!='X'))
     return 0;
     
     *str++;
 }
 return 1;
}

 

 

TASK 8 

#include <stdio.h>
#define N 80
void encoder(char *s);
void decoder(char *s);

int main()
{
    char words[N];
    
    printf("输入英文文本:");
    gets(words);
    
    printf("编码后的英文文本: ");
    encoder(words);
    printf("%s\n", words);
    
    printf("对编码后的英文文本解码:");
    decoder(words);
    printf("%s\n", words);
    
    return 0;
    }
void encoder(char *s)
{   while(*s){
       if(*s>=65&&*s<=90||*s>=97&&*s<=122){
              *s=*s+1;
              s++;continue;
       }
       else if(*s==90||*s==122){
              *s=*s-25;
              s++;continue;
       }
       s++;
}
 return;
    
}

void decoder(char *s)
{ while(*s){
       if(*s>=66&&*s<=90||*s>=98&&*s<=122){
              *s=*s-1;
              s++;continue;
       }
       else if(*s==65||*s==97){
              *s=*s+25;
              s++;continue;
       }
       s++;
}    return;
}

 

posted @ 2023-05-10 23:00  呓语-c  阅读(19)  评论(0)    收藏  举报