实验5 指针

Posted joshh1230

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验5 指针相关的知识,希望对你有一定的参考价值。

1.task1

task1_1.c

 #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;
 

task1_2.c

 #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];
 
     //使用数组名、下标访问二维数组元素
     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;
 

 

2.task2

 #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[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的大小是23,sizeof(s1)计算的是s1占用的字节数,strlen(s1)计算的是s1的实际长度(除\\0以外的字符个数)

2.不能替换。数组只能在定义是对其赋值。

3.s1和s2内容交换了

task2_2.c

 #include <stdio.h>
 #include<string.h>
 #define N 80
 int main()
 
     char *s1="Learing makes me happy";
     //char *s1;                            line 6代码可以换成这两行;
     //s1="Learning makes me happy";
     char *s2="Learing makes me slpeey";
     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.指针变量s1中存放的是字符串,sizeof(s1)计算的是字符串所占用的字节数,strlen(s1)计算的是有效字符数(除\\0以外的字符个数)

2.可以替换。2.1中先定义一个空的数组s1,在s1中存放字符串。2.2中定义一个字符型指针变量s1,s1指向数组

3.交换的是指针的指向,s1和s2在内存存储单元中没有交换。

 

3.task3

task3.c

 #include<stdio.h>
 void str_cpy(char *target,const char *source);
 void str_cat(char *str1,char *str2);
 
 int main()
 
     char s1[80],s2[20]="1984";
 
     str_cpy(s1,s2);
     puts(s1);
 
     str_cat(s1,"Animal Farm");
     puts(s1);
 
     return 0;
 
 void str_cpy(char *target,const char *source)
 
     while(*target++=*source++)
         ;
 
 
 void str_cat(char *str1,char *str2)
 
     while(*str1)
         str1++;
 
     while(*str1++=*str2++)
         ;
 

 

4.task4

task4.c

 #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;
         else 
         
             begin++;
             end--;
         
     
     return 1;
 

 

5.task5

task5.c

 #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)
         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\';
 

 

6.task6

task6_1.c

 #include<stdio.h>
 #include<string.h>
 void sort(char *name[],int n);
 
 int main()
 
     char *course[4]="C program","C++ Object Oriented Program","Operating System","Data Structure and Algorithms";
     int i;
     sort(course,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)
     
         for(j=0;j<n-1-i;++j)
         
             if(strcmp(name[j],name[j+1])>0)//strcmp比较字符串,<0表示s1<s2;>0表示s1大于s2
             
                 tmp=name[j];
                 name[j]=name[j+1];
                 name[j+1]=tmp;
             
         
     
 

task6_2.c

 #include<stdio.h>
 #include<string.h>
 void sort(char *name[],int n);
 
 int main()
 
     char *course[4]="C program","C++ Object Oriented Program","Operating System","Data Structure and Algorithms";
     int i;
     sort(course,4);
     for(i=0;i<4;i++)
         printf("%s\\n",course[i]);
 
     return 0;
 
 void sort(char *name[],int n)
 
     int i,j,k;
     char *tmp;
 
     for(i=0;i<n-1;i++)
     
         k=i;
         for(j=i+1;j<n;j++)
         
             if(strcmp(name[j],name[k])<0)
                 k=j;
         
         if(k!=i)
         
             tmp=name[i];
             name[i]=name[k];
             name[k]=tmp;
         
     
 

 

两种算法实现中,交换的是指针变量的值。

 

7.task7

