2016年1月24日日曜日

C言語:ポインタ

問題1.
変数aの内容と変数bの内容を入れかえるプログラムを、ポインタを用いて作成してください。

問題2.
1から100までの和を求めるプログラムを、ポインタを用いて作成してください。

問題3.
キーボードから10個の整数を配列に入れ、その中の最大値を求めるプログラムを
ポインタを用いて作成してください。

問題4.
下記のソーティングプログラムを、ポインタを用いたものに書き換えてください。

[プログラム説明]
適当な整数を10個キーボードから入力し、そのソート前とソート後の結果を表示するプログラム。

[プログラム]
int main() {
    int a[10], i, j, w;
    printf("整数を10個入力しなさい\n");
    for(i=0; i<=9; i++)
        scanf("%d", &a[i]);
    printf("ソート前… ");
    for(i=0; i<=9; i++)
        printf("%d ", a[i]);
    for(i=0; i<=9; i++)
        for(j=0; j<=9-1; j++)
            if(a[j] > a[j+1]){
                w = a[j];
                a[j] = a[j+1];
                a[j+1] = w;
            }
    printf("\nソート後… \n");
    for(i=0; i<=9; i++)
        printf("%d ", a[i]);
}
問題5.
下記のプログラムにおいて、データにない頭文字が入力されてきたとき
"該当するデータはありません"
と出力されるように、修正を加えてください。

[プログラム説明]
適当に5人の名前を選び、それらの名前をローマ字でポインタ型の配列に初期設定する。
キーボードから英大文字1字を入力し、その英字を名前の先頭にもつ人だけを出力するプログラム。

[プログラム]
int main() {
    char head, *name[5]={"Shibasaki", "Usami", "Muto", "Miyaichi", "Kushibiki"};
    int i;
    printf("英大文字を1字入力しなさい\n");
    scanf("%c", &head);
    printf("%cを先頭に持つ名前は…", head);
    for(i=0; i<=4; i++)
        if(*name[i] == head)
            printf("%s ", name[i]);
    printf("\n");
}

問題1のプログラム
int main(void){
  int *pa,*pb,*x;
  int a = 1,b = 2;
  printf("変数:a=%d  b=%d\n", a,b);
  pa = &a;
  pb = &b;
  printf("入れ替え前:ポインタpa=%d  ポインタpb=%d\n", *pa,*pb);
  x  = pa;
  pa = pb;
  pb = x;
  printf("入れ替え後:ポインタpa=%d  ポインタpb=%d\n", *pa,*pb);
  return 0;
}

問題2のプログラム
int main(void){
  int a = 1,x = a;
  int *pa;
  for (a=2;a<=100;a++){
     x = x + a;
     pa = &x;
  }
  printf("1から100までの和は%d\n",*pa);
}

問題3のプログラム
int main(void){
  int a[10],i,max;
  int *p,*s;
  for(i=0;i<10 i="" p="">    printf("整数を10個入力してください:");
    scanf("%d",&a[i]);
  }
  p = a;
  for(i=1,max=*p;i<10 i="" p="">    if(max<*(p+i)){
      max = *(p+i);}
  }
 printf("最大値は%d",max);
}

問題4のプログラム
int main() {
    int a[10], i, j, w;
    int *p;
    printf("整数を10個入力しなさい\n");
    for(i=0; i<=9; i++)
        scanf("%d", &a[i]);
    //ポインタに配列を代入
    p = a;
    printf("ソート前… ");
    for(i=0; i<=9; i++)
        printf("%d ", *(p+i));
    for(i=0; i<=9; i++)
        for(j=0; j<=9-1; j++)
            if(*(p+j) > *(p+j+1)){
                w = *(p+j);
                *(p+j) = *(p+j+1);
                *(p+j+1) = w;
            }
    printf("\nソート後… ");
    for(i=0; i<=9; i++)
        printf("%d ", *(p+i));
}

問題5のプログラム(これはもっと良い方法があると思うな...)
int main() {
    char head, *name[5]={"Shibasaki", "Usami", "Muto", "Miyaichi", "Kushibiki"};
    int i,j=0;
    printf("英大文字を1字入力しなさい\n");
    scanf("%c", &head);
    printf("%cを先頭に持つ名前・・・", head);
    for(i=0; i<=4; i++){
        if(*name[i] == head){
            printf(" %s", name[i]);
            j++;
        }
      }
        if(j==0)printf("該当するデータはありません");
    printf("\n");
}

0 件のコメント:

コメントを投稿