将来の就職と個人的興味のため、C++を勉強しようと思ったんですが(C++にはオブヘクト志向があるため)ネットでいろいろ調べていると「Cが基盤になっているためCから勉強を始めたほうがいい」とありました。
正確にはどこまでの知識と経験が必要ですか?
そもそもC++を学ぶためにCの知識は必須ですか?

A 回答 (7件)

まあ、Cの言語仕様を一通り軽くやっといた方が良いかも。


ポインター、配列、構造体、整数演算、型の表記の仕方とかは
結構癖があるから、事前に知っといた方が良いでしょう。

Cの言語仕様ってC++に比べて驚くほど小さいので
そんなに時間はかからないと思う。
最初からクラスも大変だし、最初はベターCから
始めるのも良いのでは。

しかし就職にC++が役立つかというと、確かに
c++使いまくりのシステムもあるが
Javaの方が圧倒的に有利というのは
覚えておいた方が良いでしょう。
    • good
    • 0
この回答へのお礼

なるほどJavaですか、頭に入れておきます
回答ありがとうございます

お礼日時:2017/07/14 23:48

今時、C言語は必要ないです


C言語は C++言語から(オブジェクト指向という考え方)を抜いた言語
今時なら、オブジェクト指向という考え方を、きちんと理解する事から
始めた方が、よっぽど良いです

C言語を勉強する事で、プログラミングにある種のクセ(個性)がつき
ます。 その後、C++言語を習うと、C言語時代のクセ(個性)のせいで、
オブジェクト指向と言う考え方ができない、ヘッタクソなプログラムを
書く事になるかもしれません。(C++言語はオブジェクト指向と言う概
念の無いC言語で書く事もできる為)

まず、C++言語を勉強して、必要ならば、あとから C言語を学ぶ方が
断然良いと思います。
    • good
    • 0
この回答へのお礼

あとからCをやったほうがいいんですね
回答ありがとうございます

お礼日時:2017/07/14 23:49

全く新規に始めるというのであれば, C++ の勉強のために C を学ぶというのはちょっと遠回りなんじゃないかなと思う. もちろん #2 の最後にあるように「将来的にはCも」というのであればどこかの時点で C にも手を出さないといけないんだけど, 近い目標として C++ があるのなら「C をやってから C++ に進みましょう」というのはあまりお勧めしない.



実際のところ, 「C++ を学ぶうちに C もある程度わかる」と言えなくもないし.
    • good
    • 0
この回答へのお礼

やっぱ二つは分けたほうがいいんですね
回答ありがとうございます

お礼日時:2017/07/14 23:46

Cが理解できていればC++を容易に理解できるのは事実でしょう。


ただしC++を理解するためにCの学習するのは無駄が多い。
C++を理解していてもCを使えるようになるのは困難。
    • good
    • 0
この回答へのお礼

やっぱCとC++は区別したほうがいいんですね
回答ありがとうございます。

お礼日時:2017/07/14 23:45

似た言語を同時に勉強するのは、一粒で二度美味しい話にも思えますが、


初心者にとっては、似通っている事が混乱の原因にもなる両刃の剣です。
従って、必須であるとは限りません。
    • good
    • 0
この回答へのお礼

なるほど
回答ありがとうございます

お礼日時:2017/07/14 23:44

C++を使って、どこまでのレベルのプログラムを作りたいかによります。


50m走を1回走るのに、フルマラソン完走できる体力が必要無いのと同じ。
プログラム言語を一応習得したと言えるレベルは、ジョギングで近所を
無理無く走れる程度。
仕事として使えるのは、競技会等で高記録を出したり、高順位で優勝・
入賞できるレベルが求められます。
そのレベルに到達して維持するのに、どこまでやれば良いという上限は
有りません。
目前の仕事をするに足る知識と経験が、今の自分に有るか無いかだけが
有ります。
将来的にはCもやらなくてはいけないなら、参考として勉強しておくのも
悪くは有りません。
    • good
    • 0
この回答へのお礼

わかりました
Cは逆にあとからやったほうがいいんですね
回答ありがとうございました

お礼日時:2017/07/14 23:42

どこまでって、どこまでも。


必須。
    • good
    • 1
この回答へのお礼

やはりそうなんですかね
回答ありがとうございます

お礼日時:2017/07/14 23:37

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

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

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

