• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ループを使った掛け算のプログラミング)

ループを使った掛け算のプログラミング

このQ&Aのポイント
  • 1から12までの掛け算の表を作るためのプログラムに関してアドバイスをお願いします。
  • forループを使用して行列を生成し、1から12までの掛け算を表示させたいです。
  • プログラムの疑似コードを記述し、上記の要件を満たす方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.4

意図自体は表現できているのではないでしょうか 他の方々も仰られてる通り、御自身で試されるのが一番簡単且つ手早いと思います。 スクリプト言語で書いた時の一例だけ貼っておきます Python3 https://ideone.com/gNrju Ruby https://ideone.com/UUQ2K

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • tekebon
  • ベストアンサー率62% (36/58)
回答No.3

「++」を使用されているのでC言語的な文法と仮定して回答します。 2重ループになっていますのでrowが1に対してcolが1~12まで変化します。 次にrowが2に対してcolが1~12まで変化します。以下rowが12に対して colが1~12まで変化します。 これに対して表示されていきますので掛け算の結果が表示されます。 しかし、「掛け算の票を作る」という観点でみるとDisplayの仕様によりますが 「1行分の表示を行う」という仕様では計算結果が縦に並んで表示されてしまい、 表にはなりません。 1x1=1 1x2=2 1x3=3 ... 12x10=120 12x11=132 12x12=144 「表示だけを行う」という仕様の場合では改行の指定がないため計算結果が 横に並んで表示されてしまい、表にはなりません。 また、表示したあと空白が含まれていないので下記のように表示がつながってしまいます。 1x1=11x2=21x3=3...12x10=12012x11=13212x12=144 また表形式にするのであれば数値の桁数も考慮しなければきれいな表にはならないでしょう。 したがって計算自体は想定通りと思いますが、表にはなりません。 どのように表示されるのか考慮が必要です。

lvndht
質問者

お礼

求めたい値を出せたのかばかり気にしていて、 表の表示については考えていませんでした。。 テキスト読み返し、不明点あればまた投稿致します。 ご指摘ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
noname#198951
noname#198951
回答No.2

どの部分が「わからなくなった」のでしょうか? フローチャートを書いてループのネストがちゃんとしてれば問題はないと思いますが。

lvndht
質問者

お礼

説明不足で、すみません。。 フローチャート書かずに頭の中で考えていたら煮詰まってしまいました。 フローチャート書くようにします。

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

実際にプログラムにして動かしてみたらどうです? 疑似コードの構文が実際の言語とかけはなれたものでなければ、特に間違いはないように思えますが。 > 上記のように表示されるのか、わからなくなってきてしまいました。 なぜ「わからなくなってきた」のか、その不安な点を明確にし、それが実際どうなっているかを言語のマニュアルなどで確認する、というのが上達のコツだと思います。

lvndht
質問者

お礼

