实验六

task1.1

 1 #include <stdio.h>
 2 #define N 4
 3 
 4 int main()
 5 {
 6     int x[N] = {1, 9, 8, 4};
 7     int i;
 8     int *p;
 9     
10     // 方式1:通过数组名和下标遍历输出数组元素
11     for(i=0; i<N; ++i)
12         printf("%d", x[i]);
13     printf("\n");
14     
15     // 方式2:通过指针变量遍历输出数组元素 (写法1) 
16     for(p=x; p<x+N; ++p)
17         printf("%d", *p);
18     printf("\n"); 
19     
20     // 方式2:通过指针变量遍历输出数组元素(写法2) 
21     p = x;
22     for(i=0; i<N; ++i)
23         printf("%d", *(p+i));
24     printf("\n");
25 
26     // 方式2:通过指针变量遍历输出数组元素(写法3) 
27     p = x;
28     for(i=0; i<N; ++i)
29         printf("%d", p[i]);
30     printf("\n");
31         
32     return 0;
33 }

回答

++p;

p=2002;

 

task1-2

 1 #include <stdio.h>
 2 #define N 4
 3 
 4 int main()
 5 {
 6     char x[N] = {'1', '9', '8', '4'};
 7     int i;
 8     char *p;
 9     
10     // 方式1:通过数组名和下标遍历输出数组元素
11     for(i=0; i<N; ++i)
12         printf("%c", x[i]);
13     printf("\n");
14     
15     // 方式2:通过指针变量遍历输出数组元素 (写法1) 
16     for(p=x; p<x+N; ++p)
17         printf("%c", *p);
18     printf("\n"); 
19     
20     // 方式2:通过指针变量遍历输出数组元素(写法2) 
21     p = x;
22     for(i=0; i<N; ++i)
23         printf("%c", *(p+i));
24     printf("\n");
25 
26     // 方式2:通过指针变量遍历输出数组元素(写法3) 
27     p = x;
28     for(i=0; i<N; ++i)
29         printf("%c", p[i]);
30     printf("\n");
31         
32     return 0;
33 }

问题

p++;

p=2001;

 

结果不同的原因:因为定义指针变量P时不一样

 

 

task2-1

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int x[2][4] = { {1,9,8,4}, {2,0,2,2}} ;
 6     int i, j;
 7     int *p;            // 指针变量,存放int类型数据的地址 
 8     int (*q)[4];    // 指针变量,指向包含4个int型元素的一维数组 
 9     
10     // 使用数组名、下标访问二维数组元素
11     for(i=0; i<2; ++i)
12     {
13         for(j=0; j<4; ++j)
14             printf("%d", x[i][j]);
15         printf("\n");
16      } 
17     
18     // 使用指针变量p间接访问二维数组元素
19     for(p = &x[0][0], i = 0; p < &x[0][0] + 8; ++p, ++i)
20     {
21         printf("%d", *p);
22         if( (i+1)%4 == 0)
23             printf("\n");
24     }
25     
26     // 使用指针变量q间接访问二维数组元素 
27     for(q=x; q<x+2; ++q)
28     {
29         for(j=0; j<4; ++j)
30             printf("%d", *(*q+j));
31         printf("\n");
32     }
33     
34     return 0;
35 }

p=2002;

q=2008;

 

taks2-2

#include <stdio.h>

int main()
{
    char x[2][4] = { {'1', '9', '8', '4'}, {'2', '0', '2', '2'} };
    int i, j;
    char *p;        // 指针变量,存放char类型数据的地址 
    char (*q)[4];    // 指针变量,指向包含4个char型元素的一维数组 
    
    // 使用数组名、下标访问二维数组元素
    for(i=0; i<2; ++i)
    {
        for(j=0; j<4; ++j)
            printf("%c", x[i][j]);
        printf("\n");
     } 
    
    // 使用指针变量p间接访问二维数组元素
    for(p = &x[0][0], i = 0; p < &x[0][0] + 8; ++p, ++i)
    {
        printf("%c", *p);
        if( (i+1)%4 == 0)
            printf("\n");
    }
    
    // 使用指针变量q间接访问二维数组元素 
    for(q=x; q<x+2; ++q)
    {
        for(j=0; j<4; ++j)
            printf("%c", *(*q+j));
        printf("\n");
    }
    
    return 0;
}

p=2001;

q=2004;

 

task3-1

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

1.数组s1的大小是13;sizeof(s1)计算的是数组的所有的大小,strlen计算的是字符串的有效的大小;

2.不能;

 

 

task3-2

#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.存放s1的首地址;sizeof计算数组所有的大小;strlen计算字符串的有效大小;

2.可以;

3.交换的是指针变量s1,s2里存放的值;没有;

task4

#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 k=1;
    if(strlen(str)!=18)
    return k-1;
    
    else
    {
         char *i;
         i=str;
        int j=1;
        for(i=str;i<str+(strlen (str))&&j==1;i++)
        {
            if(((*i)<='9'&&(*i)>='0')||(*i)=='X')
            j=1;
            else j=0;
        }
        if(j==0)
        k=k-1;
    }    
    return k;
}

 

 

task5

#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)
{
    int M,k=1;
    M=strlen(s);
    char *i,*j;
    if(M/2)
    {
        for(i=s,j=s+M-1;i<s+M&&k==1;i++,j--)
        {
            if(*i==*j)     
            k=1;
            else
            k=0;
        }
        return k;
    }
    

}

 

 

task6

 1 #include <stdio.h>
 2 #define N 80
 3 void encoder(char *s);  // 函数声明 
 4 void decoder(char *s);  // 函数声明
 5 
 6 int main()
 7 {
 8     char words[N];
 9     
10     printf("输入英文文本: ");
11     gets(words);
12     
13     printf("编码后的英文文本: ");
14     encoder(words);  // 函数调用
15     printf("%s\n", words);
16     
17     printf("对编码后的英文文本解码: ");
18     decoder(words);  // 函数调用
19     printf("%s\n", words);
20     
21     return 0;
22 }
23 
24 
25 /*函数定义
26 功能:对s指向的字符串进行编码处理
27 编码规则:
28 对于a~z或A~Z之间的字母字符,用其后的字符替换; 其中,z用a替换,Z用A替换 
29 其它非字母字符,保持不变 
30 */
31 void encoder(char *s)
32 {
33     char *i;
34     for(i=s;i<s+sizeof(s)-1;i++)
35     {
36         if((*i)>='a'&&(*i)<'z'||(*i)>='A'&&(*i)<'Z')
37         (*i)++;
38         if ((*i)=='Z')
39            (*i)='A';
40         if((*i)=='z')
41             (*i)='a';    
42         
43     }
44 }
45 
46 
47 /*函数定义
48 功能:对s指向的字符串进行解码处理
49 解码规则:
50 对于a~z或A~Z之间的字母字符,用其前面的字符替换; 其中,a用z替换,A用Z替换 
51 其它非字母字符,保持不变 
52 */
53 void decoder(char *s)
54 {
55     char *i;
56     for(i=s;i<s+sizeof(s)-1;i++)
57     {
58         if((*i)>'a'&&(*i)<='z'||(*i)>'A'&&(*i)<='Z')
59         (*i)--;
60         if ((*i)=='A')
61         (*i)='Z';
62         if((*i)=='a')
63         (*i)='z';    
64         
65     }
66 }

 

posted @ 2022-06-14 00:39  19度的小常  阅读(2)  评论(2编辑  收藏  举报