トップページ⇒tech
701コメント231KB

C++勉強しようと思うんだけど・・・

■ このスレッドは過去ログ倉庫に格納されています
0001初心者NGNG
C++勉強しようと思うんですが、どこのOSが一番
お勧めなのでしょうか?
初心者の自分ですが、皆様のお知恵をお借りしたいと
思いますので、よろしくお願い致します。<(_ _)>
0232デフォルトの名無しさんNGNG
なんでさ、初心者相手に先走ろうとするの?
OOPなんて構造化プログラミング知らない人間に教えても混乱するだけじゃない?
構造化プログラミングも十分理解してない人間にcoutだprintfだって言ったって
わからんよ。
それよりOOPのことは>>220のように�Eで始めて触れても遅くないと思う。

CとC++って勉強する上でシームレスに繋がってないのが大きな欠陥だよなぁ。
その点、PascalからObjectPascalを設計した人はエライと思うよ。
0233デフォルトの名無しさんNGNG
>>231
だってCじゃなくてC++をやりたいんでしょ?
煽りではないよ、目を向けて欲しいだけです
0234デフォルトの名無しさんNGNG
iostreamがなぜ生まれたのかから話すと長い。

なんでCは
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
}
ではじまるのか?
と同じだな。
話すと長い。

printfには型安全がない。
基本型の理解やポインタの理解、スタックの理解、書式の理解、標準出力の理解が必要だし、
誤った入力や書式指定を許してしまう。

coutの方が、理解に必要なハードルが少ない。

cout << なにか;

を覚えれば、画面(標準出力)になにかが表示される、と覚えれば済む。
0235デフォルトの名無しさんNGNG
oop楽しいじゃん
0236デフォルトの名無しさんNGNG
>>234

例?

char a = 'U';

printf("%d %d",a);

確かに幾度と無く危険な目に遭わされたw。
0237デフォルトの名無しさんNGNG
>>234
「<<」ってなんだ、ビットシフトじゃねーの?って聞かれたらまた面倒なんですけど。
cout.operator<<(なにか);
とでも書かせとくか?
0238デフォルトの名無しさんNGNG
>>237
頑張れば、

cout += "hello" += "world" += endl;

とか

cout != "hello" != "world" += endl;
0239デフォルトの名無しさんNGNG
ビットシフト演算子の説明をするときには
「<<は元々整数に対して使う演算子で、そいつのビットを、右や左にn個シフトしたいときに使うんだよ。
で、シフトって言うのはね...」

と説明すればよくて、混乱しそうになったら
「だけど、整数じゃないオブジェクトに << を使うときはね、 xx を流し込むって意味で
使うんだよ。最初に使った cin とか cout の << がそれだよ」
でわかるんじゃないかねえ。

中級になったら、「ostream系のオブジェクトの operator <<は...」って教えればいいだけ。

printf教えるときに、スタックの状態や、可変長引数の片繰上げや細かい書式、
va_argやva_listの説明なんかしないだろ。

そんなもんだよ。

練習用の曲はね、大抵ね、後から振り返ってみるといろいろ示唆すべきものが含まれているもんなの。
あるていどわかるようになってから、「ああ、あれはああいう意味があったんだ」ってわかればいい訳なの。

