忙しい現代人の腰&肩のお悩み対策!

次にあげるC言語のプログラムを2回分の点数を3次元配列tensuに格納するように書きかえるというやり方が全く分かりません。どう作成すればいいのでしょうか?

include<stdio.h>

int main(void)
{
int i,j;
int tensu1[4][3]={{91,63,78},{67,72,46},{89,34,53},{32,54,34}};
int tensu2[4][3]={{97,67,82},{73,43,46},{97,56,21},{85,46,35}};
int sum[4][3];

for(i=0;i<4;i++){
for(j=0;j<3;j++)
sum[i][j]=tensu1[i][j]+tensu2[i][j];
}

puts("1回目の点数");
for(i=0;i<4;i++){
for(j=0;j<3;j++)
printf("%4d",tensu1[i][j]);
putchar('\n');
}

puts("2回目の点数");
for(i=0;i<4;i++){
for(j=0;j<3;j++)
printf("%4d",tensu2[i][j]);
putchar('\n');
}

puts("合計点");
for(i=0;i<4;i++){
for(j=0;j<3;j++)
printf("%4d",sum[i][j]);
putchar('\n');
}

return 0;
}


実行結果⤵
1回目の点数
91 63 78
67 72 46
89 34 53
32 54 34
2回目の点数
97 67 82
73 43 46
97 56 21
85 46 35
合計点
188 130 160
149 115 92
186 90 74
117 100 69

質問者からの補足コメント

  • 授業で出された問題です。

      補足日時:2016/11/08 11:07

このQ&Aに関連する最新のQ&A

A 回答 (4件)

直接の回答ではありません。


zircon3さんが指摘された
>ちなみにプログラムソースはタブ付けをしっかりっしましょう。
>課題の問題文のプログラムソース自体が質問に書かれているようにタブ無しのベタで書かれていたのだとすると出題者の技量不足です。
>これではどこからどこまでが一つの関数で、どこからどこまでが1重目のforループで、どこからどこまでが2重目のforループなのか視覚的に理解しづらいです。つまり読み難いしミスもチェックしにくい。

の件については、質問者の責任ではありません。このサイトは、インデントされたプログラムを投稿しても連続した半角の空白を1つの空白にしてしまう為、インデント無で書かれたようになってしまいます。この現象を回避するには、
全角の空白でインデントしたプログラムを投稿する以外に方法はありません。(もちろん、それは、コンパイルエラーになりますが)
もし、全角の空白でインデントする以外方法で、きちんと、インデントされたプログラムを投稿できる方法をご存じの方がいれば、その方法を賜りたく、投稿した次第です。
    • good
    • 1

No.1です。



