- ベストアンサー
C++の問題についてです
5個の数字をキーボードから受け取って、その中に同じ数字があれば、画面にその旨報告する。 というプログラムを作っているのですが、自分で作った結果、 #include "stdafx.h" #include <stdio.h> int main(void) { int i, j, a; i = 0; do{ printf("値を入力してください:"); scanf("%d", &a[i]); for(j=0; j < 5; j++) { if(a == i) { printf("%dは同じ値があります。\n", a[i]); } } i++; } while(i<5); return 0; } となりました。 このプログラムで文法がおかしいというところがあれば教えていただけませんか? 自分で考えてみたものの、全然わかりませんでした。 使用しているソフトはVisual C++2005 Express Edition というソフトです。 どうかよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス >このプログラムで文法がおかしいというところがあれば教えていただけませんか? ↑ 単純変数と配列の区別が付いていないです。 既に sakusaker7 さんからアドバイスされているとおりです。 『a』は配列として宣言しておけば上手くいきそうですが…。 ・ただ for 文で 5回スキャンしてその後に i++ をして do-while 文を組んでいますね。 同じ数値があれば画面の表示するだけですか? さらに for 文で『5』という定数を使っていますが読み込んだ数までをチェックすれば いいと思います。 間違い⇒for( j = 0 ; j < 5 ; j++ ) 正しい⇒for( j = 0 ; j < i ; j++ ) となります。 入力された『i』までをチェックすればよい。 こうしないと宣言時の a[5] の不定値と比較してしまいます。 宣言時に配列などを 0 で初期化するには (1)int a[5] = { 0 }; (2)static int a[5]; (3)for、while でループを組んで 0 で初期化 (4)memset() 関数で 0 に初期化 の方法で行います。お勧めは(1)が簡単です。 その他: ・なぜ『#include "stdafx.h"』をインクルードしているのですか? 必要ない気がしますけど。 >使用しているソフトはVisual C++2005 Express Edition というソフトです。 ↑ コンソール・アプリケーションでプロジェクトを作成した時に『空のプロジェクト』に チェックをすれば不必要なファイルは作成されません。 C 言語のお勉強なら自動作成される stdafx.h は特に必要ありません。 ・今回は a の宣言を配列でして for 文の条件式を i カウンタまでをチェックするように 書き換えれば上手くいくと思います。あと for 文中の if 比較も a[i] としましょう。 さらにもう一つ付け加えると do-while ではなくて for 文を使っても出来ます。 つまり for ( i = 0 ; i < 5 ; i++ ){ ←入力用のループ for ( j = 0 ; j < i ; j++ ){ ←重複チェック用のループ : 処理 : } } とします。 ・以上。参考に。
その他の回答 (3)
- zwi
- ベストアンサー率56% (730/1282)
>C++の問題についてです このソースコードはC++言語ではありません。C言語の機能しか使われていませんので、C言語の勉強をしているところですよね? C++とCでは書き方がまったく違いますので、C++の勉強が必要なのであればC++言語の書き方をアドバイスしますけど本当に必要ですか? その他の問題点。 (1)配列を勉強していないか、理解していません。変数aは配列ではありません。 (2)if(a == i)は何をしたいか分かりません。入力された5つの数字の中に同じものがあるか比較している部分だと思いますが、これで本当に比較できていると思いますか? (3)処理の手順が出鱈目です。5つの数値の入力と5つの数値の比較を同時に行おうとしていますが、そんな事はできません。もう一度処理手順を整理してみてください。 そうですね、処理手順をまず日本語で書き出してみてください。他人のために作業の指示手順書を作成するつもりで処理手順を書き出します。どうです?ちゃんと手順を書き出せますか?
お礼
ご回答ありがとうございます。 再度、日本語で処理手順を書いてみようと思います。 アドバイス頂けましてありがとうございました。
- sakusaker7
- ベストアンサー率62% (800/1280)
> できればこのエラーメッセージの意味するところを教えてくださいませんか? 日本語が母語でないということはないですよね? 本当に書いてあるそのままなんですけど… 質問にあるプログラムで、変数 a について注目してみると int i, j, a; と宣言されているので、その型は int です。 しかしながらエラーが報告されている行を見てみると、 > scanf("%d", &a[i]); > printf("%dは同じ値があります。\n", a[i]); a[i] のように使われていますが、通常の int 型の変数に対して このようなことをすることはできません。 よってエラーになっているわけです。 もしここで配列変数が必要なら、宣言する部分でaが配列であるように 宣言してやらなければ成りません。 int a[5]; のように。 まあここを直してもまだバグがあるので、期待通りには動かないと思いますが。
お礼
ありがとうございます。 自分で最初から見直すことにしました。 本当にご回答ありがとうございました。
- sakusaker7
- ベストアンサー率62% (800/1280)
『文法的におかしいかどうか』はコンパイラにチェックさせればいいのでは? 「論理的におかしい」かどうかならまだわかりますけど。 >cl err.cpp Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. err.cpp err.cpp(10) : error C2109: 配列または、ポインタでない変数に添字が使われました。 err.cpp(15) : error C2109: 配列または、ポインタでない変数に添字が使われました。 ひょっとしてこのメッセージの意味するところがわからないということでしょうか? > int i, j, a; と > scanf("%d", &a[i]); で a の型が違ってません?
補足
返答ありがとうございます。 ↓のエラーメッセージの意味がわからないというところが抜けていました。 err.cpp(10) : error C2109: 配列または、ポインタでない変数に添字が使われました。 err.cpp(15) : error C2109: 配列または、ポインタでない変数に添字が使われました。 できればこのエラーメッセージの意味するところを教えてくださいませんか? しつこいようで申し訳ありませんが、aの型が違うとはどのように違うのか教えていだだけますか? 初歩的な質問ですいませんがよろしくお願いします。
お礼
わかりやすく回答していただきありがとうございました。 なんとなく理解することができました。 後は自分でがんばってみますね。 本当にありがとうございました。