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

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

ただいまの
回答率

90.52%

  • C

    3685questions

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

c:構造体 ポインター配列

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 196
#include <stdio.h>

struct Data {
    int *tensu;
    int *grede;
    double av;
};

int main()
{
    struct Data item;

    item.tensu[3];
    item.grede[3];
    int name[3] = {"英語","数学","情報"};
    double tatal = item.av;

    for (int i = 0; i< 3; i++) {
        printf("%d: ", name[i]); scanf("%d", &item.tensu[i]);
    }

    printf("平均点: %lf", item.tensu);


    return 0;
}

構造体を使用し、プログラム実行時に英語、数学、情報の得点を入力して、平均点、評価を出力するプログラムを作りたいです。
・秀:90 以上、優:80 以上、良:70 以上、可:60 以上、不可:60 未満
・繰り返し処理を使うこと
・科目名(英語、数学、情報)は文字型ポインタの配列を用いて定義する こと ・成績(秀、優、良、可、不可)も文字型ポインタの配列を用いて定義すること

 困っていること

構造体の定義がこれであっているのかが分からなくて困っています。
また、入力後の判定や平均点を求めるプログラムが分からなくて困っています。

参考書に回答がなく分からなくて困っているので出来れば具体的なコードをご教授して頂けると助かります。

追記
[定義する構造体] 構造体タグ:Data (構造体のメンバ)
点数を入れるint型配列変数tensu 個人の平均点を入れるdouble型変数av
※構造体メンバのうち配列変数 tensu は、tensu[0]:英語、tensu[1]:数学、tensu[2]:情報として使用する
点数の入力は 0~100 までのみとして考えてよい (実行例の太字下線部は標準入力からの入力)
イメージ
英語:98
数学:76
情報:62 平均点:78.7 
英語の成績:秀 
数学の成績:良 
情報の成績:可

#include <stdio.h>

struct Data {
     int tensu[3];
    int *grede;
    double av;
};

int main()
{
    struct Data item;

    int *key = item.tensu;
    item.grede[3];
    item.av;
    float sum;
    char *kamokumei[] = {"英語", "数学", "情報"};

    for (int i = 0; i< 3; i++) {
        printf("%s: ", kamokumei[i]);
        scanf("%d", &key[i]);
        sum += key[i];
    }

    item.av = sum / 3;

    printf("平均点: %.1f\n", item.av);

    return 0;
}

現状のコードでは平均までを求めることができました。
繰り返し処理での判定の仕方がわからないです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • LouiS0616

    2018/06/28 01:21

    構造体にどのようなデータを格納する必要があるのか、具体的な指定はあるのでしょうか。

    キャンセル

  • swift-study-now

    2018/06/28 01:27

    追記しました。問題文を以上になります。

    キャンセル

回答 3

checkベストアンサー

+2

構造体の定義がこれであっているのかが分からなくて困っています。

問題文に従ってそのまま書けば、こんなふうになるんじゃないでしょうか。

struct Data {
    int tensu[3];
    double av;
};

tensuをポインタで宣言してしまうと、後から動的に領域を確保する必要が生じ面倒です。


科目名(英語、数学、情報)は文字型ポインタの配列を用いて定義すること

これも字義通りに捉えれば、次のようになります。

char *kamokumei[] = {"英語", "数学", "情報"};

成績の配列も同様。


また、入力後の判定や平均点を求めるプログラムが分からなくて困っています。

以上の点を踏まえて、とりあえず書いてみましょう。
現状のコードは問題点が山積みなので、端から端まで指摘するのは避けたいです。

追記を受けて

まず、次の処理は全く不要です。
二行目に至っては存在しない第3要素にアクセスしようとしてしまっています。

int *key = item.tensu;
item.grede[3];
item.av;

それに伴って、入力処理周りも少し修正が要ります。

for (int i = 0; i< 3; i++) {
    printf("%s: ", kamokumei[i]);
    // scanf("%d", &key[i]);
    scanf("%d", &item.tensu[i]);
    // sum += key[i];
    sum += item.tensu[i];
}

また、sumの型をfloatにする必然性が全くないので、doubleにした方が良いでしょう。


判定処理のところについてお聞きしたいのですが
条件分岐でならば判定処理出来るのですが繰り返し処理での判定の仕方が分からないです。

繰り返し処理は単に科目を巡回するためだけに使うのだと思います。
成績の判定は条件分岐で良いのでは。

char *seiseki[] = {"秀", "優", "良", "可", "不可"};
for(int i = 0; i < 3; i++) {
    int score = item.tensu[i];
    printf("%s ", kamokumei[i]);

    if(tensuが90以上) {
        seiseki[0]を出力;
    }
    else if(tensuが80以上) {
        seiseki[1]を出力;
    }
    以下略
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/28 09:12

    教えて頂いた通りにしました。
    入力までは処理までは出来ました。
    判定処理のところについてお聞きしたいのですが
    条件分岐でならば判定処理出来るのですが繰り返し処理での判定の仕方が分からないです。
    教えて頂けないでしょうか?

    キャンセル

  • 2018/06/28 14:47

    追記しました。

    キャンセル

0

item.tensu = (int*)malloc(sizeof(int);
// this is the way to initialize dynamic memory

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

-1

for more info https://www.programiz.com/c-programming/c-dynamic-memory-allocation

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • C

    3685questions

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