質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • C

    3561questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Visual Studio

    1763questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

配列のaの値を配列bに逆順にコピーするプログラムをつくることができません

解決済

回答 7

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 486

masuter0413

score 8

#include <stdio.h>
#include <stdlib.h>
int main() {
    int a[N] = { 1,2,3,4,5,6,7,8,9,10 };
    int b[N];
    int *p, *q;
    int i;
    p= //何かを代入
    q= //何かを代入
       //配列aを出力する
       //while文を使って、逆順コピーのプログラムをかく。ただし、aとpとqを使用する。
    //配列bを出力する
    return 0;
}


//実行例
a [] : 1 2 3 4 5 6 7 8 9 10
b [] : 10 9 8 7 6 5 4 3 2 1

先生は、この方法で書いて来いといわれました。
僕は、pにはaのアドレスを、qにはbのアドレスを代入する?
配列aの出力はfor文で、というところまではなんとなくイメージできるのですが、そこから先が分かりません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • HogeAnimalLover

    2018/04/29 21:28

    丸投げですね。

    キャンセル

  • 退会済みユーザー

    2018/04/30 12:48

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 7

+7

「わかりませんでした」と正直に言いましょう。
そうすれば先生は指導方法を生徒に合わせて最適化できます。
できたふりをすれば次に進むだけなので、今後の授業時間がすべてつまらない無駄な時間になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/29 22:13

    正直に伝えること、全く同感です。
    「○○はわかるですが、xxは△△なんでよくわかりません」
    なんて伝えれば良いかも!

    キャンセル

  • 2018/04/29 22:15

    そうしないと先生も生徒もどっちも不幸になりますね。

    キャンセル

+1

配列aの出力はfor文で、というところまではなんとなくイメージできるのですが、そこから先が分かりません。

イメージ出来てるところまで、とりあえずコードを書きましょう。
一歩踏み出せば、周りの景色も変わってくるのだから・・・

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/29 22:04

    #include <stdio.h>
    #include <stdlib.h>
    #define N 10

    int main() {
    int a[N] = { 1,2,3,4,5,6,7,8,9,10 };
    int b[N];
    int *p, *q;
    int i;
    p = a;
    q = b;
    for (i = 0; i < N; i++) {
    if (i == 0)printf("a[] :");
    printf("%d ", a[i]);
    }
    return 0;
    }

    とりあえずここまでかけました

    キャンセル

0

Cなど不要。そう、シェル芸ならね!

$ echo 1 2 3 4 5 6 7 8 9 10|xargs -n1|tail -r|xargs
10 9 8 7 6 5 4 3 2 1


追記
Windowsなら、PowerShell芸にまかせろ!

PS> $a = 1,2,3,4,5,6,7,8,9,10
PS> $b = $a[($a.length-1)..0]
PS> "$b"
10 9 8 7 6 5 4 3 2 1

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/29 22:01

    くっ

    キャンセル

  • 2018/04/29 22:07

    Windowsみたいなので、せめてバッチファイル? それを System で呼び出せと?

    キャンセル

  • 2018/04/29 22:18 編集

    PowerShell芸を追記しました。

    キャンセル

0

ヒントだけ書いておきます。
a [] : 1 2 3 4 5 6 7 8 9 10
b [] : 10 9 8 7 6 5 4 3 2 1 

aの0番目はbの9番目
aの1番目はbの8番目
...
aの9番目はbの0番目となりますよね?

これをもとにaのi番目はbの何番目かiを使って表すことができます。
それをfor文かwhile文で処理して表示すればいいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

問題がむずかしかったら時も対処法には次のものがあります。

  1. 問題を分割して、もっと簡単な問題の組み合わせにする。
  2. 類似しているが、もっと簡単な問題をまずは解く、それを元にして目的の問題を解く。

今回は、まずは、逆順でなく、同じ順次でコピーするようにしてみては?
それができたら、すこし変更するだけで逆順にコピーできるのと思います。
先頭から順番にとってきて末尾から置いていくか、 
末尾から順番にとってきて、先頭から置いていくかの2つの方針が考えらえれます。
(これは方針2の考えから)

方法2 の考えかたをするなら、
A. そのままコピーする, B. 配列を逆順にする
の2つの方法をみつけて、コピーしてから逆順にすることで問題が解けます。
でもこの方法は今回のゴールのコーディングの形とは異なったものになってしまうとおもわれますが...

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

回答例のコードが既に示されていますが、
べつ方法 (bの末尾からではなく、先頭か値を埋めていく) と、コードの整形をしたものを示します。

a.c

#include <stdlib.h>

#define N (10)

void print_array(int * array, char * name) {
  printf("%s[] :", name);
  for (int i = 0; i < N; i++) {
    printf(" %2d", array[i]);
  }
  printf("\n");
}

int main() {
    int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int b[N];

    print_array(a, "a");

    // while文を使って、逆順コピーのプログラムをかく。ただし、aとpとqを使用する。
    int * p = &a[N - 1];
    int * q = b;
    while (p != a) {
        *q++ = *p--;
    }

    print_array(b, "b");

    return 0;
}


実行結果
イメージ説明

整形のポイントは次の点です。

  1. メソッド定義してコードの繰り返しを避けた (配列の内容表示)
  2. 必要な処理の直前で変数定義をする。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

-1

 コード

#include <stdio.h>
#include <stdlib.h>

#define N (10)

int main() {
    int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int b[N];
    int *p, *q;
    int i;

    p = &a[0];//何かを代入
    q = &b[N-1];//何かを代入

    //配列aを出力する
    printf("a[] :");
    for (i = 0; i < N; i++) {
        printf(" %d", a[i]);
    }
    printf("\n");

    //while文を使って、逆順コピーのプログラムをかく。ただし、aとpとqを使用する。
    while (p != &a[N]) {
        *q-- = *p++;
    }

  //配列bを出力する
    printf("b[] :");
    for (i = 0; i < N; i++) {
        printf(" %d", b[i]);
    }
    printf("\n");
  
    return 0;
}

 出力

a[] : 1 2 3 4 5 6 7 8 9 10
b[] : 10 9 8 7 6 5 4 3 2 1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3561questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Visual Studio

    1763questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。