ページ 11

C言語を始めるにあたって

Posted: 2008年12月06日(土) 03:03
by CDC
C++について勉強しようと思っています。
はじめて書くにはどのようなことに挑戦した方がいいでしょうか?
いくつかあげていただけますと挑戦しがいがあります。
ゲームでなくても構いません。

コンパイラ:VS2005 C++
プログラム歴 1週間程度

一応HalloWorld程度は出せます。
if文とfor分も多分理解しています。

Re:C言語を始めるにあたって

Posted: 2008年12月06日(土) 09:01
by conio
「C++でプログラムを書く練習をするには、どのような事をすればいいか」
という質問で宜しいでしょうか。


①参考書などを読む
②学んだ事(if文、while文など)を利用するプログラムを考える
②考えたプログラムを実際に書き、動くか確かめる

大体こういう風にすれば、自然と書き方が分かってくると思います。
もし、「自分でプログラムが思いつかない」というのであれば、2つばかり問題を出してみます。


【1】1~100までの値を表示する。但し、3の倍数の時は"Fizz"、5の倍数の時は"Buzz"
3の倍数でも、5の倍数でもある時は"FizzBuzz"と表示させる。

------実行例------


Fizz

Buzz
Fizz
------------------(以下略)

【2】for文(2重ループ)とif文を用いて、下記の模様を表示すること。

□■□■□■
■□■□■□
□■□■□■
■□■□■□
□■□■□■
■□■□■□


とりあえずは、基本的な構文を使ってみたり、自作の関数を作ってみたり、基本的な事からしっかりと
固めていけばいいと思います。
ある程度慣れてきたら、クラスや例外処理、線形リスト、ソート等のアルゴリズムに挑戦すれば
いいと思います。(参考までにどうぞ)

Re:C言語を始めるにあたって

Posted: 2008年12月06日(土) 10:48
by 組木紙織
プログラムを習い始めたばかりでC++を理解するのはかなりしんどいです。

私が思うに、

1:C言語を一通り(プリプロセッサと関数ポインタ以外の部分)を覚えて扱えるようにする。(I/O関係は細かく覚えなくても良い)
2:データ構造(リンクリスト、ツリー構造、ハッシュ、etc)とアルゴリズム(バブルソート、挿入ソート、マージソート、クイックソート、etc)を実装できるようにする。
3:C++言語(文法)を覚える。
4:C++のライブラリを覚える
5:デザインパターンを覚える
6:C++のライブラリの一部を自分で実装してみる。
7:effective C++,more effective C++, effective stlを読破する。


とりあえずは4まですれば、C++を一通り読んで書くことは出来ると思います。



#実際の現場は知らないのですが、C++を使う職業プログラマーはこれを全部終わっているんじゃないかと勝手に思っています。

Re:C言語を始めるにあたって

Posted: 2008年12月06日(土) 22:26
by CDC
conio さん
1の解答
for(int i=1; i<101; i++){
if(i%15 == 0) printf("FizzBuzz\n");
else if(i%5 == 0) printf("Buzz\n");
else if(i%3 == 0) printf("Fizz\n");
else printf("%d\n",i);
}
2の解答
bool Array[5][5] = {
{0,1,0,1,0},
{1,0,1,0,1},
{0,1,0,1,0},
{1,0,1,0,1},
{0,1,0,1,0},
};
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if(Array[j] == 0) printf("□");
else if(Array[j] == 1) printf("■");
if(j == 4) printf("\n");
}
}

で一応はできました。
意図したとおりでしょうか?
御迷惑でなければ他に問題を出していただけますと助かります><

Re:C言語を始めるにあたって

Posted: 2008年12月06日(土) 22:27
by CDC
すいません。
ソースを規約の通りだしてませんでした><

Re:C言語を始めるにあたって

Posted: 2008年12月07日(日) 11:45
by conio
【2】はこんな感じでも良いかと。
---------------------------------------------------
#include <stdio.h> 
int main(void) 
{ 
	for(int i=0; i<5; i++){
	   for(int j=0; j<5; j++){ 
		   if((i + j) % 2 )printf("□");
		   else printf("■");
	   }
	   printf("\n");
	}
return(0);
} 
---------------------------------------------------

自分が参考書や基本情報技術者試験で、解いた問題の類似例です。参考にどうぞ。
強制でも何でもないので、暇な時に解いてみるといいかと。
あと、やはり参考書があれば参考書の例題を解いてみたり、参考書を見ずに参考書のプログラムを
書いてみると一番よく練習出来ると思います。


①for文を使って、配列の要素を入れ替えて表示する(配列の中身も入れ替わっていること)
【例】a[5] = {1,2,3,4,5}
【出力】a[5] = {5,4,3,2,1}

