• ベストアンサー

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 というソフトです。 どうかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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++ ){ ←重複チェック用のループ     :    処理     :   }  }  とします。 ・以上。参考に。

reimu-
質問者

お礼

わかりやすく回答していただきありがとうございました。 なんとなく理解することができました。 後は自分でがんばってみますね。 本当にありがとうございました。

その他の回答 (3)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

>C++の問題についてです このソースコードはC++言語ではありません。C言語の機能しか使われていませんので、C言語の勉強をしているところですよね? C++とCでは書き方がまったく違いますので、C++の勉強が必要なのであればC++言語の書き方をアドバイスしますけど本当に必要ですか? その他の問題点。 (1)配列を勉強していないか、理解していません。変数aは配列ではありません。 (2)if(a == i)は何をしたいか分かりません。入力された5つの数字の中に同じものがあるか比較している部分だと思いますが、これで本当に比較できていると思いますか? (3)処理の手順が出鱈目です。5つの数値の入力と5つの数値の比較を同時に行おうとしていますが、そんな事はできません。もう一度処理手順を整理してみてください。 そうですね、処理手順をまず日本語で書き出してみてください。他人のために作業の指示手順書を作成するつもりで処理手順を書き出します。どうです?ちゃんと手順を書き出せますか?

reimu-
質問者

お礼

ご回答ありがとうございます。 再度、日本語で処理手順を書いてみようと思います。 アドバイス頂けましてありがとうございました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> できればこのエラーメッセージの意味するところを教えてくださいませんか? 日本語が母語でないということはないですよね? 本当に書いてあるそのままなんですけど… 質問にあるプログラムで、変数 a について注目してみると int i, j, a; と宣言されているので、その型は int です。 しかしながらエラーが報告されている行を見てみると、 > scanf("%d", &a[i]); > printf("%dは同じ値があります。\n", a[i]); a[i] のように使われていますが、通常の int 型の変数に対して このようなことをすることはできません。 よってエラーになっているわけです。 もしここで配列変数が必要なら、宣言する部分でaが配列であるように 宣言してやらなければ成りません。 int a[5]; のように。 まあここを直してもまだバグがあるので、期待通りには動かないと思いますが。

reimu-
質問者

お礼

ありがとうございます。 自分で最初から見直すことにしました。 本当にご回答ありがとうございました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

『文法的におかしいかどうか』はコンパイラにチェックさせればいいのでは? 「論理的におかしい」かどうかならまだわかりますけど。 >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 の型が違ってません?

reimu-
質問者

補足

返答ありがとうございます。 ↓のエラーメッセージの意味がわからないというところが抜けていました。 err.cpp(10) : error C2109: 配列または、ポインタでない変数に添字が使われました。 err.cpp(15) : error C2109: 配列または、ポインタでない変数に添字が使われました。 できればこのエラーメッセージの意味するところを教えてくださいませんか? しつこいようで申し訳ありませんが、aの型が違うとはどのように違うのか教えていだだけますか? 初歩的な質問ですいませんがよろしくお願いします。