> 授業で出された問題です。

 だから何でしょう?
 それだけでは何もわかりません。
 お仕事ではなく学生さんだということだけです。
 勉強レベルであることはご質問に書かれているプログラムの程度を見ればわかることでもありますが。(^^;

 ちなみに、、、

> int tensu1[4][3]={{91,63,78},{67,72,46},{89,34,53},{32,54,34}};
> int tensu2[4][3]={{97,67,82},{73,43,46},{97,56,21},{85,46,35}};

を3次元配列にするだけなら

int tensu[2][4][3]={{{91,63,78},{67,72,46},{89,34,53},{32,54,34}},
{{97,67,82},{73,43,46},{97,56,21},{85,46,35}}};

とするだけのことでしょう。
4個の要素からなる配列の各要素がそれぞれ3個の要素からなるデータが2個あるのだから、その2個を配列にすればよいだけです。
その場合、これは「処理アルゴリズムの問題」ではなく単なる「データ表現の問題」です。プログラムとしてはtensu1とtensu2を順番に処理していたのがforループになるだけ(つまり合計3重ループになるだけ)です。
工夫点として「見出し行の出力処理」がある程度でしょう。

ちなみにプログラムソースはタブ付けをしっかりっしましょう。
課題の問題文のプログラムソース自体が質問に書かれているようにタブ無しのベタで書かれていたのだとすると出題者の技量不足です。
これではどこからどこまでが一つの関数で、どこからどこまでが1重目のforループで、どこからどこまでが2重目のforループなのか視覚的に理解しづらいです。つまり読み難いしミスもチェックしにくい。

参考まで。
    • good
    • 0

1氏が言うように、質問者殿はまず「問題を理解していない」。


だから、誰かに解いてくれと丸投げしたところで、問題文を表現することができてないから、説明することすらできていない。

いわゆる、「2次元の配列を3次元にするにはどうすればよいでしょうか(泣)」と言っているだけだから、誰にも答えられない。

もしかするといまのうちに他の職を考えたほうがいいのかもしれない。

がんばれ。
    • good
    • 0

ご質問に書かれているプログラムは質問者さんが作成されたものではなく出題されたものですか?


その場合、このプログラムは何のデータをどう加工しているプログラムなのか日本語で説明が有ったりプログラムコードの意味を解読されたりしていますか?
特にtensu1とtensu2という4行3列の配列の意味と、実行結果にある出力内容の意味です。
それ無しに「tensuという3次元配列を作って、、、」の処理手順の理解はあり得ないでしょう。

それが出来ればこのプログラムの処理手順を日本語で帰るはずですからそれをしましょう。フローチャートなどのチャート図でもよいです。
それが出来たらその内容を参考にして「tensuという3次元配列を作って、、、」の処理手順も日本語を使って同様に作成出来るかと思います。
ようは使用するプログラム言語に関係なく処理手順(実現方式、アルゴリズム)を日本語で書きましょうということです。
それ無しにプログラムの作成はあり得ません。
たとえそれがプログラム言語の授業での課題であったとしても。

参考まで。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語で3次元配列の課題をしています。

C言語で3次元配列の課題をしています。
5人の学生の3科目(国数英)の点数を前期と後期の2回分について三次元配列に入力し、各学生の前期と後期の合計と前・後期の合計を求めるプログラムです。
配列に数値を格納するあたりまでは分かったものの、そこから先がよくわからなくなってしまいました。どなたか解説とともに、成績の出力の仕方を教えていただけないでしょうか。for文を使えばいいというのはわかりますが・・・。
以下に出来た部分までのソースを載せておきます。まだ未熟な上、変なミスがあるかもしれません。

#include <stdio.h>
main()
{
/*配列を宣言*/
int score[0][3][5],i,j,k;
int total,sum[2][5];
/*配列に成績を入力*/
for(i=0;i<2;i++){
for(j=0;j<3;j++){
for(k=0;k<5;k++){
printf("score[%d][%d][%d] = ",i,j,k);
scanf("%d", &score[i][j][k]);
}
}
}
/*合計を計算する*/
for(i=0;i<5;i++){
for(j=0;j<2;j++){
total=0;
for(k=0;k<3;k++){
total = total + score[i][j][k];
}
sum[i][k]=total;
}
sum[2][k]=sum[0][k]+sum[1][k];
}
/*出力する*/
/*??*/

}

※三次元配列のscoreの始めの[]は、0が前期成績、1が後期成績を格納する部分です。

C言語で3次元配列の課題をしています。
5人の学生の3科目(国数英)の点数を前期と後期の2回分について三次元配列に入力し、各学生の前期と後期の合計と前・後期の合計を求めるプログラムです。
配列に数値を格納するあたりまでは分かったものの、そこから先がよくわからなくなってしまいました。どなたか解説とともに、成績の出力の仕方を教えていただけないでしょうか。for文を使えばいいというのはわかりますが・・・。
以下に出来た部分までのソースを載せておきます。まだ未熟な上、変なミスがあるかもし...続きを読む

Aベストアンサー

全部見たわけではありませんが、気が付いた点を幾つか
1.
int score[0][3][5],i,j,k;

int score[2][3][5],i,j,k;
では?
2.合計を計算する部分で、score配列の要素が[2][3][5]しかないのに、
for(i=0;i<5;i++){
for(j=0;j<2;j++){
total=0;
for(k=0;k<3;k++){
total = total + score[i][j][k];
となっている。
このままだと、iが4までループするため、score[4][1][2]をアクセスしてしまう。sum配列も同様に変な場所をアクセスしてしまいます。

QC++ 構造体の一括初期化 {0}

構造体変数に {0} を代入すると、CString は空文字、 intは0に一括で初期化されるようです。
なんでこんなことが出来るのでしょう?
{0}は何?
仕組みを教えて下さい!!

Aベストアンサー

> 一括初期化関数でも作るしかなさそうですね
static変数を初期化用に用意しておくのはいかが?
http://oshiete.goo.ne.jp/qa/2658268.htmlより
>静的記憶域期間をもつオブジェクトを明示的に初期化しない場合、
>次の規定に従う。
>a) そのオブジェクトの型がポインタ型の場合、空ポインタに初期化する。
>b) そのオブジェクトの型が算術型の場合、(正または符号なしの)0に初期化する。
>c) そのオブジェクトが集成体の場合、各メンバにa)~d)の規定を(再帰的に)
>適用し初期化する。
>d) そのオブジェクトが共用体の場合、最初の名前つきメンバにa)~d)の規定を
>(再帰的に)適用し初期化する。

