プロが教えるわが家の防犯対策術!

現在、二度目の挫折を経て再びC言語を学習しています。趣味としてやっています。
前回も教えてgoo様で質問させて頂いたのですが(https://oshiete.goo.ne.jp/qa/9256426.html)、今回も質問させて頂きたいと思い書いています。

「新・明解C言語入門編」で勉強しているのですが、どうしてもfor文多重ループが分かりません。
ネットでも検索してみたりはしたのですが、いまいち良く分かりません。
具体的に書くと、P100の演習4-20は答えを見て得心がいき解けるようになりました。演習4-21,演習4-22は解けました。
ですが、演習4-23,演習4-24,演習4-25が全く分かりません。「新・解きながら学ぶC言語」で答えを見てもどうしてそうなるのかが分かりません。
演習4-25のとあるfor文の条件式に、j <= 2 * (h - 1) + 1 と有りますが、条件式にこのような複雑(?)な式を打ち込むという発想が有りません。
答えを丸ごと自分で打ち込んでみましたが、やはり、何かしらの理解の取っ掛かりを得られる事が出来ませんでした。

ちなみに、この部分は前回つまづいた所でも有ります。今までの経験でつまづいた所で覚えているのが、多重ループ、再帰、ビット演算、ポインタです。
(ちなみに前回は同じテキストを利用して分からない所をスルーして先に進んで挫折しました。初回は「苦しんで覚えるC言語」を利用して有る程度先に進んで「ポインタ完全制覇」や「実践C言語」をやっている最中に挫折した覚えが有ります。)
前回、分からない所をスルーして先に進んで挫折した為、今回は分かるようにしてから進んだ方がいいか、と思い質問させて頂いています。

ちなみに、現在所持しているテキストは「新・明解C言語入門編」及び「新・解きながら学ぶC言語」のみです。(他の本は引越しのドタバタで紛失してしまいました、、、。

なので、現在分からない所を分かるようになる為、もしくは勉強の教本を変更する為、新しい本を買おうと思っています。
僕としては、 「やさしいC」と「12歳からはじめるゼロからのC言語ゲームプログラミング教室」がいいかな、と思っています。(Cを学んでその次にC#に進みUnityを使ってゲームを作ろうか、と考えている為です。ゲーム作りに興味が有る為です。

現在勉強している著者も、私が分からないポイント(第4章辺り)で挫折する人が多いと言っています。
僕はこの壁を突破したいと考えているのですが、何か良い本を教えて頂ければ、と思います。お願いします。

また、タイトルの「rubyに鞍替えするか」という点についてですが、「rubyは分かりやすい。C言語は教える学ぶに向いてない為、rubyでプログラミングを学習してからC言語に進んだ方が理解が早い。」という意見も聞いた為です。
ですが、前回の質問では「for文多重ループぐらいのはどこの言語でも出てくるからC言語を頑張れ。」というニュアンスの答えを頂いたのでどうしたものかと考えています。
自分としては、C言語を頑張りたいのが7で、rubyに鞍替えした方がいいのだろうかというのが3といった所です。
軽く検索した所、rubyにも再帰やビット演算などは有るみたいですし、少し迷いが有ります。
rubyをやってみた方が良いでしょうか?こちらも回答してくださると有り難いです。
個人的にはこのままC言語1本で行けたらなぁ、とは思います。

ちなみにまず母親に相談した所「ネットで聞いて。本屋に行くとしても次の水曜日ね。」と言われました。
実際に本屋で本の中身を見て買いたいという思いも有ります。(今まではAmazonで購入していました。

ご教授、何卒よろしくお願い致します。

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

  • うーん・・・

    書いた方が良いと指摘されたので書かせて頂きます。著作権侵害の意図は有りません。(削除対象にならないかどうか、です。

    演習4-23、演習4-24は長さの関係で省略させて頂きます。

    演習4-25は、読み込んだ整数の段数を持つ下向き数字ピラミッドを表示するプログラムを作れ、第i行目にはi % 10によって得られる数字を表示することという内容です。

    まず、初期化、条件式、更新の書き方が分かりません。問題を解こうとすると頭の中が真っ白になります(分からない為)。
    分からない所が分からないと言っても近からず遠からず、と言った所です。
    変数がi,jだったり短くて意味を持ってない単語だったりするのも混乱する所です。
    1段目に1、2段目には2、、、とやるにはどうしたら良いだろう、と考え込んだりします。
    感覚的に理解しているので理解していない部分を説明して、と言われても難しい部分が有ります。

      補足日時:2017/02/27 19:53
  • どう思う?

    明日(2/28)の午前中に再度母親に相談する事になっています。
    母親はプログラミングをやった事がないですが、「数学を勉強してパターン覚えるのは、出来ない無理ダメ。回り道。」というので(僕が数学超苦手なのを知っている為)、以前から気になっていた本をまとめて買って正攻法(?)でストレートに攻めたいと思っています。以下に記します。

    「C言語ポインタ完全制覇 著者:前橋 和弥」
    「C言語による最新アルゴリズム事典 著者:奥村 晴彦」
    「C実践プログラミング 第3版 Steve Oualline (著), 望月 康司 (監訳) (翻訳), 谷口 功 (翻訳)」
    「定本 Cプログラマのためのアルゴリズムとデータ構造 著者:近藤 嘉雪」

    です。
    おそらく、明日相談が終わった後辺り(若しくは翌日)に質問を締め切らせて頂く事になるだろう、と考えています。
    (短気で焦り気味ですいません。本当に申し訳ない。

      補足日時:2017/02/27 20:06
  • うーん・・・

    僕は発想力が身につくのであればかかる期間にも寄りますが、数学を勉強するのも有りだとは思っているのですが、、、。(ですが、親のいう事に有る程度耳を貸すタイプなのです。

    例えば、
    「生き抜くための中学数学: 中学数学の全範囲の基礎が完璧にわかる本 著者:芳沢光雄」
    と言った本も有るみたいですし。数学の教養が身につきそうでは有ります。ひいてはプログラミングに役に立ちそうだなぁ、とも思います。

    ただ、現実的な問題として、予算というものが有るので、なんでもかんでも買ってる訳には行かないのも現状です。
    すいません、、、。

      補足日時:2017/02/27 20:12

A 回答 (9件)

For多重ループなんて、どの言語にも出てきますし、C言語に拘る必要はないのでは?



何でもいいから、とりあえず1つの言語をある程度使えるようになったほうが、他の言語を習得しやすいです。

ビット演算や再帰は使えると高速化、コード量を減らせますが、代替えコードはありますし、個人趣味でのプログラムならマストなスキルではありません。

まずは簡単なスクリプト言語(VBScriptやjavascript)を学んだほうが良いと思います
    • good
    • 0
この回答へのお礼

ありがとうございます。
参考にさせて頂きます。

お礼日時:2017/02/27 10:31

この場合必要なのはC言語の理解ではなく、


命題を解くためのパターンを見つけ出してアルゴリズムに落とし込むための考え方でしょう。
ご提示の"演習4-25"の内容を知らないので、代わりに以下の命題で考えてみます。

命題: テキストでn段からなるピラミッドを描く

とりあえず n=5 と仮置きして、ピラミッドを構成する文字の個数を考えてみましょう。
今回はお絵かきなので、実際に書いてみると理解が早いです。
1段目: 4個の空白, 1個の文字 ____#
2段目: 3個の空白, 3個の文字 ___###
3段目: 2個の空白, 5個の文字 __#####
4段目: 1個の空白, 7個の文字 _#######
5段目: 0個の空白, 9個の文字 #########

どうやら個数は等差数列の式で計算できそうなので、以下のようにパターン化しましょう。
n段のピラミッド中でh段目の空白個数 = n - h
n段のピラミッド中でh段目の文字個数 = h + (h-1) = 2h - 1

パターンが見つかったで、アルゴリズムに落とし込みます。
h ← 1からnまで繰り返し {
_ n-h 回繰り返して、空白を表示
_ 2h-1 回繰り返して、文字を表示
_ 改行
}

ここまでくれば出来たも当然ですが、一応C言語で実装してみます。
for (h=1; h<=n; h++) {
_ for (j=1; j<=n-h; j++) { 空白を出力(); }
_ for (j=1; j<=2*h-1; j++) { 文字を出力(); }
_ 改行();
}

> 何か良い本を教えて頂ければ
パターンを見つけるには、ある程度の数学の教養が必要ですので、数学の教科書を読み返しましょう。
それに飽きたら数学パズルなどを解いてみましょう。
https://www.oreilly.co.jp/books/9784873116693/
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
すいません、詳しく問題を写して書くと削除対象という事でしたので書けませんでした。
丁寧に有難うございます。
後ほど、自分でも紙に書いてみようと思います。

数学の教科書、まだ取ってあったでしょうか、、、。(1回り以上前に高校卒業済みです、、、。
等差数列という言葉も初めて聞くため、確かに勉強したほうがいい分野かもしれません。
母親に教科書が残ってるかどうか聞いてみます。
オススメの本、ありがとうございます。
今回、オススメして頂いた本に加えて、アルゴリズムが重要という事ですので、以前から気になっていた「C言語による最新アルゴリズム事典」も購入候補とさせて頂きたいと思います。

お礼日時:2017/02/27 10:40

Cで続けろ、とまでは言っていないつもりでしたが



> 演習4-25のとあるfor文の条件式に、j <= 2 * (h - 1) + 1 と有りますが、条件式にこのような複雑(?)な式を打ち込むという発想が有りません。

当該書籍を持っていないので、どんな問題かわかりませんが、
同じ問題をRubyで解いたとしても、同じように「最大値が 2*(h-1)+1 になるようなループ」を書くことになるでしょう。

Rubyやっているうちに、わかるようになるかもしれませんが、必ずわかる、というものではありません。


プログラムにする前に、日本語で書く訓練をしてはどうでしょうか?


例えば、多重ループの例としてよくある
*
**
***
みたいなのは

1行目に * 1つ
2行目に * 2つ
...
i行目に * i個
...

 というのがあって、これから
「i行目に * i個」 を i=1から i<=nの間繰り返す
 がわかって
for( i=1; i<=n ; i++ ){
「i行目に * i個」
}
 と、ここまではただのforループです。

 ここで、外のforを消して
「i行目に * i個」
 だけ考えれば
「*を出力」を j=1からj<=i まで繰り返してから改行
  となって
for(j=1;j<=i;j++) {
printf("*") ;
}
printf("\n");
 になる、というのも、単純なforループですからわかりますよね?

 ここで、さっき消した外のforループを戻せば
for( i=1; i<=n ; i++ ){
 for(j=1;j<=i;j++) {
  printf("*") ;
 }
 printf("\n");
}
 と、二重ループになります。


できない問題も、上のように日本語で考えれば
「○○」を XXの間繰り返す
みたいな構造になっていて、その「○○」を分解すれば
「△△」をZZの間繰り返す
になっている、ということになるのでは。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
問題文を直接書くと削除対象となる、との事でしたので詳しく書けませんでした。
丁寧に有難うございます。
書いて頂いた文章を反芻して読んで、今後の学習に生かさせて頂こうと思います。
日本語で書く訓練、というのもしてみようと思います。

rubyの本ですと、プログラム全般に通じる話もある(知識を別の言語に置き換えて利用する事が出来る、らしいです。)という事で「プログラミング学習シリーズ Ruby 1 はじめてのプログラミング」という本が気になっています。


前回に引き続き、お世話になりました。有難うございます。

お礼日時:2017/02/27 10:53

>ですが、演習4-23,演習4-24,演習4-25が全く分かりません。


ここで回答するような人は入門書をもう持ってないでしょうから
この聞き方はまずいでしょうね。

面倒がらず、何がわからないか具体的に書いた方が
よいですよ。
    • good
    • 0
この回答へのお礼

回答有難うございます。

削除対象になるのを恐れて問題文を書きませんでした。
面倒臭がった訳ではないのですが、それではもう少し詳しく書いてみようと思います。
(補足機能で書けるでしょうか、、、。慣れてないので出来なかったらすいません。

というか、入門書ってマスターしたら捨ててしまうもんなんですか、、、。
なんか、目から鱗が落ちたような(誤用でしょうか。)気分です。
それでは、入門書で何が良いですか?とか、あなたはどういう入門書でどういう方法でマスターしたんですか?(気になっている部分です。今回質問はしていませんが。)という質問も余り意味を為さないかもしれませんね、、、。

重ねになりますが、ご指摘有難うございました。

お礼日時:2017/02/27 19:29

>入門書ってマスターしたら捨ててしまうもんなんですか、、、。


色々もってましたが石田本も含めて殆ど捨てましたね~。買ったのは
20~30年前だし(^-^;
K&Rの1EとANSI版だけリファレンスがわりにとってあります。
    • good
    • 0
この回答へのお礼

回答有難うございます。
おそらく私の父親母親と同年代の方とお見受け致しました。

そういうものなんだなぁ、という理解をしました。
見識を広めさせて頂き、有難うございます。

お礼日時:2017/02/27 20:14

>著作権侵害の意図は有りません。


出典を明確にすれば、一部を引用するのは著作権違反には
なりません。

>読み込んだ整数の段数を持つ下向き数字ピラミッドを表示する
>プログラムを作れ、第i行目にはi % 10によって得られる
>数字を表示することという内容です。

これだけだとかなり足りないですね。
出力はひょっとしてこんなかんじ?

入力=5

00000
1111
222
33
4
    • good
    • 0
この回答へのお礼

回答有難うございます。

>出典を明確にすれば、一部を引用するのは著作権違反には
なりません。
教えて頂き有難うございます。

すいません、問題文が本当にそれだけです。出力例は図で表示されているのですが、、、。

出力は概ねそれで合ってます。
ですが、その左側も表示されている点と、5まで表示されている点が違います。

入力数:3だと
11111
*222
**3
(*の部分はスペースです。)

となる様です。

ちなみに本文にも書いて有るのですが、新・解きながら学ぶC言語(副読本の様な物でしょうか)に解答が掲載されているのですが、どうしてそうなるのかが分からないと言った有様です。

出典:新・明解C言語入門編P101

ちなみに回答はこう、です。

#include <stdio.h>

int main(void)
{
int i,j;
int h;

puts("下向き数字ピラミッドを作ります。");
printf("何段ですか?:");
scanf("%d",&h);

for( i = 1;i <= h;i++){
for(j = 1;j <= i - 1;j++)
putchar(' ');
for(j = 1;j <= 2 * (h - i) + 1;j++)
putchar("%d", i % 10);
putchar('¥n');
}
return 0;
}

出典:新・解きながら学ぶC言語P99問題4-29

お礼日時:2017/02/27 20:35

>「C言語ポインタ完全制覇 著者:前橋 和弥」


>「C言語による最新アルゴリズム事典 著者:奥村 晴彦」
>「C実践プログラミング 第3版 Steve Oualline (著), 望月 康司 (監訳) (翻訳), 谷口 功 (翻訳)」

2番目はCというよりアルゴリズムの本ですね。
1、3番目は中級者向けでしょう。いきなりポインタに手を
出さない方が良いでしょう。

forの多重ループで頭が真っ白になってしまうレベルの超初心者が
読む本ではありませんね。

まず、ごくごく簡単な言語で、簡単な仕様のプログラムを
ポツポツ試してゆくしかないでしょう。

個人的にはpythonあたりをお勧めしたい。
    • good
    • 0
この回答へのお礼

回答有難うございます。
確かにおっしゃる通りの超初心者です。

アルゴリズムを勉強すれば、発想力が鍛えられるかなぁ、とか思ったのですが、、、。

tknakamuri様は(僕に対して)言語変更推奨派という事ですね。
その場合、rubyを考えていましたが、pythonも考慮に入れさせて頂きます。

重ねて回答有難うございます。

お礼日時:2017/02/27 20:42

>tknakamuri様は(僕に対して)言語変更推奨派という事ですね。



配列とか文字の連結とか内容なので、この範囲であれば
Cでもなんとか。

要はi行目で
(1) スペースを幾つ出力して、
(2) 数字を幾つ出力するか

をiとhを使って数式で表すことができれば、
後はそれをコードに直すだけです。

まずは、数学の問題として(1), (2)を解くことから
始めるべきでしょうね。ここはCとは関係ないです。

>アルゴリズムを勉強すれば、発想力が鍛えられるかなぁ

基本的なコーディングを行う力は、アルゴリズムの勉強とは
別もの。

アルゴリズムの勉強は先人の卓越したアイデアそのものを
学ぶことがメインです。
    • good
    • 0
この回答へのお礼

回答有難うございます。

という事は、現段階でアルゴリズムを勉強する必要は無い、という事ですね、、、。

更に、数学の問題として、という事はやはり数学の勉強をするべきなのか、とも思えます。

やはり数学の件も含めて、この投稿を見せる事も含めて(僕が口で説明するだけでは不十分に思えるので)、母親と明日相談してみようと思います。

数度に渡りご教授頂き有難うございました。

お礼日時:2017/02/27 21:35

>という事はやはり数学の勉強をするべきなのか、とも思えます。



一般的にはプログラミングに数学はあまり必要では
ありません。

ただ、この質問からだけで軽々に判断出来ませんが
今のあなたには、「算数レベル」で物事を分析的に捉える
基礎学力が不足しているのかもしれません。

私は教育者ではないので、これ以上は何とも言えない
ですね。あくまで私の感想です。
    • good
    • 0
この回答へのお礼

感想を述べて頂き有難うございます。

>一般的にはプログラミングに数学はあまり必要では
ありません。
では、今から数学を勉強する必要もあまり無いかもしれませんね。
ですが、tknakamuri様の言う通り、算数レベルで物事を分析的に捉える能力が不足しているのであれば、そこを補う必要が有るかもしれない、と理解しました。

一応、小学校、中学校、高校を経て専門学校を卒業した身ではあります。
算数までは得意でした。
ですが、中学から数学が苦手でしたので(お恥ずかしながら、高校では赤点ギリギリで赤点を取った事も有ります。)、その辺りが文章や演習問題に取り組む際に分析力の欠如という形で出ているのかもしれませんね、、、。

繰り返し対応頂き、感謝しています。
有難うございました。

お礼日時:2017/02/28 08:47

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