関連するQ&A

  • C言語の問題

    以下はC言語の問題です。お教えください。 1000以下の素数を求めるプログラム prog.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 です。 僕の考えでは、 #include <stdio.h> #include <math.h> main(){ int i; int j; int ix; int k; printf("正の整数を入力して下さい: "); scanf("%d",&i); ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++) { if(i%j==0) { k=1; } } if(k==0) { printf("%d は素数です\n",i); } else { printf("%d は素数ではありません\n",i); } となると思うのですが。どうやら違うようです。全然わからないので、正しい答えを教えてください。

  • C言語のソートの問題なんですが

    値を入力する→値を入力する度に昇順に表示する これを不の値を入力するまで続けるという プログラムを作ろうと思っているのですが #include<stdio.h> swap(int *a,int *b) { int t; t=*a; *a=*b; *b=t; } main() { int i,j,k,a[100]; for(i=0;;++i)  {   scanf("%d",&a[i]);   if(a[i] < 0)    break;   for(j=i+1;;++j)    if(a[i] > a[j])     swap(&a[i],&a[j]);   for(k=0;k <= i;++k)    printf("%d ",a[k]);  }  return 0; } のように書いたのですがjを使った繰り返しの部分でa[j]に 値が無いから動かないと思うのですが どのように直せばいいか分かりません どなたか分かる方御教授お願いします

  • 数学の公式に沿った逆行列

     数学の公式に沿った2x2逆行列を作るという演習問題を解きたいのですが  下記のプログラムではdの値がおかしくなってしまいます。  何が悪いのか指摘していただけませんでしょうか。  よろしくお願いします。 // 20060414.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include <stdio.h> #include <stdlib.h> int _tmain(int argc, _TCHAR* argv[]) { int i,j ; double a[2][2] ; double b[2][2] ; double d ; for (i=0;i<2;i++){ for (j=0;j<2;j++){ printf("a%d%d = ?",i+1,j+1); scanf("%f",&a[i][j]); } } d = a[0][0]*a[1][1]-a[0][1]*a[1][0]; if (d==0.0){ printf("行列式は正則でない。\n"); exit(1); } b[0][0] = a[1][1]/d; b[0][1] = -a[0][1]/d; b[1][0] = -a[1][0]/d; b[1][1] = a[0][0]/d; for (i=0;i<2;i++){ for (j=0;j<2;j++){ printf("b%d%d = %f\n",i+1,j+1,b[i][j]); } } scanf("%d",d); return 0; }

  • c言語 プログラム ピラミッド

    プログラミングについて教えてください プログラムは ピラミッドの図形をユーザーが指定した数字で正三角形の ピラミッドの段数を指定できるプログラムです 例えば「5」と打てば ********* ■ ********■■■ ******■■■■■ ****■■■■■■■ **■■■■■■■■■ このような感じに表示されます *の部分は空白です #include<stdio.h> int main (void) { int num,i,j,h; printf("ピラミッドの高さを入力してください : "); scanf("%d" ,&num); for(i=1; i<=num; i++){ for(j=num; j>=i+1; j--){ printf(" ",j); } for(h=1; h<=j; h++){ printf("■"); } printf("\n"); } return 0; } ここまで出来ています、詰まっているのでご教授ください よろしくお願いします

  • C言語

    このプログラムを作りたいのですが… ??????????? 物の総数を入れてください:12 取り出す物の数を入れてください:2 12個の異なる物から2個をを取り出す組み合わせの数は66です ?????????????? ここに出てくる数字は scanfで入れます。 だいたい こんな感じだと思うのですが… ***********の部分が わかりません。 ??????????????? #include<stdio.h> int factorial(int m,int r) { ************** } int main(void) {int a,b; printf("物の総数を入れてください:") scanf("%d",&a); printf("取り出す物の数を入れてください:") scanf("%d",&b); printf("12個の異なる物から2個を取り出す組み合わせの数は%dです。\n",a,b,factorial(a,b));) ?????????????? お願いします(>_<)

  • c言語のプログラミングについて聞きたいのですが

    自分は課題で「10人分の名前と点数を入力して降順に並び替える」というプログラムを作ろうとしているのですが、なかなかうまくいきません。一応↓の形までできたのですがなぜか数字が変になります。 どうしてか教えていただけないでしょうか。 #include<stdio.h> int main(void) {     int i,j;     int tensu[10][3];     char namae[10][6]; for(i=0;i<10;i++){ printf("名前の入力>>"); scanf("%s",&namae[i]); printf("点数の入力>>"); scanf("%d",tensu[i]); } printf("名前   点数\n"); for(j=0;j<10;j++) { printf("%s ",&namae[j]); printf("%10d\n",tensu[j]); } return 0; } それとポインタ?みたいなのもよく理解できず、点数で降順にしたあとに点数を使って名前を並び替えるのかなと思うのですがそれもよくわかりません。 どなたか教えてください

  • C言語 %表示

    二つの整数値を読み込んで、前者が後者の何%かを表示するプログラムを作成したいです。 #include<stdio.h> int main(void){ int no1,no2; printf("整数を入力してください。\n"); printf("整数A:"); scanf("%d",&no1); printf("整数B:"); scanf("%d",&no2); printf("Aの値はBの値の%f%%です。\n",(double)(no1/no2)); } Aの値はBの値の0.0000%です。となってしまいます。 上記のプログラムの訂正をお願いします。

  • C言語の配列について

    配列を20 定義し値を入力して合計値を出したいのですがどうすればよいのでしょうか 下のソースでエラーはおこりませんでした 何がちがうのでしょうか #include <stdio.h> int main() { int a[20]={}; int i, sum; printf("整数を入力してください:"); scanf("%d",&a); printf("\n"); for (i = 0; i < 10; i++) { sum += a[i]; } printf("sum= %d\n", sum); return 0; }

  • 詳しい方に質問です

    Cを始めて2日目の初心者です。 #include <stdio.h> int main () { int a,b; printf("一つ目の数字を入力"); scanf("%d", &a); printf("二つ目の数字を入力"); scanf("%d" &b); printf("%d - %d = %d\n"a,b,a-b); } このプログラムの間違っているところを教えてください。

  • C言語の問題を教えてください。初心者です。

    1000以下の整数を入力して、それ以下の素数を出力するプログラムをつくっています。 一応自分でやってみたのですが、どうもうまくできません。自分ではどこが間違っているのかさっぱりなので間違い箇所を指摘し、どうすれば良いのかを教えていただきたいです。ほかに効率的なやりかたがあったらあわせてお願いします。 初心者なので易しく説明していただけるとありがたいです。 <自分でやってみた> #include <stdio.h> int main(){ int i,j,N; int a[1000]; for (i=2; i<=1000; i++) { a[i]=1; } for (i=2; i<=1000; i++) { for (j=i++; j<=1000; j++) { if (a[j]=1 && j%i==0) { a[j]=0; } } } printf("2以上1000以下の整数を入力してください\n"); scanf("%d",&N); printf("%d以下の素数は\n",N); for (i=2; i<=N; i++) { if (a[i]=1) { printf("%d\n",i); } } } よろしくお願いしますm(_ _)m