Qプログラムの改良

人の作ったプログラムを改良することになりました。
Visual C++ は初めてですが、CやC++は一通り勉強しています。

そこで、いろいろ調べているのですが、
例えば
「MFCは使わずに,Win32API SDKを用いた方法」
などという説明があります。

自分が対応しているプログラムが、そのどちらであるか、あるいはほかの方法で作られているか
というのはどうしたら分かるのでしょうか?

Aベストアンサー

No1です
私はC++は全然触ったこと無いので
あまり的確な回答は期待しないでくださいね

Q1.いいんじゃないでしょうか?
MSDNのOnPoint↓
https://msdn.microsoft.com/ja-jp/library/01c9aaty.aspx

OnPointクラス(Cwndクラス)
https://msdn.microsoft.com/ja-jp/library/1xb05f0h.aspx
このページの一番最初に
「Microsoft Foundation Class ライブラリにあるすべてのウィンドウ クラスの基本機能が用意されています。」と書いてありますから
そういうことですね

Q2.なんでもいいと思いますけど
そもそもあなたが対応するプログラムが
きちんとWin32のみで、もしくはMFCのみで書かれているとは限らないですからね
適当に作られて、両方が混在している可能性だってありますし

Q3.そこからですか
そこは調べればすぐ出てくるかと思いますが
MFCというのはWin32をラッピングしたものです

Q4.作った本人に聞く
仕様書とかがあるならそれを見る

No1です
私はC++は全然触ったこと無いので
あまり的確な回答は期待しないでくださいね

Q1.いいんじゃないでしょうか?
MSDNのOnPoint↓
https://msdn.microsoft.com/ja-jp/library/01c9aaty.aspx

OnPointクラス(Cwndクラス)
https://msdn.microsoft.com/ja-jp/library/1xb05f0h.aspx
このページの一番最初に
「Microsoft Foundation Class ライブラリにあるすべてのウィンドウ クラスの基本機能が用意されています。」と書いてありますから
そういうことですね

Q2.なんでもいいと思いますけど
そもそもあなたが...続きを読む

Qc言語での文字列の渡し方

ある関数内で、作成した、文字列をmainプログラムでうけとるにはどのようにすればよいのでしょうか。
普通の変数の場合は解説書に例はありますが、配列の場合の例は見つかりませんでした。
以下は例です。gccを使っています。

int main(){
char str[20]; // sub内で加工した文字列を受け取る配列
...
sub( str );
....
}
void sub( char *ch ){
....
ch="ABCD"; // この値をmainプログラム内でつかいたい
....
}

Aベストアンサー

No2のかたが言われているように、strcpyを使用して、文字列を設定します。
厳密に言えば、strcpyの他にも方法はありますが、現時点では、strcpyと覚えておけばよいでしょう。
但し、strcpyを使用する場合、一点、必ず、守らなければいけないことがあります。
それは、呼び出し元のサイズ(今回は20バイト)を超えるサイズを設定してはいけないということです。
もし、strcpy(ch,"ABCDEFGHIJKLMNOPQRSTUVZWYZ");
を行うと、コンパイルは正常に終了しますが、呼び出し側で確保した20バイトを突き破りメモリの設定を行います。
その結果、異常終了します。(場合によっては、異常終了せずに、正常のようにみえることもあります)
----------------------------------------------------
#include<stdio.h>
#include<string.h>
void sub( char *ch ); //プロトタイプ宣言
int main(){
char str[20]; // sub内で加工した文字列を受け取る配列
sub( str );
printf("%s",str); //受け取った結果を印字
}
void sub( char *ch ){
strcpy(ch,"ABCD"); // この値をmainプログラム内でつかいたい
}
-----------------------------------------------------
実行結果
ABCD

No2のかたが言われているように、strcpyを使用して、文字列を設定します。
厳密に言えば、strcpyの他にも方法はありますが、現時点では、strcpyと覚えておけばよいでしょう。
但し、strcpyを使用する場合、一点、必ず、守らなければいけないことがあります。
それは、呼び出し元のサイズ(今回は20バイト)を超えるサイズを設定してはいけないということです。
もし、strcpy(ch,"ABCDEFGHIJKLMNOPQRSTUVZWYZ");
を行うと、コンパイルは正常に終了しますが、呼び出し側で確保した20バイトを突き破りメモリの設定を...続きを読む

