實驗5 C語言指標應用程式設計

唐文鑫發表於2024-12-08
實驗一:
#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 min, max;

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

問題一:找到輸入陣列中的最大值和最小值

問題二:最小值的地址,最大值的地址

#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");
    output(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 max_index = 0;
    int i;

    for(i = 0; i < n; ++i)
        if(x[i] > x[max_index])
            max_index = i;
    
    return &x[max_index];
}

問題一:返回最大值的地址

問題二:可以

實驗二:

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

問題一:80;所佔位元組的數量;陣列s1的元素個數

問題二:不能。陣列的賦值不能像普通變數一樣賦值。

問題三:交換了

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

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

問題一:字串第一個字元L的地址 ;s1所佔位元組的大小;s1 中所含元素的個數 ;

問題二:可以;2.1是定義的同時初始化,2.2是先定義,再賦值

問題三:交換的是s1 和s2的地址,在記憶體中並未交換。

實驗三:

#include <stdio.h>

int main() {
    int x[2][4] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
    int i, j;
    int *ptr1;     // 指標變數,存放int型別資料的地址
    int(*ptr2)[4]; // 指標變數,指向包含4個int元素的一維陣列

    printf("輸出1: 使用陣列名、下標直接訪問二維陣列元素\n");
    for (i = 0; i < 2; ++i) {
        for (j = 0; j < 4; ++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;
}

實驗四:

#include <stdio.h>
#define N 80

void replace(char *str, char old_char, char new_char); // 函式宣告

int main() {
    char text[N] = "Programming 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++;
    }
}

問題一:將陣列裡面的 old-char 用new-char 替換

問題二:可以

實驗五:

#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 x){
    int i ;
    for(i=0;i<N;i++){    
        if(str[i]==x)
          str[i]='\0' ;
          
    }
    
}

實驗六:

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

int check_id(char *str) {
    int len, i ;
    len=strlen(str) ;
    if(len!=18)
      return 0 ;
      
    for(i=0;i<17;i++){
        if(str[i]<'0' || str[i]>'9')
          return 0 ;        
    }
    
    if(str[17]<'0' || str[17]>'9' && str[17]!='X')
        return 0 ;
    
    else
      return 1 ;
    
}
   

實驗七:

#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) {
    while(*str!='\0'){
      if(('A'<=*str && *str <='X') || ('a'<=*str && *str<='x'))
        *str += n ;
      else if(*str=='Y')
        *str='A' ;
      else if(*str=='y')
        *str='a' ;
      else if(*str=='Z')
        *str='B' ;
      else if(*str=='z')
        *str='b' ;
      str++ ;
    }
}

void decoder(char *str, int n) {
    while(*str!='\0'){
      if(('C'<=*str && *str <='Z') || ('c'<=*str && *str<='z'))
        *str -= n ;
      else if(*str=='A')
        *str='Y' ;
      else if(*str=='a')
        *str='y' ;
      else if(*str=='B')
        *str='Z' ;
      else if(*str=='b')
        *str='z' ;
      str++ ;
    }
}

實驗八:

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
    int i ,j;
    char *str ;
    for(i=0;i<argc-1;i++){    
       for(j=0;j<argc-1-i;j++){
           if (strcmp(argv[j],argv[j+1])>0){
              str=argv[j] ;
              argv[j]=argv[j+1] ;
              argv[j+1]=str ;
           }
      }
    }
    
    for(i = 1; i < argc; ++i)
        printf("hello, %s\n", argv[i]);

    return 0;
}

相關文章