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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1146閲覧

C言語: switch文の中身をシャッフルするにはどうすればいでしょうか。

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

1グッド

1クリップ

投稿2020/04/06 11:43

編集2020/04/08 03:10

以下のコードのswitch文についてですが、現状例えば1のキーを押すと必ず同じ値が読み込まれ、出力されます。
これらの1~5のキーに入っている内容同士をenterキーを押す毎にシャッフルさせたいです。
どのようにコードを書けば良いのでしょうか?

DrqYuto👍を押しています

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

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

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

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

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

maisumakun

2020/04/06 11:44

今あるコードはどのようなものですか?
退会済みユーザー

退会済みユーザー

2020/04/08 03:12 編集

すみません、本来はもっと長く、複雑な計算を行っていますが、switch文の中身さえシャッフルできたら良いので簡単な計算例で質問しておりました。
yuki23

2020/04/06 12:11

質問は編集できますので、ソースコードは質問文に書いてください
退会済みユーザー

退会済みユーザー

2020/04/06 12:17

すみません。 追記しました。
退会済みユーザー

退会済みユーザー

2020/04/06 12:22

すみません、修正致しました。
thkana

2020/04/06 12:52

> それぞれのセルから出力される値をランダムに1回入れ替えるようなコードにしたいです。 「セル」という言葉についてなんの説明もありませんが、それはなんですか? 1,2,3,4をランダムに選ぶということとは違うことをしたいのですか? どういう結果を得たいのかが私にはわからないのですが。
退会済みユーザー

退会済みユーザー

2020/04/06 12:56

言葉足らずですみません。 セルとは1,2,3,4のキーボードのキーのことを指しています。 現状のコードでは1のキーを押した場合、必ず同じ答えが出力されます。 しかし、私はenterキーを押すことで、case1~4に入っている4パターンの情報をシャッフルし、次に1のキーを押す際に異なる結果が出力されるようにしたいです。
yuki23

2020/04/06 13:14

「シャッフル」とは、abcdeの4パターンの値は全部ランダムに変わるということですか?それとも、パターン同士で入れ替えるということ?
退会済みユーザー

退会済みユーザー

2020/04/06 13:18

(a b c d )=(1,2,3,4),(4,2,5,7),(8,1,9,5),(9,2,3,1) この4グループのシャッフルを行いたいです。 個々の文字は入れ替える必要はないです。
退会済みユーザー

退会済みユーザー

2020/04/06 14:41

いえ、4つですよ。
jimbe

2020/04/07 03:28

5つになったようですけど... thkanaさんのリンク先は無くなっていますし, どういうことでしょう.
退会済みユーザー

退会済みユーザー

2020/04/07 03:33

すみません、何か良い案はないのでしょうか。
jimbe

2020/04/07 03:58

(リンク先を見ていませんので)何のお話だったのかが分からないというだけですので, お気になさらず... gmode='5' や '3' の時, 計算に使用されている y の値は switch 内で設定していませんが, switch内での計算式に switch 外の値を使用する必要があるということでしょうか.
fana

2020/04/07 04:09 編集

4つか5つかわからんけど,数種類のデータがあって,それを「シャッフル」する必要性が本当にあるんでしょうか? 単に,キーを押される毎に「どれか1つ」が選ばれれば良いという話ではなくて? > (a b c d )=(1,2,3,4),(4,2,5,7),(8,1,9,5),(9,2,3,1) を例にすれば,キーが押される毎に (1,2,3,4)あるいは(4,2,5,7)あるいは(8,1,9,5)あるいは(9,2,3,1) のいずれかのセットが選ばれればそれで事足りる,という話ですか?
guest

回答2

0

ベストアンサー

こちらの環境が windows/eclipse で c の処理系もテキトウなもので, 動作するか分かりませんが...(コマンドプロンプトで動かしました.)

何をシャッフルするかで2パターン作ってみました.
1 はポインタをシャッフルします.
2 はインデックスをシャッフルします.
結果は同じです.

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#include <conio.h> 5 6#define COLUMNS 4 7#define ROWS 4 8 9int values[ROWS][COLUMNS] = {{1,2,3,4},{4,2,5,7},{8,1,9,5},{9,2,3,1}}; 10 11void doProcess(int v[]) { 12 printf("%d,%d,%d,%d\n",v[0],v[1],v[2],v[3]); 13} 14 15void suffle1(int *pointers[]) { 16 srand((unsigned int)time(0)); 17 for(int i=ROWS-1; i>1; i--) { 18 int j = rand() % i; 19 int *p = pointers[i]; pointers[i] = pointers[j]; pointers[j] = p; 20 } 21} 22void pattern1() { 23 int *pointers[ROWS]; 24 for(int i=0; i<ROWS; i++) pointers[i] = values[i]; 25 26 printf("pattern 1\n"); 27 while(1) { 28 char c = getch(); 29 printf("(%02x)\n",c); 30 if(c == 0x1b) break; //ESC 31 if(c == 0x0d || c == 0x0a) { 32 printf("suffle.\n"); 33 suffle1(pointers); 34 } else if('1' <= c && c <= '4') { 35 int key = c - '1'; 36 doProcess(pointers[key]); 37 } 38 } 39} 40 41void suffle2(int array[]) { 42 srand((unsigned int)time(0)); 43 for(int i=ROWS-1; i>1; i--) { 44 int j = rand() % i; 45 int v = array[i]; array[i] = array[j]; array[j] = v; 46 } 47} 48void pattern2() { 49 int indexes[ROWS]; 50 for(int i=0; i<ROWS; i++) indexes[i] = i; 51 52 printf("pattern 2\n"); 53 while(1) { 54 char c = getch(); 55 printf("(%02x)\n",c); 56 if(c == 0x1b) break; //ESC 57 if(c == 0x0d || c == 0x0a) { 58 printf("suffle.\n"); 59 suffle2(indexes); 60 } else if('1' <= c && c <= '4') { 61 int key = c - '1'; 62 doProcess(values[indexes[key]]); 63 } 64 } 65} 66 67int main(int argc, char *argv[]) { 68 if(argc == 1) pattern1(); 69 else pattern2(); 70}

