• 締切済み

このプログラムにアドバイスをください

問題が  ・100個の要素を持った一次元配列をmain()関数内で宣言 ・一次元配列と要素数を引数として持つ関数seisei() ・関数seisei()は乱数を使い渡された配列を0~99の整数で初期化する。 ・一次元配列、要素数そして変数のポインタを引数としてもつ関数goukei() ・関数goukei()は渡された配列に格納された数値の合計を計算し、渡された変数のポインタにその合計値を代入する。 と問題があり、下記のようにプログラムを作ったんですが、どうしてもコンパイルできません。どなたかご指摘よろしくお願いします。 #include <stdio.h> #include <time.h> void seisei(int *,int); void goukei(int *, int, int*); int i, *sum; int main() { int a[100],sum; seisei(a,100); goukei(a,100,&sum); printf("sum:%d\n",&sum); return 0; } void seisei(int *a[i], int n) { srand(time(NULL)); for(i = 0; i <= n; i++){ *a[i] = rand() % 100; } } void goukei(int *a[i],int n,int *sum) { *sum = 0; for(i = 0; i <= n; i++){ *sum += *a[i]; } }

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★間違っている場所を教えます。 >どなたかご指摘よろしくお願いします。  ↑  指摘だけでいいんですよね。 ・main 関数にある >printf("sum:%d\n",&sum);  の行と ・seisei 関数の定義そのものの >void seisei(int *a[i], int n)  の行と ・同じく seisei 関数にある >for(i = 0; i <= n; i++){  の行と次の >*a[i] = rand() % 100;  の行と ・goukei 関数の定義そのものの >void goukei(int *a[i],int n,int *sum)  の行と >for(i = 0; i <= n; i++){  の行と次の >*sum += *a[i];  の行の 7 箇所が正しくないです。 ・回答者 No.1 さんの回答を頼りにソースを見直して下さい。 ・以上。それでは頑張って下さい。

回答No.1

#include <stdio.h> #include <time.h> void seisei(int *,int); void goukei(int *, int, int*); int i, *sum; int main() { int a[100],sum; seisei(a,100); goukei(a,100,&sum); printf("sum:%d\n",sum); return 0; } void seisei(int *a, int n) { int i; srand(time(NULL)); for( i = 0; i < n; i++) { a[i] = rand() % 100; } } void goukei(int *a,int n,int *sum) { int i; *sum = 0; for (i = 0; i < n; i++) { *sum += a[i]; } } ポインタと配列、勉強し直し。

関連するQ&A

  • プログラムがわかりません

    C言語の本を読んでいるんですが、詰まってしまいました。プログラム自体は単純なのですが #include<stdio.h> void hello(void) { fprintf(stderr,"hello!\n"); } void func(void) { void *buf[10]; static int i; for(i=0;i<10;i++) { buf[i] = hello; } } int main(void) { int buf[100]; func(); return 0; } のスタックオーバーフローのプログラムです。 1. 要素100のint型配列を宣言 2. 関数funcの呼び出し 3. void *buf[10]; まずここでがわかりません。なぜポインタが   でてきたのか?またbufの要素数は100では? 4. buf[i] = hello; のループ    これもわかりません。配列に関数を代入しているのでしょうか?     5.  fprintf(stderr,"hello!\n"); これもまたわかりません。    fprintfの最初の引数は出力先ですが、なぜ標準エラー出力なの   でしょうか? 時間のあるかた解説お願いします。

  • プログラムを上手く動かすには…

    #include<stdio.h> #include<stdlib.h> double sumf(int n,double *ds); int main(){ double a,b; double df=0.7 int n; double *ds; double *z; int size; printf("Input two numbers -> "); scanf("%lf%lf",&a,&b); printf("n"); size = sizeof(*ds)*(1+(int)((b z = ds = (double*)malloc(size); n = 0; while(a<=b){ *z = a; a += df; printf("%.1f",*z++); n++; } printf("n"); printf("n"); printf"sumf = %.1fn",sumf(n,ds)); return 0; } double sumf(int n,double *ds){ double sum = 0; while(n){ sum += *ds; n--; } return sum; } 入力された二つの実数a,b(a<b)をもとに、aからbまで0.7ずつ増加する数値の配列を作り、その配列の合計を求める関数sumfを作りなさい。ただし、配列を作る、配列の合計を求める箇所はポインタを使うこと。 【ヒント】 ・プログラムの構成 mainで配列要素の作成、配列の表示、関数sumf呼出し、sumの表示。 関数sumfで配列の合計を求めreturnで合計値を返す。 ・引数の考慮点 実数の配列だけでなく配列の要素数も引数として渡す必要がある。 宜しくお願いします。 どこが違うのでしょうか?

  • 引数で指定された配列の要素数の取得

    どうもこんにちは。 C言語でプログラムを作成しています。 ある関数に配列を渡すことを考えていますが、渡した配列の要素数を取得する方法は何かありますか? 標準の関数を見ても、配列の先頭アドレスのポインタとともに、配列の要素数を渡しているものばかりで、配列のポインタを渡しているものは見かけません。 要素数があらかじめわかっていれば、それを引数の型に指定できますが、呼び出されるまで不明な場合はうまくいきません。 配列の要素数も引数として一緒に渡す必要がありますか? [作ってみたサンプル] #include <stdio.h> #include <stdlib.h> #include <string.h> // func1 と func2 をまとめられないだろうか。。。 void func1(int (*p)[10]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } void func2(int (*p)[5]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } int main(int argc, char *argv[]) { ________int ary1[10] = { 2, 4, 6, 8, 0, 1, 3, 5, 7, 9 }; ________int ary2[5] = { 3, 6, 9, 12, 15 }; ________func1(&ary1); ________func2(&ary2); ________return 0; }

  • ポインタの勉強中なのですが

    C言語の勉強中なのですが、ポインタのところで苦労しています。 次のような関数を作成し、main関数で実行したところ、sizeof(array)は4になりました。 main関数内で同じようにsizeof(array)を表させると配列全体のサイズが表示されますよね。 関数の仮引数として配列を書いても、実際には配列の先頭要素を指すポインタとして扱われるので 関数には&array[0]が渡され、関数は配列ひとつあたりのサイズを基に他の配列の要素のアドレスを 受け取るで合ってますよね? でもmain関数内ではsizeof(array)は配列全体のサイズを返すのに、関数内では配列ひとつあたりのサイズしか返さないのはどうしてなのでしょうか? int sum_array( int array[], int num ){ int i; int sum = 0; for( i = 0; i < num; i++ ){ sum += *(array+i); } printf("sum = %d\nsizeof(array)=%d\n",sum,sizeof(array)); return sum; }

  • 2次元配列とポインタの引数受け渡しについて

    2次元配列を関数に渡すときは、引数に渡す2次元配列と同じサイズを指定、もしくは2次元目のサイズのみ合わせて渡す方法がありますが、両方とも違うサイズで同じ関数を使いたいです。 最初は中身が同じで引数で受け取る2次元配列のサイズだけ、それぞれに合わせた引数を持つ関数を2つ作っていたのですが、なんだか冗長な気がしました。 そこで、2次元配列の先頭ポインタとサイズを受け取るようにすればいいのかと思い、テストとして次のプログラムを作成してみました。 #include <stdio.h> void func(unsigned char *a, int y, int x); int main(void) { unsigned char a[10][10]; func(a, 10, 10); printf("%d\n", a[7][4]); return 0; } void func(unsigned char *a, int y, int x) { int i, j; for (i = 0; i < y; i++) { for (j = 0; j < x; j++) { *(a + i*y + j) = i * j; } } } もちろんこれでも動くのですが、やはりこういう書き方はルールにはないので、コンパイルで警告が出ます。 a.c: In function ‘main’: a.c:10: warning: passing argument 1 of ‘func’ from incompatible pointer type a.c:4: note: expected ‘unsigned char *’ but argument is of type ‘unsigned char (*)[10]’ このような書き方はやはりやめたいいのでしょうか。 また、その際はサイズ別に関数を作るしかないのでしょうか。 他にいい方法があれば教えていただけると助かります。

  • 2次元配列を引数とする関数について

    2次元配列を引数とする関数について 私は今、2次元配列を引数とする関数の表を作るという課題に取り組んでいます。 条件として、int a[数字][数字]={{1,2,3...}}という配列の宣言と同時の初期化は使わず、 関数内で表の値を代入し、値を表示する関数を作り、事実上二つの関数を作るというものです。 私は以下のようなプログラムを作り、動かしましたが、[数字][数字]=********のような本来 あるべき実行結果とは異なる数字の羅列が出てきてしまいました。 ↓ #include <stdio.h> void func(int a[][6]); void fund(int b[4][6]); void main(void) { int a[4][6]; fund(a); func(a); } void func(int a[][6]) { int i,j,b[4][6]; fund(b); for(i=0;i<4;i++)        { for(j=0;j<6;j++) { printf("a[%d][%d]=%d\n",i,j,a[i][j]); printf("\n"); } } } void fund(int b[4][6]) { int i,j; for(i=0;i<4;i++) { for(j=0;j<6;j++)          { scanf("b[%d]*[%d]=%d\n",&i,j,b[i][j]); } } } 本来の実行結果 1 2 3 4 5 6 2 4 6 8 10 12 3 6 9 12 15 18 4 8 12 16 20 24 紙にも書いて何回も見直しましたが、どこがおかしいのかわかりませんでした。 どうすれば良いのでしょうか? 何か良いアドバイスをよろしくお願いします。

  • 数の大きさ

    C++初心者です。以下の様なプログラムで、合計を求めたいのですが、あまり桁数の大きい数だと、正確な値がでません。(20桁とか・・・)これは一体どういうことが考えられますか?//配列の全要素の合計を求める #include<iostream.h> int main(void) { int i; int a[5]={0}.; cout<<"5個の整数値を入力しましょう。 \n"; for(i=0; i<5; i++) { cout<<"No."<<i+1<<": "; cin>>a[i]; } int sum=0; for(i=0; i<5; i++) sum=sum+a[i]; cout<<"合計は"<<sum<<"です。\n"; return(0); }

  • C言語から質問です。

    C言語から質問です。 /* main関数の中で初期化した配列 data[10]={60,30,70,25,20,9,92,55,20,10}; を関数 keisan() に引数として渡して、関数keisan()内で 平均値、最大値,最小値 を求め、その結果をmain関数に戻し、main関数内で 平均値、最大値,最小値を表示させるプログラムを作成せよ。 int keisan(const int data[], int data_kosuu, double answer[]) { return 0; } とする。 (注) プロトタイプ宣言を用いよ。 ヒント:平均値,最大値,最小値の3つの値を main関数に戻すやり方として、配列answer[]を使うとよい。 data_kosuu は、配列の要素数を与えるものです。 ヒント: (int型の変数)/(int型の変数)=int型の値です。 int型同士の割り算の答えANSWERをdoubleにしたい場合は、  ANSWER=(double)(int型の変数)/(int型の変数);    と(double) キャストという操作をする必要がある */ #include <stdio.h> int keisan(const int data[], int data_kosuu, double answer[]); int main(void) { int i; int a[10]={60,30,70,25,20,9,92,55,20,10}; // この値を使ってください double ans[3]; keisan(a,10); /* keisan関数に配列と配列要素数を引数で与える */ for(i=0; i<10 ; i++) printf("a[%d]=%d\n",i,a[i]); printf("平均=%lf 最小値=%d 最大値=%d\n",ans[0],ans[1],ans[2]); return 0; } /* 合計・最大値・最小値を求める関数 */ int keisan(const int data[], int data_kosuu, double answer[]) { int i; int sum; int min,max; min=10; /* min の初期化 */ max=10; /* max の初期化 */ sum=0; /* 合計値の初期化 */ for (i=0; i<10 ; i++){ sum = sum+data[i]; if(data[i] > max) max=data[i]; if(data[i] < min) min=data[i]; } sum=sum/10; answer[0]=sum; answer[1]=min; answer[2]=max; } エラー error C2198: 'keisan' : 呼び出しに対する引数が少なすぎます。 とでて先に進めません。 教科書などを見ても間違いがわかりません; 虫食いになってるところを自分なりにやってみたため、 根本的に間違ってるかもしれませんが、 どうかアドバイスや指摘などをお願いします。

  • C言語 動的なメモリの確保 コンパイル時エラーも警告もないのに実行できない

    配列A[3]を{2, 4, 6}と初期化させ、malloc関数を使いメモリを確保しそこへ先程の配列Aの要素を記憶させ、ポインタ*Nを使い確保したメモリの要素を表示するプログラムです。 ********************************************* #include <stdio.h> #include <stdlib.h> int main(void) {   int A[3] = {2, 4, 6};   int i;   int *N;   N = (int *) malloc (3);   for(i = 0; i < 3; i++){     N[i]= A[i];   }   for(i = 0; i < 3; i++){     printf("%d", N[i]);   }   free(N);   return 0; } ********************************************* VCを使いF10のデバッグテストでは正常に動くのですが、コマンドラインからではエラー報告画面がでます。なぜなのでしょうか?

  • 合計表示プログラムについて

    こんばんは。 この掲示板には大変お世話になっています。 合計を表示させるプログラムについて質問します。 以下にプログラムを示します。 トータル:55と表示させたいのですが、以下のプログラムですと、sum関数が呼ばれるたびにトータルが表示されてしまいます。 「トータル55」と表示させるのみにする場合は、どこを訂正すればよろしいでしょうか? 実際はmain内で、 total +=a; を記述したらいいと思うのですが、sum関数を使ってできないでしょうか? よろしくお願いします。 [プログラム] #include<stdio.h> static void sum(int a); int main(){ int a; for(a=0;a<11;a++){ sum(a); } } void sum(int a){ static int total=0; total += a; printf("トータル:%d\n",total); }

専門家に質問してみよう