キーから入力したデータを配列に入力した後、その和を求めるプログラムを作成したいのですが、プログラミング初心者の私にはさっぱりわかりません。
和を求めたいのに平均値が出てきてしまいます。
どこが間違っているのか教えてください。

#include <stdio.h>

float data[5];

float total(int max);

void main(void)
{
int cnt = 0;
float d;

printf("please input a data: ");
scanf("%f", &d);

while((cnt < 5) && (d > 0.0))
{
data[cnt] = d;
cnt++;
printf("please input a data: ");
scanf("%f", &d);
}

printf("total data: %5.2f\n", total(cnt));
}

float total(int max)
{
int i;
float total = 0.0;

for(i = 0; i < max; i++)
{
total += data[i];
}
return total / max;
}

A 回答 (2件)

最後の


return total / max;
で平均値を出してしまっています。ここを
return total;
とすればいいです。

ついでですが、main関数は
void main(void){
..
}

ではなく

int main(void){
..
return 0;
}

として、OSに正常終了を知らせたほうがよいです。
    • good
    • 0

> return total / max;



ここで、total を max で割っているから、平均値になるのでは?
素直に、

return total;

でいいと思います。
    • good
    • 0

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

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

このQ&Aを見た人が検索しているワード

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

QCなどで要素の数が固定できない配列はどうやって実現しますか?

配列について質問します。

BASIC系では配列は動的配列で要素の数が自由に変えられます。
ですが、C等では宣言時に配列の要素の数を決めておかねばならなかったと思います。
もし、C等で要素の数がわからないけど、配列を使いたい場合、どうすればいいのでしょうか?
どのように実現するのでしょうか?
配列と同じ使い勝手なら配列でなくともかまいません。

今はVBAでプログラムを組んでいるので、動的配列を使えばすむのですが、いずれ他の言語に移植したいので、できるだけ使わないようにしたいと思っています。

よろしくお願いいたします。

Aベストアンサー

malloc等のメモリ確保はNo.1さんの回答のリンクが詳しいですね。
C言語でプログラムを組む場合は、大抵はこれらメモリ操作関数のお世話になります。

これに加えて、C++やJavaのライブラリでは、動的配列クラスというものが使えます。
C++だとvectorやlist、JavaだとVectorやArrayListあたりですね。
他にも、言語や環境に依存したライブラリ、フレームワークで
様々な動的配列の機構が用意されていたりします。

簡単にまとめると、
・malloc、free、realloc等を使う方法 → ReDim
・動的配列クラス → Collection
のようなものだと考えてください。

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

QC#かJavaで、配列の中から別の配列を探し出す

お世話になります。

C#かJava(CやC++は入れない)で、特定の配列の中に、該当する
配列があるかどうかを調べるメソッドがあれば、教えてください。

例えば…

int[] a={0,0,0,1,2,3,4,5,6,7};
int[] b={3,4,5};

ならば、『5』が返ってくるなどです。

力技では、aの配列を順にみていき、bの一番目と同じなら、
お互いの配列の次の要素を比較…などとやっていくのですが、
これらの方法を、標準のメソッドがあれば…と思い、
質問させていただきました。

以上、よろしくお願いいたします。

Aベストアンサー

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の先頭の添字だけ欲しい場合
listA.indexOf(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の最後の添字だけ欲しい場合
listA.lastIndexOf(b[index]);

最初に見つかる添字だけ欲しいなら標準ライブラリで取得できますが、
全添字が欲しいとなると途端に泥臭くなります。

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオ...続きを読む

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

QC言語の2次元配列 容量が大きすぎる場合の対処方法

私はC言語をもちいて2次元配列を作ろうとしています。

しかし、配列数が double c[10000][10000];
と大きいものにすると、エラーになってしまいます。

もちろん小さい double c[10][10];
のような配列では問題ありません。

malloc関数とかも調べたのですがなかなかいい文献が見つからずに
困っています。
どうかいいご意見があればよろしくお願いします。

Aベストアンサー

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fread(&c, 1,8, fp);
 return c;
}