QプログラミングC言語

急募



行列の計算(xとyとx*y)を表示するプログラムを作成したのですが、デバックなしで実行はできたがプログラムが、表示されません。
どなたか、プログラムの間違えているところ、間違えているところの正しい答えを教えていただけないでしょうか


#include<stdio.h>

int main(void)

{
int i,j,k;

int x[2][3]={{3,0,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int z[2][2]={0};

for(i=0; i<3; i++){
for(j=0; j=2; j++){
for(k=0; k<2; k++)

z[i][j]+=x[i][k]*y[k][j];
}
}

printf("行列X=\n");

for(i=0; i<2; i++){
for(j=0; j<3; j++)
printf("%3d",x[i][j]);
putchar('\n');

}

printf("行列Y=\n");

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


printf("\nx*y=\n");

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



return 0;
}

急募



行列の計算(xとyとx*y)を表示するプログラムを作成したのですが、デバックなしで実行はできたがプログラムが、表示されません。
どなたか、プログラムの間違えているところ、間違えているところの正しい答えを教えていただけないでしょうか


#include<stdio.h>

int main(void)

{
int i,j,k;

int x[2][3]={{3,0,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int z[2][2]={0};

for(i=0; i<3; i++){
for(j=0; j=2; j++){
for(k=0; k<2; k++)

z[i][j]+=x[i][k]...続きを読む

Aベストアンサー

とりあえず、1っ箇所修正しました。
//修正・・・とコメントを入れておきます。

#include<stdio.h>

int main(void)

{
int i,j,k;

int x[2][3]={{3,0,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int z[2][2]={0};

for(i=0; i<3; i++){
for(j=0; j<2; j++){ //修正
for(k=0; k<2; k++)

z[i][j]+=x[i][k]*y[k][j];
}
}

printf("行列X=\n");

for(i=0; i<2; i++){
for(j=0; j<3; j++)
printf("%3d",x[i][j]);
putchar('\n');

}

printf("行列Y=\n");

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


printf("\nx*y=\n");

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



return 0;
}

とりあえず、1っ箇所修正しました。
//修正・・・とコメントを入れておきます。

#include<stdio.h>

int main(void)

{
int i,j,k;

int x[2][3]={{3,0,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int z[2][2]={0};

for(i=0; i<3; i++){
for(j=0; j<2; j++){ //修正
for(k=0; k<2; k++)

z[i][j]+=x[i][k]*y[k][j];
}
}

printf("行列X=\n");

for(i=0; i<2; i++){
for(j=0; j<3; j++)
printf("%3d",x[i][j]);
putchar('\n');

}

printf("行列Y=\n");

for(i=0; i<3; i++){
for(j=0; j<2; j+...続きを読む

Qfor文の部分を日本語で教えてください

for文の部分を日本語で教えてください

Aベストアンサー

> これだと2が素数として表示されなくないですか?

数 i が素数なのか判定する数 j は、1 より大きく自分自身より小さい数の全てです
→ i = 2 の場合、数 j は 1 より大きく 2 より小さい数の全て
→ つまり自然数の j は存在しません

数 i の約数に、数 j が含まれていたら、それは素数ではありません
→ i = 2 の場合、自然数 j が存在しないので、含まれているわけがない
→ ゆえに 2 は素数です

QCのプログラムに無性にイライラするのはおかしいですか?

CQ出版のインタフェース 2017-5 の記事のプログラム例に
for( i=0; i<256; i++){
 for( y =0; y < Y; y++ ){
  for( x = 0; x < X; x++){
   p[0] = img -> imageData[img->widthStep* y + x*3 ]; //B(青色)
   if(p[0]==i){hn[i]++;}
  }
 }
}
がありました。このリストを見て、無性にイライラするのは私だけでしょうか?

なぜ、i,y,x の3重のループで処理しないといけないのか、y,xの2重ループで十分ではないかと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++){
  p[0] = img -> imageData[img->widthStep* y + x*3 ];  //B(青色)
  hn[ p[0] ]++;
 }
}

3重にするならせめて、y,x,i の順にしてp[0]への代入は1回で済ませればと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++){
  p[0] = img -> imageData[img->widthStep* y + x*3 ];  //B(青色)
  for( i=0; i<256; i++){
     if(p[0]==i){hn[i]++;}
  }
 }
}

最近のコンパイラの最適化では、私の書いたようなコーディング(修正?)は無意味なのでしょうか?

CQ出版のインタフェース 2017-5 の記事のプログラム例に
for( i=0; i<256; i++){
 for( y =0; y < Y; y++ ){
  for( x = 0; x < X; x++){
   p[0] = img -> imageData[img->widthStep* y + x*3 ]; //B(青色)
   if(p[0]==i){hn[i]++;}
  }
 }
}
がありました。このリストを見て、無性にイライラするのは私だけでしょうか?

なぜ、i,y,x の3重のループで処理しないといけないのか、y,xの2重ループで十分ではないかと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++)...続きを読む

Aベストアンサー

利点を考えてみました


これを並列処理したときに
スレッド0: hn[0] に p[0] = 0 をカウント
スレッド1: hn[1] に p[0] = 1 をカウント
...
とすれば、
・img -> imageData は読み出すだけなので衝突しない
・hn[i] でアクセスする領域は、スレッド毎に i が違うので、同じ箇所に書き込まれることはない。
となり、排他処理が不要となります。
(もちろん、x,y,i,p[0]はスレッドでローカルな変数とします)

ただ、並列処理のオーバーヘッドや同時並列処理数等を考えると、こんな並列処理はしない方が効率的です。


あるいは、hn[]がシークに時間がかかる領域の場合、
hn[p[0]) で毎回違う位置を探しに行って、その時間が無視できないほどだったら、
先にhnを決めてしまった方が速くなるでしょう。

こちらも、非現実的です。

QC言語 a * b / c の計算

特に困っているわけではないのですが、エレガントな方法が見つからないので質問します。

a,c は32ビット、bは8ビット、0<a≦c、0<b がわかっているとします。
このとき、8ビットの整数計算値 a * b / c を「最大32ビットの範囲」で計算する方法、教えてください。
一応C言語で考えていますので、以下の***の部分の具体的な計算方法がわかればうれしいです。

int a,c; // 32bit 符号付き整数
signed char b,d; // 8bit 符号付き整数
if(a<2^(32-8)) d = a * b /c;
else **** ← この部分のプログラム

Aベストアンサー

決してエレガントではありませんが、a, cは正でありしかし符号付の型だという前提で a * b / c の整数の商を求めるのであれば、最初にa - cを求めて一時変数に代入しておき、bの数だけループし、ループ中に一時変数にaを加え、それがc以上になったらdを1加えて一時変数からcを引き去ることを繰り返せば、間違いなくすべての数値は32ビット以内に収まると思います。CPUにALUしかない時代の発想で、歳がばれますね・・・

Qこの答えって4じゃないんですか?

この答えって4じゃないんですか?

Aベストアンサー

i を 1から5まで変化させてくりかえす。

i ÷ 2 の余りが 0のとき、sum に i を足す。

なので、
i = 2,
i = 4
のときに加算されるから、6

QC++のエラー

c++で練習に長方形の長さを読み取り、其の周の長さと面積を求めるプログラムを書きましたが、動きません。以下に、コードを記述します。なお、使用コンパイラはborland c++です。
#include <iostream>
using namespace std;
int main(void){
int a,b;
std::cin >> a >> b;
std::cout >> a*b >> endl;
std::cout >> a+b >> endl;
return 0;
}

Aベストアンサー

誤: cout >> 値 >> endl;
正: cout << 値 << endl

QC言語について(三角形の面積・double型)

現在C言語を勉強中のものです。
以下のプログラムを実行すると、面積の計算結果が0になってしまいます。
doubleを全てintに、%fを全て%dにするとうまく動くのは確認したのですが、
自分が作りたいのは、引数をdoubleにし、実行結果も小数点込みで計算するものです。

以下のプログラムの問題点とその理由、またどのように書き換えることでうまく動くのかを教えていただけたらと思います。
よろしくお願いいたします。

~~以下コード~~
#include <stdio.h>

double tri(double,double);

int main(){
   double takasa,teihen;
   double menseki;
   printf("takasa=");
   scanf("%f",&takasa);
   printf("teihen=");
   scanf("%f",&teihen);
   menseki = tri(takasa,teihen);
   printf("menseki = %f",menseki);
}

double tri(double n1,double n2){
   return n1*n2/2;
}

~~以下実行結果~~
takasa=3
teihen=4
menseki = 0.000000

現在C言語を勉強中のものです。
以下のプログラムを実行すると、面積の計算結果が0になってしまいます。
doubleを全てintに、%fを全て%dにするとうまく動くのは確認したのですが、
自分が作りたいのは、引数をdoubleにし、実行結果も小数点込みで計算するものです。

以下のプログラムの問題点とその理由、またどのように書き換えることでうまく動くのかを教えていただけたらと思います。
よろしくお願いいたします。

~~以下コード~~
#include <stdio.h>

double tri(double,double);

int mai...続きを読む

Aベストアンサー

doubleのフォーマット指定子は%fではなく%lfです
とりあえずそこを変えてみて実行してみてください

QC言語で、べき乗の計算をするプログラムについてです

X^8の計算を、掛け算を使わずに、足し算と引き算を使って計算するプログラムを作成するというものです。
足し算のみを使ってべき乗の計算をするプログラムは以下のソースコードの様にできたのですが、足し算と引き算の両方ともを使って計算するプログラムがわかりません。
べき乗の計算をどのように考えれば、足し算と引き算の両方を使って計算できるのか教えてください。
以下、足し算のみを使って計算するプログラムのソースコードです。
・・・ソースコード・・・
#include<stdio.h>

int main(void) {

int i, j, k;
i = 0; ///①Xの加算回数の値を保持する変数iを0に初期化する。///
j = 0; ///②X^2の加算回数の値を保持する変数jを0に初期化する。///
k = 0; ///③X^4の加算回数の値を保持する変数kを0に初期化する。///
double X, goukei1, goukei2, goukei3;
X = 0;
goukei1 = 0; ///④X^2の計算値を保持する変数goukei1を0に初期化する。///
goukei2 = 0; ///⑤X^4の計算値を保持する変数goukei2を0に初期化する。///
goukei3 = 0; ///⑥X^8の計算値を保持する変数goukei3を0に初期化する。///

printf("X=");
///数値Xを入力///
scanf_s("%lf", &X);

///⑦iがX以下か判定し、真ならば⑧~⑨を繰り返し、偽ならば繰り返しを終了する。///
for (i = 0; i < X; i++) { ///⑨iに1を加算する。///
goukei1 += X; ///⑧goukei1にXを加算する。///
}

///⑩jがgoukei1以下か判定し、真ならば⑪~⑫を繰り返し、偽ならば繰り返しを終了する。///
for (j = 0; j < goukei1; j++) { ///⑫jに1を加算する。///
goukei2 += goukei1; ///⑪goukei2にgoukei1を加算する。///
}

///⑬kがgoukei2以下か判定し、真ならば⑭~⑮を繰り返し、偽ならば繰り返しを終了する。///
for (k = 0; k < goukei2; k++) { ///⑮kに1を加算する。///
goukei3 += goukei2; ///⑭goukei3にgoukei2を加算する。///
}
///最終的な計算結果を出力///
printf("X^8=%f", goukei3);

return 0;
}

X^8の計算を、掛け算を使わずに、足し算と引き算を使って計算するプログラムを作成するというものです。
足し算のみを使ってべき乗の計算をするプログラムは以下のソースコードの様にできたのですが、足し算と引き算の両方ともを使って計算するプログラムがわかりません。
べき乗の計算をどのように考えれば、足し算と引き算の両方を使って計算できるのか教えてください。
以下、足し算のみを使って計算するプログラムのソースコードです。
・・・ソースコード・・・
#include<stdio.h>

int main(void) {
...続きを読む

Aベストアンサー

「引き算を使え」という問題の意図がよくわかりませんが、単純にfor文のカウンタ(質問文ではi, j, k)を加算ではなく減算でカウントするっていう意味だったりしないでしょうか。

ところで、X^8 = ((X^2)^2)^2 というアイデアは数学的には賢いやり方ですが、
足し算縛りのプログラムで作ると実は計算量は大きくなると思います。
X^8 = ((((((X*X)*X)*X)*X)*X)*X)*X の方が、実は計算回数が少なくて済みます。
X=10の場合、前者は10,110回、後者は70回の足し算になります。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報