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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

1回答

602閲覧

ランダムに表示するコードについて

vamos

総合スコア2

C

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

0グッド

0クリップ

投稿2021/04/21 03:18

前提・実現したいこと

質問の順番をランダムに表示するrandom_number関数を教えていただきたいです。
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define N 256

typedef struct _Question{
int qid;
char qstr[256];
char qtype[256];
int answer;
} Question;

bool read_questions(char* path, Question* qp)
{
FILE* fp;
fp = fopen(path, "r");
if (fp == NULL){
printf("ファイルオープンに失敗しました.\n");
return false;
}
char line[256];
char q[256];
char type[256];
int no;

int i = 0; while( fgets(line, N, fp) != NULL) { sscanf(line, "%d,%[^,],%s", &no, q, type); qp[i].qid = no; strcpy(qp[i].qstr, q); strcpy(qp[i].qtype, type); i+=1; } fclose(fp); return true;

}

void random_number(int* ary)
{

// ここに,質問順序をランダムに決める処理を記述する

}

int print_option(int qid)
{
if (qid != 7 && qid != 9){
printf("\t1: きわめて当てはまらない\n");
printf("\t2: やや当てはまらない\n");
printf("\t3: どちらでもない\n");
printf("\t4: やや当てはまる\n");
printf("\t5: きわめて当てはまる\n");
}
else if (qid == 7 || qid == 9)
{
printf("\t1: きわめて当てはまる\n");
printf("\t2: やや当てはまる\n");
printf("\t3: どちらでもない\n");
printf("\t4: やや当てはまらない\n");
printf("\t5: きわめて当てはまらない\n");
}
int ok = 0;
int input = 0;
printf("当てはまる番号(半角数字)を回答してください: ");
scanf("%d", &input);
while(ok != 1)
{
if ( input >= 1 && input <= 5){
ok = 1;
break;
}
else{
printf("1~5の整数で入力してください.\n");
input = 0;
scanf("%*c%d", &input);
}
}
return input;
}

void disp_question(Question* qp)
{
int ary[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
// ランダムに出題する
random_number(ary);
for(int i = 0; i < 12; i++){
printf("----------------------------\n");
printf("「%s」\n", qp[ary[i]].qstr);
int input = print_option(qp[ary[i]].qid);
qp[ary[i]].answer = input;
printf("\n");
}
}

// 回答結果に基づいて各指標のスコア計算を行う
void calc_score(Question* qp, int* scores)
{
for (int i = 0; i <12; i++)
{
if (qp[i].qid == 1 || qp[i].qid == 6 ){
scores[0] += qp[i].answer;
}
else if (qp[i].qid == 5 || qp[i].qid == 10){
scores[1] += qp[i].answer;
}
else if (qp[i].qid == 4 || qp[i].qid == 9){
scores[2] += qp[i].answer;
}
else if (qp[i].qid == 2 || qp[i].qid == 7 || qp[i].qid == 12){
scores[3] += qp[i].answer;
}else{
scores[4] += qp[i].answer;
}
}
}

// メイン関数
void main(void)
{
// ランダム関数のシードの設定
srand((unsigned) time(NULL));

// 12questions.txt を読み込んで配列に格納する Question qp[12]; read_questions("12questions.txt", qp); // 読み込んだ質問を1問ずつ提示し, // 回答させる.回答した番号を配列に格納する disp_question(qp); // 配列に格納した番号をもとに,5指標に対するスコアを計算する int scores[5]; calc_score(qp, scores); // 計算したスコアを可視化(+マークの数で表示) puts("____NPA性格診断結果____"); char* ptypes[5] = {"外向性", "神経質傾向", "誠実性", "調和性", "経験への開放性" }; for (int i = 0; i< 5; i++) { printf("%-15s\t", ptypes[i]); for (int j=0; j<scores[i]; j++){ printf("+"); } printf("\n"); }

}%

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/04/21 03:33

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
kazuma-s

2021/04/21 04:49

質問の表示を見て「エラーメッセージ」と「ソースコード」がなぜ四角い枠の中に入っていて、 背景が灰色になっているか不思議に思いませんか? #include の # が消えて、include が太字になっているの変だと思いませんか? 「ソースコード」を「#include ... }」で上書きしてください。 「例)PHP(CakePHP)で●●なシステムを作っています。」なども あなたの質問ではありませんから、削除してください。 質問は編集できます。
guest

回答1

0

ベストアンサー

こんなんでよろしいか?

C

1void random_number(int* ary) 2{ 3 int i; 4//printf("before:"); for ( i = 0; i < 12; ++i ) { printf("%d ", ary[i]); } printf("\n"); 5 6 for ( i = 11; i >= 0; --i ) { // i = 11, 10, 9 ... に対し 7 int j = rand() % (i+1); // 範囲 0~i の乱数を j に求めて 8 int tmp = ary[i]; // ary[i] と ary[j] を交換する 9 ary[i] = ary[j]; 10 ary[j] = tmp; 11 } 12//printf("after :"); for ( i = 0; i < 12; ++i ) { printf("%d ", ary[i]); } printf("\n"); 13 14}

投稿2021/04/21 03:56

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問