説明不足で申し訳ありません。 掛け算で出た値に、1~12をかけてしまっているのでは?と思ってしまったのですが、テキストを再度読み返したところ、少しクリアになってきました。 >マニュアルなどで確認する、というのが上達のコツだと思います。 おっしゃる通りです。試行錯誤が必要ですね。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • EOFのエラーについて

    自分で考えてみたのですかどうもうまくいきません。 教えてください・ #include <stdio.h> int main () { int point[3][4]; int total[3]; int loop,loop1; for(loop1=0;loop1<3;loop1++) { for(loop=0;loop<4;loop++) { switch(loop1) { case 1:printf("A君\n");break; case 2:printf("B君\n");break; case 3:printf("C君\n");break; } printf("のゲーム%dの得点を入力してください\n",loop+1); printf("%d",&point[loop1][loop]); } } for(loop1=0;loop1<3;loop1++) { total[loop1]=0; for (loop=0;loop<4;loop++) { total[loop1]=total[loop1]+point[loop1][loop]; } printf("%4d",total[loop1]); } for (loop1=0;loop1<3;loop1++) { for(loop=0;loop<4;loop++) { printf("%4d",point[loop1][loop]); } printf("%4d",total[loop1]); } なんですがEOFのエラーと意味のわからない言葉でエラーがでるのですがいったいどうしたらいいんですか?

  • ファイルを利用してデータを入力する・・

    プログラミング初心者です。 本を使って学習しているんですが、書いてあるプログラムをやってみたんですが、上手くいきません。 「例外'System.NullReferenceException'がtest.exeで発生しました」とでます。 #include <stdio.h> int main() { int point[10][40]; int total[10]; int loop1,loop2; FILE *FP; /*ファイルを読み込み可能の状態にする*/ FP=fopen("test.txt","r"); /*ポイントの入力*/ for (loop2=0; loop2<10; loop2++) { for (loop1=0; loop1<40; loop1++) { printf ("背番号%2dの%d打席目のポイントを入力\n",loop2,loop1+1); fscanf (FP,"%d",&point[loop1][loop2]); } } /*ファイルの使用を終了する*/ fclose(FP); /*合計得点の計算*/ for (loop2=0; loop2<10; loop2++) { total[loop2]=0; { total[loop2]=total[loop2]+point[loop2][loop1]; } } /*結果の表示*/ printf ("ーーー結果ーーー\n"); for (loop1=0; loop1<40; loop1++) { for (loop2=0; loop2<10; loop2++) { printf ("%3d:",point[loop2][loop1]); } printf ("\n"); } printf ("---:---:---:---:---:---:---:---:---:---:---:\n"); for (loop2=0; loop2<10; loop2++) { printf ("%3d:",total[loop2]); } return 0; } という、テキストファイルからデータを入力するところなんですが、何処が違うのでしょうか? 教えてください、おねがいします。

  • forループに慣れるには

    初めまして。 今資格を取ろうと思い独学でJavaを勉強してるんですが、 つまらない部分でつまずいています。 それは少々複雑なfor等のループです。 変数を追っていくうちにこんがらがってしまい、 変数の正しい値を見失ってしまいます。 例えば… Loop: for(int i = 0; i<5; i++) { for(int j =0; j<5; j++) { if(i==j) continue Loop; System.out.println("i = " +i+ "j = " +j); if(i > 3) break Loop; } } や、 int i,j; for(i = 0, j = 0; i<3;) { if(i++ == 2 || j++ == 2) break; } System.out.println(i); System.out.println(j); の様なループです。 試験範囲は大方勉強出来てるんですが まぬけな事にループがイマイチ理解出来てなくて(恥) 皆さんはどうやって慣れてこられましたか? つまらない質問ですが何か良いコツやアドバイスがあれば よろしくお願いします。

  • セグメンテーションエラーがでます

    今、cでオセロゲームを作っています。 コンピュータと対戦できるようにしたいのですが、セグメンテーション違反になってしまいます。 p[LEN*LEN]を大域変数にするとうまく動きますが、以下のように局所変数にして関数で受け渡しをすると、 数回ループさせたところでエラーで強制終了します。 おそらく関数find_legal_moveへのp[]の渡し方が悪いのだと思いますが、なぜか分かりません。 以下にプログラムの一部を載せますので、お手数ですが原因を教えていただけないでしょうか。 よろしくお願いします。 #define LEN 10 /* ボードの1辺 */ #define opponent(player) (3-(player)) /* 1の相手は2, 2の相手は1 */ typedef struct {  int row; /* 行 */  int col; /* 列 */  int dr, dc; /* 行, 列の向き */ } Position; // 裏返る石の個数 int count_turn_over(int board[][LEN], int player, Position p) {  int i;  for (i=1; board[p.row+i*p.dr][p.col+i*p.dc]==opponent(player); i++);  if (board[p.row+i*p.dr][p.col+i*p.dc] == player)   return i - 1;  else   return 0; } // playerが(row, col)に石を置けるかどうかをチェック int is_legal_move(int board[][LEN], int player, Position p) {  if ((p.row < 1 || p.row > 8) || (p.col < 1 || p.col > 8))   return 0;  if (board[p.row][p.col] != 0) return 0;  for (p.dr = -1; p.dr <= 1; p.dr++)   for (p.dc = -1; p.dc <= 1; p.dc++)    if (count_turn_over(board, player, p) != 0)     return 1;  return 0; } // playerがどこに石を置けるか int find_legal_move(int board[][LEN], int player, Position p[]) {  Position pos;  int i = 0;  for (pos.row = 1; pos.row < LEN - 1; pos.row++)   for (pos.col = 1; pos.col < LEN - 1; pos.col++)    if (is_legal_move(board, player, pos) != 0) {     p[i].row = pos.row;     p[i].col = pos.col;     i++;    }  return i; } // computerの入力 void computer(int board[][LEN], int player, Position *pos) {  int i, num, max;  Position p[LEN * LEN];  printf("コンピュータの番です\n");  // 一番多く取れるところを取る  num = find_legal_move(board, player, p);  max = count_turn_over(board, player, p[0]);  pos->row = p[0].row;  pos->col = p[0].col;  for (i = 1; i < num; i++) {   int tmp = count_turn_over(board, player, p[i]);   if (max < tmp) {    pos->row = p[i].row;    pos->col = p[i].col;   }  } }

  • AVRによるマトリクスLED制御

    AVRによるマトリクスLED制御 この度大学でAVRによるマトリクスLED制御を行う事になったのですが、プログラム面で今行き詰っています. void PointDisplay(int* pointlist[8][8],int time)//指定した座標のLEDを点灯させる { PORTB=init_PORTB; PORTD=init_PORTD; for(int loop=0;loop<=time;loop++) { for(int k=0;k<=7;k++){ switch(k){ case 0: ROW1_on; break; case 1: ROW2_on; break; case 2: ROW3_on; break; case 3: ROW4_on; break; case 4: ROW5_on; break; case 5: ROW6_on; break; case 6: ROW7_on; break; case 7: ROW8_on; break; } for(int j=0;j<=7;j++){ if(pointlist[k][j]==1){ switch(j){ case 0: COL1_ready; break; case 1: COL2_ready; break; case 2: COL3_ready; break; case 3: COL4_ready; break; case 4: COL5_ready; break; case 5: COL6_ready; break; case 6: COL7_ready; break; case 7: COL8_ready; break; } } } PORTB=init_PORTB; PORTD=init_PORTD; } } } 以上が使用する関数で,実行内容としては2次配列pointlistを関数PointDisplayに渡し,time分だけループするという関数になります. マトリクスLEDは8×8のTOM-1588BHです.(データシートも添付しております 引用) 使用しているAVRはATmega168Pで,PORTD0~7をLEDの1~8pinにPORTB0~7をLEDの9~16pinに接続しています.(回路がわかりやすくなるように)そしてそれを#defineで定義しそれぞれをビット制御しています. 行き詰っている理由はintの配列を4つまで定義してコンパイル>実行すると思ったとおりにLEDに表示されるのですが,5つ以上定義してコンパイル>実行すると3,4つめの配列が乱れてしまいます.(ひとつ右にずれたりひとつ上にずれたり) 4つまでは正常に動作しているのでハード面は問題ないと考えて,ソフト面を見直しているのですが,なぜ悪いのかが理解できません.(オーバーフローとかそんなんですかね?) こういったマイコンを扱うプログラムは経験が少なく,データシートも英文なので困っています.どなたか詳しい方,知恵を貸していただけないでしょうか?お願い致します.

  • C言語の質問です。

    下記のコードでコンパイルすると成功しますが、実行時にエラーになります。 #include <stdio.h> int series(void); int main(void) { int i; for(i=0; i<10; i++) printf("%d ", series()); return 0; } /* これは正しくない */ int series(void) { int total; total = (total + 1423) % 1422; return total; } 解説には『ローカル変数の値はその関数が呼び出されている間だけ保持されます。 このプログラムはseries()関数を使ってある数列を作ろうとしていますが、 数列のそれぞれの数値を計算するのに1つ前の数値を使おうとしています。 しかし、変数totalの値はseries()の各関数呼び出しをまたがって保持される ことはないため、意図したとおりには動いてくれません。』とあります。 ローカル変数がその関数が呼び出されている間だけ保持されるのはわかりますが、 そのあとの解説の意味がわかりません。 どなたか詳しく解説していただけないでしょうか?お願いします!!

  • Cプログラミング

    #include <stdio.h> main(){ int i; int n; double data[100]; double total; double average; printf ("# of data ="); scanf ("%d" , &n); for (i = 0; i < n; i++){ printf("data[%d] = ", i+1); scanf("%lf" , &data[i]); } total = 0; for (i = 0; i < n; i++){ total = total +data[i]; } average = total / n; printf("total = %g\n", average); for (i = 0; i < n; i++){ printf("data[%d] : %6.1f %%\n" , i+1, (data[i] - average) / average * 100.0); } } 上のプログラムに対し、増加率の代わりに標準偏差を計算し出力するように改造せよ。という課題が出たのですが、標準偏差の計算の仕方が分かりません。教えてください。 よろしくお願いします。

  • C言語で3次元配列を使い一年分のカレンダーを作成

    カレンダーは完成したのですが曜日がズレてしまい綺麗に表示されません。どのように改善すれば良いのでしょうか?よろしくお願いします。 現状です #pragma warning(disable:4996) #include <stdio.h> #include <Windows.h> enum M_LIST { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC, N_MONTH }; enum W_LIST { SUN, MON, TUE, WED, THU, FRI, SAT, N_WEEK }; int mday[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //各月の日数 char *weekday[] = { "日","月","火","水","木","金","土" }; //各曜日 /*プロトタイプ宣言*/ int monthday(int year); void Array(int total, char box[N_MONTH][N_WEEK][N_WEEK]); void karenda(char box[N_MONTH][N_WEEK][N_WEEK]); /*メイン*/ void main(void) { int year, total; char box[N_MONTH][N_WEEK][N_WEEK] = { 0 }; //3次元配列を宣言し0を入れる /*画面制御の初期化*/ COORD coord; HANDLE hStdout; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); printf("西暦を入力"); scanf("%d", &year); //年度の入力 total = monthday(year); Array(total, box); karenda(box); } /*求める月の前月までの総日数*/ int monthday(int year) { int total = 0; /*求める年の前年までの総日数を求める*/ total = (((year - 1) * 365) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1); /*うるう年の判定*/ if (((year % 4) == 0 && (year % 100) != 0) || (year % 400) == 0) { mday[FEB] = 29; } else { mday[FEB] = 28; } return total % 7; } /*カレンダーの配列*/ void Array(int total, char box[N_MONTH][N_WEEK][N_WEEK]) { int month, row, col, day; col = total; for (month = JAN; month < N_MONTH; month++) { row = 1; day = 1; while (day <= mday[month]) { box[month][row][col] = day; if (col > SAT) { //土曜までいったら次の週 row++; col = SUN; } day++; col++; } } } /*カレンダーの出力*/ void karenda(char box[N_MONTH][N_WEEK][N_WEEK]) { int month, week, day; for (month = JAN; month < N_MONTH; month++) { //月の出力 printf("%3d\n", month + 1); for (week = SUN; week < N_WEEK; week++) { for (day = SUN; day < N_WEEK; day++) { if (week == 0) { //曜日の出力 printf("%s", weekday[day]); } if (box[month][week][day] == 0) { //0なら空白 printf(" "); } else { printf("%3d", box[month][week][day]); } } printf("\n"); } printf("\n"); } } 今はこのような形で表示されます(空白は_で表しています) 日____月____火____水____木____金____土 ________1___2___3___4___5 6___7___8___9__10__11__12 13_14__15__16__17__18__19 20_21__22__23__24__25__26 27_28__29__30__31

  • プログラムについて(C言語)

    #include<stdio.h> int main() { int i,n,total; for(;;){ /* 無限ループ*/ printf("整数n?"); /* nの値の表示 */ scanf("%d",&n); /* ifとbreakを使った終了判定 */ if(n<0)break; total=1; for(i=1;i<=n;i++){ printf("i=%d ",i); total*=i; /* total←total*i(階乗の計算) */ } printf("total=%d\n",total); /* totalの値(結果)の表示 */ } printf("Thanks\n"); /* 終了メッセージの表示 */ return(0); } これは階乗を求めるプログラムなのですが、i++ではなくi--をつかって求める場合 どのように変更すればよいでしょうか? for(i=1;i<=n;i++){ あたりをいろいろ弄ってみたのですが、求めてる結果は得られませんでした

  • 自作の行列クラスを継承するさいにエラーがでます

    現在、c++の学習で、自作の基底行列クラスMatrixを作成し、このクラスを継承して新たにlduMatrixを作成する事を考えています。 が、継承し、 lduMatrix a( 3, 3); a = 3; とすると、 main.C:13: warning: passing ‘double’ for argument 1 to ‘lduMatrix::lduMatrix(int)’ というエラーがでてコンパイルできずにいます。その一方で、 lduMatrix a(3,3, 3.14); とするとコンパイルはとおり、lduMatrix行列の各要素(a[1][1]など)の値をプリントさせると、[[3.14]]の値が入っていることを確認しております。 どこが間違っているのか御指導いただけると幸いです。 以下、クラスの中身です。よろしくおねがいします。 《Class: Matrix》 #include <iostream> class Matrix{ private: //! Size of row and column in Matrix int row_, col_; //! Row pointers double** m_; //! Allocate function for row-pointers void allocate(); public: Matrix(); //! Constructor with given matrix size Matrix( const int, const int ); //! Constructor with given matrix size and value fro all elements Matrix( const int, const int, const double ); //! Destructor ~Matrix(); ・・・省略・・・ double* operator[]( const int ); double* operator[]( const int ) const ; void operator=( const double ); }; /* Private functions *********************************************** */ void Matrix::allocate() { m_ = new double* [row_]; m_[0] = new double [row_*col_]; for ( int i=1; i<row_; i++ ){ m_[i] = m_[i-1] + col_; } } /* Destructor ****************************************************** */ Matrix::~Matrix(){ delete[] m_[0]; delete[] m_; } /* Constructors **************************************************** */ // NULL constructor Matrix::Matrix() : row_(0), col_(0), m_(NULL) {} // Constructor with given matrix size Matrix::Matrix( const int row, const int col ) : row_(row), col_(col) { allocate(); } // Constructor with given matrix size and value for all elements Matrix::Matrix( const int row, const int col, const double s ): row_(row), col_(col) { allocate(); double* m = m_[0]; for ( int i=0; i<row_*col_; i++ ){ m[i] = s; } } 《省略》 /* Member operators ************************************************ */ double* Matrix::operator[]( const int i ){ return m_[i]; } void Matrix::operator=( const double t ){ double* m = m_[0]; int nm = row_*col_; for ( int i=0; i<nm; i++ ) { m[i] = t; } } 《Class: lduMatrix》 class lduMatrix : public Matrix{ public: lduMatrix(); lduMatrix( const int ); lduMatrix( const int, const double ); }; lduMatrix::lduMatrix() {} lduMatrix::lduMatrix( const int mSize ) : Matrix( mSize, mSize, 0.0 ) {} lduMatrix::lduMatrix( const int mSize, const double s ) : Matrix( mSize, mSize, s ) {}

マウントとる人との関わり方
このQ&Aのポイント
  • マウントとる人との関わり方
  • マウントとる人とは、自分に自信がないからであり、まともな人間関係を築くことは難しい。
  • マウントとる人と関わる場合、自分自身が自信を持ち続けるか、誇りを持って戦うかの選択肢しかない。
回答を見る

専門家に質問してみよう