②for文を使って、二次元配列a[5][5]の縦と横の要素を入れ替える。
【例】
11111
10000
11111
00001
11111

【出力】
10111
10101
10101
10101
11101

③数当てゲームを作る。(ランダムに1~9の数字をxに代入。scanf関数で読み込み。)
外した場合、数が大きいか少ないかを表示し、再入力させる。
【例】3の場合
【出力例】
数を入力してください:6
大きいです!
数を入力してください:1
小さいです!
数を入力してください:3
正解です!

④10人の成績(0~50点)を入力し、入力を元に下記の様な表を作る。(範囲外の入力は再入力を促すこと)
【出力例】
    50点:★
40~49点:★★
30~39点:
20~29点:★★★★
10~19点:★★
 0~ 9点:★

⑤簡単なタイピングゲームを作る。入力された文字が合っていれば文字を消し、
全て消した時ゲームクリア!と表示させる。但し、\rを用いて改行させないようにする。
【出力例】
test
est
st
t
ゲームクリア!

⑥配列a[30]に適当な数字を入れておき、0以外の数字があるかを全て探索する。
但し、0以外の数字があった時は、見つけた順番通りに「0以外の数字"●"が●個ありました」と表示させること。
【例】
a[30]= {0,9,8,1,0,0,3,2,4,1,4,9,9,8,8,0,0,1,2,3,4,1,9,3,0,0,0,2,1,5};
【出力】
0以外の数字"9"が4個ありました
0以外の数字"8"が3個ありました
0以外の数字"1"が5個ありました
0以外の数字"3"が3個ありました
0以外の数字"2"が3個ありました
0以外の数字"4"が3個ありました
0以外の数字"5"が1個ありました

Re:C言語を始めるにあたって

Posted: 2008年12月07日(日) 12:08
by 御津凪
HTML+JavaScript -> Java -> C++ を独学していった私ですが、

いきなりプログラミング言語を覚えるのに C++ というのは、
確かにマスターするのに時間がかかるかと思います。

私が C++ を覚えたのは C++ の入門書からでした。
なので、入門書にある例題や問題を実際に書いて、
さらに自分の思い通りに動くかコードをちょっといじって確かめたり、
他のソフトのサンプル(ここならサンプルプログラミングの館)を見て、
どのように動いているのかコードを読んでみたりするといいでしょう。

現在覚えているところでは C 言語でも共通のところですので、
組木紙織さんの方法から覚えていってもいいと思いますよ。

conio さんの問題の解答ですが、(私から言うのもおかしいですが)
問2 が惜しいです。
問題では6x6サイズですが、5x5で出力されています。

ほぼ正解している、ということなので、別解を書いてみました。
{
    printf("1 の解答\n");
    bool b[2];
    for(int i=1;i<=100;++i){
        b[0] = (i%3 == 0);
        b[1] = (i%5 == 0);
        if(b[0]) printf("Fizz");
        if(b[1]) printf("Buzz");
        if(!b[0] && !b[1]) printf("%d",i);
        printf("\n");
    }
}
{
    printf("2 の解答\n");
    for(int y=0;y<6;++y){
        for(int x=0;x<6;++x){
            if((x+y)%2 == 0) printf("□");
            else printf("■");
        }
        printf("\n");
    }
}
> 御迷惑でなければ他に問題を出していただけますと助かります><

とのことなので、私からも問題を3つ。

【3】conio さんの問題【1】の条件追加問題です。
1行辺り5個の値を表示するようにする。ただし、整形した形で表示させること。
例)
       1        2     Fizz        4     Buzz
    Fizz        7        8     Fizz     Buzz
      11     Fizz       13       14 FizzBuzz
--------------------------------------------(以下略)
【4】conio さんの問題【1】の処理追加問題です。
数値の入力を求め、その数値の文字数の正方形の模様を表示する。
例)
2を入力した場合:
□■
■□

3を入力した場合:
□■□
■□■
□■□
【5】2つの値を求め、その2値のそれぞれ加減乗除(左右入れ替えてそれぞれ計算)した値を表示する。
このとき入力する値及び表示する値は浮動小数点として扱い、計算、表示すること。
また、0を入力した場合、エラーを表示し、再度入力を促すこと。
浮動小数点の値の型は double を使用すること。
例)
2 5.5 を入力した場合:
2.000000 + 5.500000 = 7.500000
2.000000 - 5.500000 = -3.500000
2.000000 * 5.500000 = 11.000000
2.000000 / 5.500000 = 0.363636
5.500000 + 2.000000 = 7.500000
5.500000 - 2.000000 = 3.500000
5.500000 * 2.000000 = 11.000000
5.500000 / 2.000000 = 2.750000
# ちょっと長くなってしまいました。