英語習うときもね、How do you do?みたいにね、よくあるイディオムから始めりゃあいいの。
0240デフォルトの名無しさんNGNG
あーもうそろそろまとめるぞ、この話。
基本は>>132、>>220の線で行く。クラス云々は�Eまでお預け。
但しC++らしく入出力はcin、coutを使うべし。
0241デフォルトの名無しさんNGNG
>>240
賛成++;
0242デフォルトの名無しさんNGNG
あーあ、1はスレを乗っ取られてしまったね
かわいそうに
0243デフォルトの名無しさんNGNG
>>1
気にせず問題が出来たら持っておいで。みんなでわいわい添削します。w
0244デフォルトの名無しさんNGNG
generative programmingマンセー!!!
Alexandrescuマンセー!!!
0245153NGNG
>>132 の (4 - 2 です。よろしくお願いします。
単純に ofstream output( "prime.txt" ); でOKなんですかね。

#include <iostream>
#include <fstream>
#define MAX 1000

using namespace std;

int main( void )
{
 int all[ MAX + 1 ] = { 0 };
 int half = MAX / 2;
 
 all[0] = 1;
 all[1] = 1;

 for ( int x = 2; x < half; ++x ) {
   if ( !all[ x ] ) {
     for ( int y = 2; x * y <= MAX; ++y ) {
       all[ x * y ] = 1;
     }
   }
 }
 ofstream output;
 output.open( "prime.txt", ios::out );
 for ( int j = 0; j <= MAX; ++j ) {
   if ( !all[ j ] ) {
     cout.width( 4 );
     cout << j;
     output << j << endl;
   }
 }
 output.close();
 return( 0 );
}
0246デフォルトの名無しさんNGNG
>if ( !all[ x ] ) {

今こういうの流行ってるの?

確かに0以外は偽だけどさ・・・使い方間違ってる気がする。
0247153NGNG
>>246
このスレで使っているのは全部僕の書き込みかと。
止めた方が良いですか。
0248デフォルトの名無しさんNGNG
>>247
いろいろなポリシーの人がいるから何とも言えないけど、個人的には非推奨。
0249デフォルトの名無しさんNGNG
>>247
明示的に「0なら」とやりたいなら、if(all[x] == 0)の方が見やすいしわかりやすい。
if ( !all[ x ] ) の方が確かにソースも数バイト短いし、実行ファイルも数命令短く
なるかもしれないけど、それによって得られるメリットよりも、見難いソースの
デメリットの方が多そう・・・。
あと int all[ MAX + 1 ] = { 0 }; じゃ all[0] 以外は初期化できてないんじゃない?
ちゃんとfor文で回そう!
0250デフォルトの名無しさんNGNG
>>249
ごめん。

>実行ファイルも数命令短くなるかもしれないけど

どっちも結局CMPじゃないの?
0251デフォルトの名無しさんNGNG
>>250
if ( !all[ x ] ) だとJZE?を使ってくるかもしれない。
すまん漏れ汗ンブラあまり知らんです。
0252デフォルトの名無しさんNGNG
>>249
そういう風に指定したとき、足りない要素は0として初期化される
ことが保証されてなかったっけ?
いや、もちろんコーディングスタイルとしてはやっちゃマズいだろうけどさ。
0253デフォルトの名無しさんNGNG
>>249-251
少なくとも、VCではどっちも同じ。
cmp 変数,0
jne
ってコードだった。
0254249NGNG
>>252
そうだったの?知らなかったスマソ。
でもやっぱり初期化したほうが精神的に落ち着くな・・・
0255デフォルトの名無しさんNGNG
念のため言っとくと、ある程度の規模のプログラムになると、実行時間の
9割は、ソースの1割で浪費される、と言われてる(8割2割って言う人もいる)。
ナントカの法則って名前ついてたかも知れないけど忘れた。
つまりソースの大部分は改良してもプログラムの高速化にほとんど貢献しない。
だからあまり細かい実装法( if(!all[x]) とか )にこだわっても、見にくくなる
ばかりでほとんど早くならない。
それよりは多少効率は悪くても、見やすい、美しいソースを書いて、完成してから
ボトルネックとなる1割の部分(再帰呼び出しされる関数や多重ループの一番内側)
だけに小細工をした方がなにかと良い。

ま、そういうことを頭の片隅に置いておくといいと思うよ。
それにソートプログラムを組めばわかるけど、高速化の真髄はアルゴリズムの改良
にあるってことも重要。
初心者のうちは「美しいソース」を書くようにした方がなにかといいです。
0256デフォルトの名無しさんNGNG
>>255
普通に9:1の法則でなかったっけ?

確か実行される頻度が高いホットスポットと呼ばれる部分がソース中に1割ある。
後の9割はたいして実行されない。

ホットスポットを最適化することがプログラムの高速化に繋がるって話だった気が。
0257デフォルトの名無しさんNGNG
>>249
配列の初期化(と言うより、値の準備)はループを回すべきだ、と。

bool型の変数を評価するときはどうするべきでしょう?
「if (hoge)」「if (hoge == true)」
今は前者を使っていますけど……。
(その割には「if (p == NULL)」と書いてたり)
0258デフォルトの名無しさんNGNG
== true はよくないイディオムだ。
0259257NGNG
思い出してみると「if (! hoge)」じゃなくて「if (hoge == false)」と書いていたような気が。
trueの時も「==」を使いますか。
0260デフォルトの名無しさんNGNG
==は、「等しい」比較の意味以外で使うべきではないだろう。

真偽値はそのまま使おうぜ。
0261257NGNG
>>258,>>260
はい。boolはそのまま入れることにします。
ありがとうございました。
0262デフォルトの名無しさんNGNG
agetokuka
0263デフォルトの名無しさんNGNG
>256
プログラミングでは80:20の法則で
プログラミング(コンピュータ)以外では
9:1の法則って良く聞くような。
「SFの9割は糞である」みたいに。
0264デフォルトの名無しさんNGNG
社会では全体の20%が残りの80%を養ってる、ってのもあるね。
0265デフォルトの名無しさんNGNG
さて、そろそろclassの話でもするかね?
0266デフォルトの名無しさんNGNG
>>265 まだです。課題�Eまで逝ってません。
0267デフォルトの名無しさんNGNG
早くclassに行こうよ、期待
0268デフォルトの名無しさんNGNG
なんだ、今日は休講かよ・・・
0269デフォルトの名無しさんNGNG
>>268
受講者がいないんじゃしょうがないよね。
しょうがないから、赤ペン先生たちで
例外について語り合っとく?
0270デフォルトの名無しさんNGNG
例外安全の理解が完了するまで例外投げるの禁止。
上級編までお預け。
0271デフォルトの名無しさんNGNG
( ´,_ゝ`)プッ 先生きどりかよ
0272デフォルトの名無しさんNGNG
シロウト相手に優越感に浸ってんじゃねえゾ、ゴルァ
0273153NGNG
こんばんは、よろしくお願いします。

>>132 の 5) バブルソート。
色気を出して関数にしてみました。

#include <iostream>
#include <time.h>
#define QTY 100

using namespace std;

void output( int array[], int qty, char mess[] )
{
 cout << mess << endl;
 for ( int i = 0; i < qty; ++i ) {
   cout << array[ i ] << endl;
 }
}

void bsort( int array[], int qty )
{
 int temp, i, n;
 for ( i = qty -1; i > 0; --i ) {
   for ( n = qty - 1; n > 0; --n ) {
     if ( array[ n ] < array[ n - 1 ] ) {
       swap( array[ n - 1 ], array[ n ] );
     }
   }
 }
}

int main( void )
{
 int list[ QTY ];
 srand( (unsigned)time( NULL ) );
 for ( int i = 0; i < QTY; ++i ) {
   list[ i ] = rand();
 }
 output( list, QTY, "ソート前" );
 bsort( list, QTY );
 output( list, QTY, "ソート後" );
 return( 0 );
}
0274デフォルトの名無しさんNGNG
>>273
個人的に配列の引数はポインタで受け取ってほしい。特にchar型は。
0275153NGNG
>>132 の 5) クイックソート、のつもりですが…
添削お願いします。

#include <iostream>
#include <time.h>
#define QTY 100

using namespace std;

void output( int array[], int qty, char mess[] )
{
  cout << mess << endl;
  for ( int i = 0; i < qty; ++i ) {
    cout << array[ i ] << endl;
  }
}

void qsort( int array[], int first, int last )
{
  int basis, small, big;

  basis = array[ ( first + last ) / 2 ];
  small = first;
  big = last;

  while ( small <= big ) {
    for ( ; array[ small ] < basis; ++small ) ;
    for ( ; array[ big ] > basis; --big ) ;
    if ( small <= big ) {
      swap( array[ small ], array[ big ] );
      ++small;
      --big;
    }
  }
  if ( small < last ) {
    qsort( array, first, small );
  }
  if ( big > first ) {
    qsort( array, big, last );
  }
}

int main( void )
{
  int list[ QTY ];
  srand( (unsigned)time( NULL ) );
  for ( int i = 0; i < QTY; ++i ) {
    list[ i ] = rand();
  }
  output( list, QTY, "ソート前" );
  qsort( list, 0, QTY );
  output( list, QTY, "ソート後" );
  return( 0 );
}
0276デフォルトの名無しさんNGNG
>>273
バブルソートってこうだっけ?
いや、基本路線は合ってるし、ソートもできるんだけど。
0277276NGNG
>>275
こっちも潜在的なバグが潜んでいる気が。
あとQTYって何の略?
0278デフォルトの名無しさんNGNG
気になる
0279デフォルトの名無しさんNGNG
QTY=quantity
0280153NGNG
せっかく休みに入ったのに天気悪くて鬱〜

皆さん、>>1さんじゃないのに添削していただいて有り難うございます。
どうも僕は、下手に短く書こうとして読み難くする悪癖アリですね。
気をつけます。

>>276
バブルソートを書き直してみました。どうでしょう?
>>273のだと、ソート済み部位も比較したりと無駄なループをしてますか。
使っていないtempとかありますし…駄目だ<自分

>>277でご指摘の >>174 クイックソートの方はよくわかりません。
クイックソート自体よくわかっていないのかも。

void bsort( int *array, int qty )
{
  int i, done;
  bool flg = true;
  --qty;
  done = 0;
  while ( flg ) {
    flg = false;
    for ( i = qty; i > done; --i ) {
      if ( array[ i ] < array[ i - 1 ] ) {
        swap( array[ i - 1 ], array[ i ] );
        flg = true;
      }
    }
    ++done;
  }
}
0281276NGNG
>>280
バブルソートはアルゴリズム的にはOK。
あと、前に変数に2つ以上の意味を持たせるなと
言われなかったかい?

クイックソートの方は
int list[QTY + 1];
list[QTY] = 0;
と修正すれば表面に出てくる。
あと、実際に実行してみたんだけど、ソートされているときもあれば
されてないときもあるみたい。こっちの原因はまだ調べてないけど。
>>274 で言われていることについては個人的には反対。

>>279 ありがと。
0282初心者NGNG
皆さん、こんにちは。
最近、電験の勉強に集中している為にc++の勉強が
はかどっていません。
�Eまで行くのにかなりの期間がいると思いますので
温かく見守って頂けませんでしょうか。<(_ _)> 
一日30分はc++をやるようにしてるのですが、
パソコンを立ち上げても参考書とにらめっこして
30分過ぎてしまうという状態なので・・・
0283デフォルトの名無しさんNGNG
クイックソートとバブルソートが完成したら、是非やってみて欲しいことが
あるんだが、定数QTYをある程度大きくして、何回か実行して実行時間を
比べてごらん。
たとえばQTY=10000,QTY=20000,QTY=40000とかで。
まぁこのくらいでも一瞬で終了するかも知れないから、適当にプログラム全体を
何回かループさせて、1回当たりの実行時間を計測してごらん。
で、バブルソートとクイックソートでは、それぞれQTYを倍にすると、実行時間が
何倍くらいになるか調べてみるとクイックソートの有り難さがわかるよ〜。
あと時間計測するときは画面へ描画はさせないこと。つまりoutput関数を呼び出さない。
画面描画させちゃうと、ほとんどのCPUパワーを描画に使いかねない。
0284デフォルトの名無しさんNGNG
>>282
パソコン起動せずに参考書読んでな。
それで良いよ。
読破したら、初めてパソコンの電源入れなさい。
0285デフォルトの名無しさんNGNG
優秀なC++使いは、だれもがそういう読むだけの時間を持っていたもんだよ。
今でも読むし、これからも読み続けるんだろうけど。
0286デフォルトの名無しさんNGNG
ageてたすまん。
0287デフォルトの名無しさんNGNG
ageteoku
0288153NGNG
こんばんは。>>275のクイックソート修正しました。
mainでの呼び出しが最高に間違っていました(鬱

void qsort( int *array, int first, int last )
{
 int basis, small, big;
 small = first;
 big = last;
 basis = array[ ( first + last ) / 2 ];

 while ( 1 ) {
  for ( ; array[ small ] < basis; ++small ) ;
  for ( ; array[ big ] > basis; --big ) ;
  if ( small >= big ) break;
  swap( array[ small ], array[ big ] );
  ++small;
  --big;
 }
 if ( small - 1 > first ) qsort( array, first, small - 1 );
 if ( big + 1 < last ) qsort( array, big + 1, last );
}

でmainでの呼び出しを下のように修正。
qsort( list, 0, QTY - 1 );

以上でたぶんOKだと思うのですが、いかがでしょうか?

ただ、上のwhile文を下のように書くと上手くソートできないのですが
僕には違いがわかりません。どうぞどなたか理由を教えてください。

while ( small < big ) {
 for ( ; array[ small ] < basis; ++small ) ;
 for ( ; array[ big ] > basis; --big ) ;
 if ( small < big ) {
  swap( array[ small ], array[ big ] );
  ++small;
  --big;
 }
}
0289デフォルトの名無しさんNGNG
そう言う使い方するならwhileの方が良いかも。
0290153NGNG
>>289
こういうことですか?
for ( ; array[ small ] < basis; ++small ) ;
↓
while ( array[ small ] < basis ) ++small;
0291153NGNG
それから、
>>274さん >配列の引数はポインタで受け取ってほしい。特にchar型は。
>>281(276)さん >>>274 で言われていることについては個人的には反対。

どちらでいけば良いのでしょうか?
0292デフォルトの名無しさんNGNG
>>291
Cは配列そのものを引数で渡すことができないので、すべて
ポインタ渡しだが、精神的に配列で取る人もいる。
自分の好みでいいのでは。
0293デフォルトの名無しさんNGNG
>>292
一瞬でスタックの空きが無くなるね。ちょっぴり再勉強。
0294153NGNG
おはようございます。ここ数日ずっとここの問題やってる気がします。

>>132 6) の >>220版やってみました。長いので別のところにうp。
みていただけて更にアドバイスなんかもいただけるとうれしいです。
http://perlnewbold.hoops.jp/cbasket.cpp

先々日買ってきた「憂鬱なプログラマ〜」を片手にやってみましたが
クラスとか初めて書いたのでカナ-リ行き当たりばったりで、
書き方も間違いだらけだと思います。

deleteとかもよくわかんないし…
0295初心者NGNG
ただ今電験二種の勉強で
理論・電力と一通りやり、あと少しで機械に突入します。
機械に入ると制御問題も出てくるので、よりいっそうc++の知識が
役に立つと思います。
0296276NGNG
>>288
#define QTY 10
list[ i ] = rand() % 100;
というように大きな問題は小さくしてからデバッグした方がよいよ。
うまくソートされなかったときの値を使って、
両方のプログラムの動きを追ってみるといいかと。
紙に書くなり、デバッガを使うなり、coutで途中の状態を表示するなりして。
頭の中だけでやろうとしても無理。

そこまでやっても、違いがわからなかったのなら、説明するよ。
0297276NGNG
>>291
void foo(int array[]) として、
関数内でarray++と書いてもはコンパイルエラーにはならない。
実際にはarrayは配列ではなくポインタ型の変数が正しい。
そのため、正確に表記しましょうというのが前者の考え方。

後者は、引数でアドレスが渡される場合、
配列の先頭アドレスである場合と変数のアドレスである場合とが
あるので、その違いを表記しましょうという考え方。
変数名やコメントで配列であることを表記したりもできるので、
それほどメリットはないです。

一概にはどちらの書き方がよいとはいえないので
>>292 でいわれているように好みでいいかと。
2通りの考え方があることを知って欲しかっただけです。
0298デフォルトの名無しさんNGNG
>>294
コードは見てねえけど、がんばれー。
読んで、試して、なんか変だと思ったら、また本を読む。
そのうち、何が巧くないやり方で、なにが巧いやり方なのかわかる
ようになるよ。

仕事と関係ないところで、ガシガシためしてね、
腕を磨きなさいよ。`
0299153NGNG
>>296
>>288の違い、わかった気がします。
交換される回数とその後のカウントばかりに気をとられていて、
その前のループによるカウント回数の違いに気づいていませんでした。

上手くいかない方は、最初の呼び出し時の交換後にsmallとbigが同値になると
再帰される範囲に同値の要素が含まれない為、上手くソートできない場合がある。

上手くいく方は、交換後にsmallとbigが同値でもbreak前のループを通るので
同値の要素が再帰される範囲に含まれ、OK。

これであってますか?
0300276NGNG
>>299
あってます。
arrayが 3, 4, 2, 5, 6 の場合を考えると楽です。> 他の方

>>294 については、出題者の意図とあっていないと思う。
たぶん、順次表示はいらなく、クラスには表示機能を持たせないと
考えていると思う。
0301153NGNG
>>300
こんな感じでしょうか?
getDataとgetTimeを追加してcon_outをなくしました。
http://perlnewbold.hoops.jp/cbasket2.cpp

実は線形リストというのがよく分からず、
検索をかけてそれっぽいものを参考にしたのですが
とりあえず方向としては間違ってなかったんですね。

一応>>132の6)までいったので、>>148に挑戦したいと思っています。
形になったらageっちゃたりしますので、よろしくお願いします。
0302276NGNG
>>301
方向は間違っていないです。
別の意味で方向は逆にした方がいいかもしないけど… ま、いいか。

>>220 より
> 但し、線形リスト全体をクラスメソッド"push"と"pop"を持ったクラスとして
わかっているかもしれないけど、暗に「スタック(stack)」と呼ばれるデータ構造を
実現するクラスを作るように言っています。
「スタック」と「逆順」には深い関係があります。
関連するキーワードは「待ち行列」「キュー(queue)」「FIFO」「LIFO」など

あと「メソッド」じゃなく「クラスメソッド」って書いてあるね。
オレも読み落としてたよ。
0303276NGNG
>>別の意味で方向は逆にした方がいいかもしないけど… ま、いいか。
やっぱりこれなしにしてくれ。
0304153NGNG
>>302-303 276さん。いつもどうもです。
スタック!全然気がついていませんでした。
popで最後の要素を返せば良かったんですね。
http://perlnewbold.hoops.jp/cbasket3.cpp

そういえばpopは最終要素の「取り出し」ですもんね。
0305153NGNG
おはようございます。
>>148 - 7)できましたヨ!どでしょ?
http://perlnewbold.hoops.jp/koch.cpp
http://perlnewbold.hoops.jp/koch.zip(実行ファイル / 17KB)

ウィンドウ作るのだけでメチャメチャ手間かかりました。
あと、曲線の終端がなかなか合ってくれないんです。
適当にいじってたら合った感じなのでソレでヨシとしてます。

ウィンドウできたら、凄いことやった気になれて楽しかったです(^-^
0306153NGNG
>>305
まぁウィンドウ作ったといっても、ほとんどコピペなんですが…
0307276NGNG
>>304
Tboxがクラスの外に出ては線形リストが外部から隠蔽されたことにはならない。
普通 popの戻りの型はpushの引数と同じ型にする。

while ( pointer->next != NULL ) {
  pointer = pointer->next;
}

これはなくてもいいように思うけど。まずいの?

>>305
これに関しては図はみたことあるけど、あまり知らない。
Windowsのプログラミングも少ししか知らないので、
他の方がみてくれた方がいいかも。
だからといってみない訳ではないですけど。
0308153NGNG
>>307
>Tboxがクラスの外に出ては線形リストが外部から隠蔽されたことにはならない。
Σ(゚д゚lll)ガーン

>普通 popの戻りの型はpushの引数と同じ型にする。
入れたものと同じ形で取り出すワケですね。

ってことは、intでtimeとdataの両方は返せないから、
入力回は素直にmain側で管理、ですか。

while ( pointer->next != NULL ) { 〜 は要らないですかね。
getDataとか付けてた時のままにしてました。
0309276NGNG
>>308
>> 普通 popの戻りの型はpushの引数と同じ型にする。
STLのstackをみてみたら、

・VC++6.0
value_type& top()
const value_type& top() const
void push(const value_type& _X)
void pop()

・g++(egcs-2.91.66)
reference top()
const_reference top() const
void push(const value_type& x)
void pop()

となっていた。今回作成したpopは
STLのstackのtopとpopを組み合わせたものにあたる。
C++とはずれるけどJavaのAPIは、

Object peek() // top相当
Object pop()
Object push(Object item)

となっていた。
普通というわけではありませんでした。スミマセン。
0310276NGNG
>>308
> while ( pointer->next != NULL ) { 〜 は要らないですかね。
> getDataとか付けてた時のままにしてました。

push()で pointer = newbox; としているから、
pointerは「最後にpushされたデータを保持するTboxを指す」といえる。
Tboxのpreは「1つ前にpushされたデータを保持するTBoxを指す」、
Tboxのnextは「1つ後にpushされたデータを保持するTBoxを指す」といえるので、
pointer->next != NULLという条件式は
「最後にpushされたデータの1つ後にpushされたデータを保持するTboxはあるか?」
という意味になる。
「最後の1つ後」は変なので、バグか?要らないのか?など考える。

という感じで、意味や役割をはっきりさせると流れを追わなくても、
おかしい場所がわかることがある。
今回はpointer->nextは必ずNULLにしているので、要らないことがわかる。
意味が変だけど、必要で正しいのなら、どういう処理をしているかを
コメントで入れてあげれば次に読むときに楽になる。

あとこの方法は、名前と意味があっていなかったり、
複数の意味を持っていたりするとやりにくくなる。
0311デフォルトの名無しさんNGNG
(´-`).。oO(age)
0312わからんNGNG
c++について教えてください。

int *i = new int;
RECT *rc = new RECT;
って事はやっていいのですか?
0313デフォルトの名無しさんNGNG
>>312
・・・つーか、なんでダメなわけ?
0314デフォルトの名無しさんNGNG
>>312
OKですが、何か?
0315276NGNG
>>305
形がいびつになる(ならない?)のは、
double→intへ変換されるときに切り捨て代入されるから。
横線では X だけなのに、斜め線では X と Y 両方。
そのため、段段短く…。
03161より初心者NGNG
>>131
書いてみました
いnt main (void)
{
int a;
int b;

for(b=1;b<=9;b++)
{
if(b<2)
{
cout << " " ;
}
else
{
cout << b <<" ";
}


for(a=1;a<=9;a++)
{
cout << a*b <<" " ;

if(a*b/10<1)
{
cout << " ";
}

}
cout << '\n';
}
return 0;
}

0317デフォルトの名無しさんNGNG
>>316
コンパイルエラーに
0318デフォルトの名無しさんNGNG
>>316
"いnt main" とはこれいかに。
0319デフォルトの名無しさんNGNG
九九の段だけなら2重ループだけで(省略)
0320デフォルトの名無しさんNGNG
結構前の話に対してだけど…
C++を目指してる初心者に教えるなら
いきなりcoutで教えるなぁ。
CとC++でかぶってる部分はC++で教えればいいと思う。
(mallocは教えない。newを教える。)
<<がビットシフトじゃないの?なんて初心者はまず聞かない
(って言うか知らない)し。
ソートとかコンテナの構造も、
stlすぐ使ってもらうから自分でコード
書かせたりしないな。ただ、概念だけは後でどっかで
勉強してもらう。
まずは動いて面白いと思ってもらいたいな、と。
新鮮味にかけるレスですまん。
0321デフォルトの名無しさんNGNG
>>320
STLのアルゴリズムをバンバン使って、基本概念を覚えないと、他言語に移った
時に障害になる。だから、まずSTLを使って、次にそれをSTLを使わないで書いた
らどうなるか学習していけばいいと思う。

俺自身はSTLは熟練のプログラマが、何度も同じようなソースを書かずに済ませ
る品書きのようなものだと考えている。

それから、cin、coutから入るのは賛成。printf、scanfがオブジェクト指向をサポー
トしてないから。

スレ違いになるが、この前仕事でJavaを触る機会があったのだが、あまりのレス
ポンスの悪さに閉口した。CPUの性能を1/5まで低下させてしまう。クロスコンパ
イラならぬクロスインタープリタだなと実感した。
0322デフォルトの名無しさんNGNG
それでもC++は滅びに方向へ
そしてJAVAが栄えていく
0323320NGNG
>>321
レスありがとう。基本概念を覚えないって言ってるんじゃないんだ。
はじめから基本概念のプログラムをやるより、
とりあえずSTL使って、すっきりしたホイッて動くもの見たほうが
今から覚える初心者がやりやすいんじゃないかと思って。
頭ごたごた使うのに慣れてない子も多いみたいだし。
運転手になるか、整備士になるかってあるけど、まずは簡単な
運転を学んでもらって、調子に乗っていただく(笑)

かなり大雑把な言い方すると、
「コンテナっていう奴にいろんなオブジェクトをまとめられるんだよ」
から入って、後で
「vectorは配列で、ランダムアクセスが速いよ。配列って言うのは…」
「listは双方向リストで、挿入が楽チン。双方向リストって言うのは…」
(俺が覚えた順序とは逆(^_^;STL知らなかったからね)
みたいに、大雑把から詳細へ行くほうがやりやすいんじゃないかと。

他言語をそんなに知らないんだけど(PerlとJavaを触ったくらいで。)
JavaだとそんなにSTLと違和感無く使えそうな感じがしたよ。
(詳細を見ないで、特徴からコンテナを選ぶ感じかな?)
Perlは以前の記憶なんで結構あいまい。
コンテナはハッシュでほとんどすませていた覚えも…。
# Perlのオブジェクト指向…面倒だよ…。

>俺自身はSTLは熟練のプログラマが、何度も同じようなソースを書かずに済ませ
>る品書きのようなものだと考えている。
俺は逆かも。例え詳細をきっちりプログラムできない人でも、
これを利用して、熟練プログラマの恩恵をこうむれるものだと思ってる。

Javaは速度問題が解決されたらすごく延びるのかもね<よく知らんけど…
あと、テンプレート早くくっつけるべし。
0324320NGNG
>>321
>だから、まずSTLを使って、次にそれをSTLを使わないで書いた
>らどうなるか学習していけばいいと思う。
あ、おんなじ考えだった。激しく同意。
323は早とちりして余計な事書いた。すまん。
0325153NGNG
非ネット環境な祖母様の家に行ってました。

>>309-310, >>315 276さん
色々とご指摘有り難うございます。
pushとpopしか付けないなら、言われているとおり不要でした。
あと、練習問題でもコメントは入れる癖をつけておくべき、ってことですね。

>>315 でご指摘の方は、DrawKochでキャストしておかないと斜めになったので
切り捨てがアヤシイかなとは思っていたんですが、回避策が思い浮かばず
一応形にはなったからヨシとシトコか、と。
0326153NGNG
あと、こちらの問題とは関係ないんですが、
コンマ区切りの文字列を分割するには、どうすればいいのでしょうか?
とりあえず自分で調べた範囲ではこんなに長くなりました。
Perlでの @array = split( /,/, $line ) みたいな単純な方法ありますか?

void main( void )
{
 string str, temp;
 int left, right;
 str = "hoge,moge,hage,giko,mona,fusa,zpnu";
 cout << str << endl;

 left = str.find_first_not_of( "," );
 while ( left != string::npos ) {
  right = str.find_first_of( ",", left );
  if ( right == string::npos ) {
   right = str.length();
  }
  temp = str.substr( left, right - left );
  cout << temp << endl;
  left = str.find_first_not_of( ",", right );
 }
}
0327デフォルトの名無しさんNGNG
stringstreamを使うともっとスマートになるはず。
0328デフォルトの名無しさんNGNG
>>326
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;

int main()
{
string str = "hoge,moge,hage,giko,mona,fusa,zpnu";
istringstream is(str);
char buf[128];
cout << str << endl;

while (is.getline(buf, 128, ','))
cout << buf << endl;
}
0329デフォルトの名無しさんNGNG
>>328
スマソ。#include <iomanip>は不要デス。
0330デフォルトの名無しさん NGNG
int main()
{
for (int i = 1; i <= 9; i++){
for (int j = 1; j <= 9; j++){
cout.width(3);
cout << i * j;
}
cout << endl;
}
return (0);
}
0331デフォルトの名無しさんNGNG
widthはループの前でいいんでないの?
■ このスレッドは過去ログ倉庫に格納されています