なので、zero初期化されていることが、規格で保証されます。

typedef struct hoge_struct
{
 int a;
 int b;
} hoge_struct;

static hoge_struct initializer; //初期化用変数。値は変えない。

int main(void)
{
 hoge_struct hoge;
 hoge = initializer;
 return 0;
}
真っ白に何度も初期化したいなら、こんな感じでどうでしょう?
関数を用意して初期化すると、構造体のメンバが増えると関数も修正しないといけない
ですが、これだと関数を変更しなくてすむし。

> 一括初期化関数でも作るしかなさそうですね
static変数を初期化用に用意しておくのはいかが?
http://oshiete.goo.ne.jp/qa/2658268.htmlより
>静的記憶域期間をもつオブジェクトを明示的に初期化しない場合、
>次の規定に従う。
>a) そのオブジェクトの型がポインタ型の場合、空ポインタに初期化する。
>b) そのオブジェクトの型が算術型の場合、(正または符号なしの)0に初期化する。
>c) そのオブジェクトが集成体の場合、各メンバにa)~d)の規定を(再帰的に)
>適用し初期化する。
>d) そのオブジェクトが共用...続きを読む

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

Qint型配列の一括初期化

現在、ある配列をfor()でループさせて初期化させていますが、もっと高速に初期化できる方法はないでしょうか?

//配列の初期化
int Xi[256];

for(i = 0; i < 256; i++){
   Xi[i] = 0;
}

今後、配列数を増やす予定なので高速に初期化できるものはないか探しています。
速度重視でよろしくお願いします。

Aベストアンサー

全ての要素が0で初期化された配列を確保したいのであれば、calloc()を使うというのはどうでしょうか? 上記のコードより速いという保証はありませんが。

#include <stdlib.h>
int *Xi = (int *)calloc(256, sizeof(int));

配列が不要になった時点でfree(Xi)するのをお忘れなく。また、初期値が0以外の場合にはこの手は使えません。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qfloat型とdouble型の変数の違いを教えてほしいです

float型とdouble型の変数の違いを教えてほしいです
2Dゲームを作っててdoubleの変数を使ってたんですが使ってはだめだと先輩に言われたんです。
理由を聞いたら、先生が「doubleは使わないほうがいい」と言われたらしくてちゃんとした理由がわかりませんでした。
それを知って何をするということではないんですが、気になって調べても出てこなかったので質問させてください。
まだゲーム作りを始めたばっかりでぜんぜん詳しくないですが教えてくれたら助かります。

Aベストアンサー

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速にできたり、と様々です。
32bitCPUでは、32bitのfloatの方が扱いやすいでしょうが、64bitCPUでは64bitのdoubleの方が扱いやすいかもしれません。
Cのmath.hで使える標準関数はdouble型のものがほとんどです。三角関数は2Dのゲームでも使う機会が多いのではないでしょうか。sinもcosもdouble型です。内部演算は当然doubleですので、変数にfloatを使ったからと早くはならず、むしろfloat型の変数に入れるときに暗黙の型変換が発生する分遅くなる可能性もあります。