task7.c

 #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)
 
     if(strlen(str)!=18)
         return 0;
     else
         
             while(((*str>=\'0\'&&*str<=\'9\')||(*str==\'X\'))&&(*str!=\'\\0\'))
                 str++;
             if(*str==\'\\0\')
                 return 1;
             else 
                 return 0;
         
 

 

8.task8

task8.c

 #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;
 
 
 /*函数定义
 功能:对s指向的字符串进行编码处理
 编码规则:
 对于a~z或A~Z之间的字母字符,用其后的字符替换; 其中,z用a替换,Z用A替换
 其它非字母字符,保持不变
 */
 void encoder(char *s)
 
     char *p;
     p=s;
     while(*p)
     
         if((*p>=\'a\'&&*p<=\'z\')||(*p>=\'A\'&&*p<=\'Z\'))
             (*p)++;
         else if(*p==\'z\'||*p==\'Z\')
             *p=*p-25;
         p++;
     
 
 
 /*函数定义
 功能:对s指向的字符串进行解码处理
 解码规则:
 对于a~z或A~Z之间的字母字符,用其前面的字符替换; 其中,a用z替换,A用Z替换
 其它非字母字符,保持不变
 */
 void decoder(char *s)
 
     char *p;
     p=s;
     while(*p)
     
         if(*p>=\'b\'&&*p<=\'z\'||*p>=\'B\'&&*p<=\'Z\')
             (*p)--;
         else if (*p==\'a\'||*p==\'A\')
             *p=*p+25;
         p++;
     
 

 

指针实验

实验项目:指针实验

姓名:黄澄? ? 实验地点:514教室? ?实验时间:2019.6.13

一、目的和要求

1、掌握指针的概念和定义方法
2、掌握指针的操作符和指针的运算
3、掌握指针与数组的关系
4、掌握指针与字符串的关系
5、熟悉指针作为函数的参数以及返回指针的函数
6、了解函数指针

二、实验内容

实验练习8.3.11

问题的简单描述:

(1)定义一个整型指针变量p,使它指向一个整型变量a,定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外一个整型变量c并赋初值3(2)使用指针变量,调用scanf函数分别输入a和b的值(3)通过指针间接访问并输出a,b的值(4)按十六进制方式输出p,q的值以及a,b的地址(5)将p指向c,通过p间接访问c的值并输出(6)输出p的值及c的地址,并与上面的结果进行比较

2、实验代码

#include<stdio.h>
int main()

    int *p,a,c=2;
    float *q,b;
    p=&a;
    q=&b;
    printf("please input the value of a,b:");
    scanf("%d%f",&a,&b);//使用指针p和q输入a,b的值
    printf("result:\\n");
    printf("     %d,%f\\n",a,b);
    printf("     %d,%f\\n",*p,*q);//指针p和q间接输出a,b的值
    printf("The Address of a,b:%p,%p\\n",&a,&b);
    printf("The Address of a,b:%p,%p\\n",p,q);//输出p和q的值并与上行输出结果进行比较
    p=&c;
    printf("c=%d\\n",*p);
    printf("The Address of c:%x,%x\\n",*p,p);//输出p的值以及c的地址
    return 0;

技术图片

3问题分析:

实验练习8.3.2?

1问题的简单描述:

(1)定义两个函数,分别为void swap1(int a,int b)和swap2(inta.intb),用于交换a,b的值。(2)从主函数中分别输入两个整型变量a、b。(3)从主函数中分别调用上述两个交换函数,并打印输出交换后a、b的结果。

2、实验代码


#include<stdio.h>
void swap1(int x,int y);
void swap2(int *x,int *y);
int main()

    int a,b;
    printf("please input a=:");
    scanf("%d",&a);
    printf("\\n      b=:");
    scanf("%d",&b);
    swap1(a,b);
    printf("\\nAfter Call swap1:a=%d n=%d\\n",a,b);
    swap2(&a,&b);
    printf("\\nAfter Call swap2:a=%d n=%d\\n",a,b);
    return 0;

void swap1(int x,int y)

    int temp;
    temp=x;
    x=y;
    y=temp;

void swap2(int *x,int *y)

    int temp;
    temp=*x;
    *x=*y;
    *y=temp;

技术图片

3问题分析:

实验练习8.3.3

?1问题的简单描述

(1)定义两个字符指针,通过gets()函数输入两个字符串。(2)定义一个函数charreverse(charstr),通过指针移动方式将字符串反转。(3)定义一个函charlink(charstr1,char*str2),通过指针移动方式将两个字符串连接起来。(4)从主函数中分别调用上述函数,输入字符串并打印输出结果。

2实验代码:


#include<stdio.h>
char *reverse(char *str);
char *link(char *str1,char *str2);
int main()

    char str[30],str1[30],*str2;
    printf("Input Reversed Character String:");
    gets(str);
    str2=reverse(str);
    printf("\\nOutput Reversed Character String:");
    puts(str2);
    printf("Input string1:");
    gets(str);
    printf("\\nInput String2:");
    gets(str1);
    str2=link(str,str1);
    puts(str2);
    return 0;
 
char *reverse(char *str)

    char *p,*q,temp;
    p=str,q=str;
    while(*p!='\\0')//判断是否到达最后一个字符        
           p++;
         
    p--;
    while(q<p) 
    
        temp=*q;
        *q=*p;
        *p=temp;
        q++;
        p--;
    
    return str;

char *link(char *str1,char *str2)

    char *p=str1,*q=str2;
    while(*p!='\\0')
        p++;
    while(*q!='\\0')
    
        *p=*q;
        p++;
        q--;
    
    *p='\\0';
    return str1;

3问题分析:

技术图片

实验练习8.3.3?1

问题的简单描述:??

(1)定义一个整型一维数组,任意输入数组的元素,其中包含奇数和偶数。
?(2)定义一个函数,实现将数组元素奇数在左,偶数在右的排列。
?(3)在上述定义的函数中,不允许再增加新的数组。
?(4)从主函数中分别调用上述函数,打印输出结果。

2实验代码:


#include<stdio.h>
#define N 10
void arrsort(int a[],int n);
int main()

    int a[N],i;
    for(i=0;i<N;i++)
    scanf("%d",&a[i]);
    arrsort(a,N);
    for(i=0;i<N;i++)
    printf("%d ",a[i]);

void arrsort(int a[],int n)

    int *p,*q,temp;
    p=a;
    q=a+n-1;
    while(p<q)
    
        while(*p%2==1)
        
            p++;
        
        while(*q%2==0)
        
            q--;
        
        if(p>q)
        break;
        else
        
        temp=*p;
        *p=*q;
        *q=temp;
        p++;
        q--;
        
    

技术图片

3问题分析

三、实验小结

以上是关于实验5 指针的主要内容,如果未能解决你的问题,请参考以下文章

实验5 数组和指针

实验5 数组和指针

实验5 数组和指针

实验5 数组和指针

实验5 数组和指针

第八章 指针实验