#追加
ざっくりと構造体化しました.
x,y の扱いがはっきりしていませんのでそこはテキトウです.

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4#include <conio.h> 5 6#define STIMULI_ROWS 5 7 8typedef struct { 9 double freqv1; 10 double freqv2; 11 double x; 12 double y; 13 double ampv1; 14 double ampv2; 15 double ampe1; 16 double ampe2; 17} STIMULI; 18 19STIMULI initValues[STIMULI_ROWS] = { 20 {1.5, 1.0, 1.0, 1.0, 0.655, 0, 0, 0}, 21 {2.5, 1.0, 1.0, 1.0, 1.275, 0, 0, 0}, 22 {1.3, 1.9, 5.33, 5.0, 0.301, 0, 0, 0}, 23 {1.3, 2.5, 3.33, 5.33, 0.393, 0, 0, 0}, 24 {1.9, 2.5, 4.0, 2.67, 0.327, 0, 0, 0}, 25}; 26 27void doProcess(STIMULI *v) { 28 printf("%4.3f %4.3f %4.3f %4.3f \n", v->ampv1, v->ampv2, v->ampe1, v->ampe2); 29} 30 31void initStimult(STIMULI v[]) { 32 for(int i=0; i<STIMULI_ROWS; i++) v[i] = initValues[i]; 33} 34void calcStimult(STIMULI v[] /*, double x, double y*/) { 35 for(int i=0; i<STIMULI_ROWS; i++) { 36 /*stimuli[i].x = x;*/ 37 /*stimuli[i].y = y;*/ 38 v[i].ampv2 = i < 2 ? 0 : (v[i].x * v[i].ampv1); 39 v[i].ampe2 = v[i].y * v[i].ampe1; 40 } 41} 42 43void suffleStimult(STIMULI stimuli[]) { 44 srand((unsigned int)time(0)); 45 for(int i=STIMULI_ROWS-1; i>1; i--) { 46 int j = rand() % i; 47 STIMULI v = stimuli[i]; stimuli[i] = stimuli[j]; stimuli[j] = v; 48 } 49} 50 51void pattern1() { 52 STIMULI v[STIMULI_ROWS]; 53 initStimult(v); 54 calcStimult(v/*,x,y*/); 55 56 printf("pattern 1\n"); 57 while(1) { 58 char c = getch(); 59 printf("(%02x)\n",c); 60 if(c == 0x1b) break; //ESC 61 if(c == 0x0d || c == 0x0a) { 62 calcStimult(v/*,x,y*/); //必要? 63 printf("suffle.\n"); 64 suffleStimult(v); 65 } else if('1' <= c && c <= ('0'+STIMULI_ROWS)) { 66 int key = c - '1'; 67 doProcess(&v[key]); 68 } 69 } 70} 71 72int main(int argc, char *argv[]) { 73 pattern1(); 74}

投稿2020/04/06 21:04

編集2020/04/07 04:42
jimbe

総合スコア13209

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

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

退会済みユーザー

退会済みユーザー

2020/04/07 03:06

返信ありがとうございます。 こちらのプログラムは、Linuxでも回りましたが、やはり実際のより複雑なコードだとうまくいきません。 コード全体を質問の方に載せたので、こちらのswitch文の5パターンをシャッフルできないでしょうか?
jimbe

2020/04/07 03:33

やることは同じということだったのでは. > うまくいきません とはどううまくいかなかったのでしょうか. 構造体にして...と書かれていたと思いましたが, どうなったのでしょう.
退会済みユーザー

退会済みユーザー

2020/04/08 03:11 編集

構造体に値を代入させているのですが、ここから質問文のコードのようにキーを押すことによって値が切り替わり、またシャッフル機能を追加する方法が分かりません。
jimbe

2020/04/07 04:02

> 上記のように構造体に値を代入させている コンパイル通りますか? x,y の値は固定値ではないのでしょうか.
jimbe

2020/04/07 12:02

データの意味を理解しようとご質問に追加されたコードを見ていたのですが, コンパイルエラーの他, 8チャンネルなのに配列要素数が 7 だったり, 計算するだけで終わっていたり, 使っていない変数, いきなりあるファイルのオープン等, 中途半端な個所が多過ぎです. キー入力によって何かをするという前に, キー入力が無い状態でも動作する「最小限のコード」に整理することを先に行われては如何でしょうか.
guest

0

C

1const double matrix[][4] = {{1,2,3,4},{4,2,5,7},{8,1,9,5},{9,2,3,1}}; 2const double* vec = matrix[rand()%(sizeof(matrix)/sizeof(matrix[0]))]; 3z = 4*vec[0]+3*vec[1]+2*vec[2]+1*vec[3];

的な何かをやりたいわけ?

投稿2020/04/06 14:02

majiponi

総合スコア1722

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問