实验6

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

 

 

#include<stdio.h>
#define N 4

int main()
{
    char x[N] = {'1','9','8','4'};
    int i;
    char *p;
    
    //方式1:通过数组名和下标遍历输出数组元素
    for(i=0;i<N;++i)
       printf("%c",x[i]);
    printf("\n");
    
    //方式2:通过指针变量遍历输出数组元素(写法1)
    for(p=x;p<x+N;++p)
       printf("%c",*p);
    printf("\n");
    
    //方式2:通过指针变量遍历输出数组元素(写法2)
    p=x;
    for(i=0;i<N;++i)
       printf("%c",*(p+i));
    printf("\n");
    
    //方式2:通过指针变量遍历输出数组元素(写法3)
    p=x;
    for(i=0;i<N;++i)
       printf("%c",p[i]);
    printf("\n");
    
    return 0;
}

task1_1.c执行后p存放的地址值是:2003

task1_2.c执行后p存放的地址值是:2008

 

实验任务2:使用指针变量间接访问二维数组元素

#include<stdio.h>

int main()
{
    int x[2][4]={{1,9,8,4},{2,0,2,2}};
    int i,j;
    int *p;        //指针变量,存放int类型数据的地址
    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)
    {
        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;
}

 问题1:2004、2016

问题2:2008、2032

问题3:列指针每次指向下一个、行指针每次指向下一行。

 

 

实验任务3:使用指针变量处理字符串

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

int main()
{
    char s1[] ="C,I love u.";
    char s2[] ="C,I hate u.";
    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;
    
}

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

int main()
{
    char *s1="C,I love u.";
    char *s2 ="C,I hate u.";
    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("\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:数组的长度、字符串的长度

问题2:不能

问题3:是

问题1:字符串的地址、指针的长度、字符串的长度

问题2:不能

问题3:交换两个指针指向的地址、内存存储没有交换

 

实验任务4:身份证号码形式合法性判断

#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 i;
    char *p;

    p=str;
    
    while(*p) 
    {
    if(*p>='0'&&*p<='9'||*p=='X')
    
        i++;
        p++;
    }
    if (i==18)
      return 1;
    else
      return 0;
}

 

 

实验任务5:回文串判断

 

#include<stdio.h>
#include<string.h>

#define N 80
int is_palindrome(char *s);//函数声明

int main()
{
    char str[N];
    int flag;
    
    printf("Enter a string:\n");
    gets(str);
    
    flag = is_palindrome(str);//函数调用
    
    if (flag)
       printf("YES\n");
    else
       printf("NO\n");
       
    return 0;
}

//函数定义
//功能:判断s指向的字符串是否是回文串
//如果是,返回1;否则,返回0
int is_palindrome(char *s)
{
    char *p,*q;
    q=s+strlen(s)-1;
     p=s;
     while(p<q){
         if(*p!=*q)
             break;
         p++;
         q--;
     }
     if(p>=q)
         return 1;
     else 
         return 0;
 }

 

 

实验任务6:简单的英文文本加密、解密

 

#include <stdio.h>
#define N 80
  void encoder(char *s); 
  void decoder(char *s);  
  
  int main()
  {
      char words[N];
      
     printf("English: ");
     gets(words);
     
     printf("encoding: ");
     encoder(words);  //
     printf("%s\n", words);
     
     printf("decoding: ");
     decoder(words);  //
     printf("%s\n", words);
     
     return 0;
 }
 
 
 
 void encoder(char *s)
 {
     char *p;
     p=s;
     while(*p){
         if(*p>=65&&*p<=89||*p>=97&&*p<=121)
             *p+=1;
         else if(*p==90||*p==122)
             *p-=25;
         p++;
     }
 }
 
 
 
 void decoder(char *s)
 {
     char *p;
     p=s;
     while(*p){
         if(*p>=66&&*p<=90||*p>=98&&*p<=122)
             *p-=1;
         else if(*p==65||*p==97)
             *p+=25;
         p++;
     }
}

 

 

 

实验总结:了解了指针变量的用法

 

posted @ 2022-06-13 23:23  这很不二  阅读(7)  评论(3编辑  收藏  举报