そういった背景を考え検討した結果、floatを使う方がよい、と判断したのならいいのですが、「先生に言われた」では理由になりません。
聞けるのなら、その先生に理由を聞いてください。真意がわからないうちは、鵜呑みしないことです。

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速...続きを読む

QC言語、行列の積を求めるプログラムについて

「次に示す行列x,yの積を求めるプログラムを作成せよ。
  x[2][3]={{1,2,3},{4,5,6}} y=[3][2]={{1,5},{5,3},{81}}」
という問題です。自分ではとりあえず、
#include<stdio.h>
int main(void)
{
int i,j;
int x[2][3]={{1,2,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int xy[3][3]={0};

for(i=0;i<3;i++)
for(j=0;j<3;j++)
xy[i][j]=x[i][j]*y[i][j];

for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%3d",xy[i][j]);
putchar('\n');
}
return 0;
}
というプログラムを作ってみましたが、ダメでした。
ちゃんと積の表示が出るようにするにはどこをどう変えるべきでしょうか?

Aベストアンサー

#include<stdio.h>
int main(void)
{
int x[2][3] = { { 1, 2, 3 }, { 4, 5, 6} };
int y[3][2] = { { 1, 5 }, { 5, 3 }, { 8, 1 } };
int xy[2][2];
int i, j, k;

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
xy[i][j] = 0;
for (k = 0; k < 3; k++) {
xy[i][j] += x[i][k] * y[k][j];
}
}
}

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
printf("%4d", xy[i][j]);
}
putchar('\n');
}
return 0;
}

#include<stdio.h>
int main(void)
{
int x[2][3] = { { 1, 2, 3 }, { 4, 5, 6} };
int y[3][2] = { { 1, 5 }, { 5, 3 }, { 8, 1 } };
int xy[2][2];
int i, j, k;

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
xy[i][j] = 0;
for (k = 0; k < 3; k++) {
xy[i][j] += x[i][k] * y[k][j];
}
}
}

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
printf("%4d", xy[...続きを読む

Qファイル出力で改行を入れたい!

data.txtにファイル出力を行うのですが、gets(c)で入力した一語一語に改行を入れてdata.txtに出力したいのですがどうすればよいでしょうか。
返答のほどよろしくお願いいたします。
include<stdio.h>
#define SIZE 20
void main(void)
{
char c[SIZE], *p;
FILE *fp;

fp = fopen("data.txt","w+");
p = c;
while(gets(c) != NULL){
fputs(p,fp);
}

fclose(fp);
printf("data.txtへ出力しました\n");

}

Aベストアンサー

一語一語ってのは、1回の入力毎って事でしょうか?
とするならば、これでどうでしょうか?

#include <stdio.h>
#define SIZE 20
void main(void)
{
  char c[SIZE], *p;
  FILE *fp;
  
  fp = fopen("data.txt","w+");
  p = c;
  while(gets(c) != NULL){
    fputs(p,fp);
    fputc('\n', fp);
  }
  
  fclose(fp);
  printf("data.txtへ出力しました\n");
  
}

Q文字列として"(ダブルコーテーション)を表示させる方法

こんにちは。文字列として、ダブルコーテーションを表示させるには、どうすればよいのか教えてください。m(__)m


例えば、
<font size="2">あいうえお</font>

というタグの「あいうえお」の部分が、セルA1にあった場合、

="<font size="2">"&A1&"</font>"という表示にしたいのです。

"2"のダブルコーテーションも文字列として表示させるには、どうすればよろしいのでしょうか。

教えてください。よろしくお願い致します。

Aベストアンサー

こんにちは~

表示形式は 「標準」 のままで、
ダブルコーテーションを、ダブルコーテーションで囲んでください。

""2""

="<font size=""2"">"&A1&"</font>"

としてみてください。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);


人気Q&Aランキング