void write_c(FILE *fp, double *c, int x, int y) {
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fwrite(c, 1,8, fp);
}

int main(void)
{
 FILE *fp;
 double c,s;
 int x,y;
 int a[10000],b[10000];
 
 fp = fopen("c.dat","w+b");// double c[10000][10000]; の意味
 
 for(x=0; x<10000; x++) {
  for(y=0; y<10000; y++) {
   c=a[x]*b[y];
   write_c(fp, &c, x,y);// c[x][y]=a[x]*b[y]; の意味
  }
 }
 
 for(x=0; x<10000; x++) {
  s=0;
  for(y=0; y<10000; y++) {
   s += read_c(fp, x,y);// s += c[x][y]; の意味
  }
  b[x] = s / 10000;
 }
 
 fclose(fp);
 return 0;
}

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);...続きを読む

Qint nII[10] = { 0 }について

久々にCを使ってプログラムを組んでいるのですが、基本的な構文を思い出せず
いくつか教えていただきたく質問させていただきました。

1)配列すべてを初期化するのに、宣言時に

int nII[10] = { 0 };

で大丈夫だった(全ての要素が0で初期化)と記憶しているのですが、間違いないでしょうか?

2)構造体の初期化は

struct tm tm;
memset(&tm, 0, sizeof(struct tm))

で大丈夫でしょうか?

3)構造体の宣言は

typedef struct{
int a;
}HOGE, *LPHOGE;

HOGE st; // <- struct HOGE stと同じ
LPHOGE pst; // <- struct HOGE* pstと同じ

で問題ないでしょうか?

以上、3つ質問になって申し訳ないのですが、よろしくお願いします。

Aベストアンサー

1)OK
2)たぶんOK
3)HOGEという名前の構造体はない(当該の構造体には名前がない)ので、
// 以下のコメント記述が誤っています。ただし、

HOGE st;
LPHOGE pst;
という定義そのものはOK

Qc言語の配列の先頭アドレスが偶数アドレスとなる理由について

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
printf("%p\n",&nc);
printf("%p\n",&nd);


}

実行結果
0xbffff8cf
0xbffff8ce
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8b0 0xbffff8b1 0xbffff8b2 ← S配列
0xbffff8af
0xbffff8ae

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
pr...続きを読む

Aベストアンサー

メモリの配置はコンパイラとコンパイルオプションに依存します。
デフォルトだと、32ビットのメモリ処理単位=4バイトとか8バイトが多いかと。
理由は32ビットCPUが4バイト単位でメモリにアクセスするのでアクセス効率を優先したためです。

例えば、
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8ce 0xbffff8cf 0xbffff8d0 ← S配列
だとしたら、S配列の内容全てを参照するためにCPUは0xbffff8ccと0xbffff8d0の合計8バイトにアクセスする必要が出てきます。無駄ですよね。

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。

QC言語でunsigned char配列を連結する方法ってありますか?

C言語でunsigned char配列を連結する方法ってありますか?

例えば
unsigned char test[]={0x00,0x02,0x03};
unsigned char test2[]={0x05,0x06};
という配列があったとして

test[]という配列のあとにtest2の配列を追加することは可能でしょうか?
{0x00,0x02,0x03,0x05,0x06}という配列になればOKです。

よろしくお願いします。

Aベストアンサー

testの領域は3バイトのため、それ以上の配列を追加することは出来ません。
もし、testのサイズが5バイト以上あれば、test2を追加することは、できます。
その場合は、memcpy(&test[3],test2,2); とすれば、
testの4バイト目からあとに、test2の2バイトが追加されます。
新たに配列を作成して良いなら、
unsigned char test3[5];として
memcpy(test3,test,3);
memcpy(&test3[3],test2,2);
とすれば、test3はtestとtest2を連結したものとなります。

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む


人気Q&Aランキング