C言語のポインタを使用した配列の降順並び替えプログラムの作成方法についての質問

このQ&Aのポイント
  • C言語のポインタを使用した配列の降順並び替えプログラムの作成方法について教えてください。
  • 具体的には、n個の配列データを受け取り、2つのデータを引数で受け取って交換する関数を使用して、最終的に降順に並び替えて出力するプログラムを作成したいです。
  • また、平均と標準偏差を計算する関数も使用して結果を出力したいです。
回答を見る
  • ベストアンサー

C言語のポインタのプログラムについての質問です。

C言語のポインタについて質問です。 nこの配列データaを受け取り、それらの値をもとに、2つのデータを引数で受け取って交換する関数void swap(double *a,*b)を用いることにより最終的に降順に並べ替えて出力したのち、それらを平均(average)と標準偏差(standard deviation)を引数で受け渡す関数 void calc_ave_stddev(int n,double a[],double *ave,double*stddev)を利用して出力されるプログラムを教えてほしいです。 main関数内での書式は printf("enter n:"); scanf("%d,&n"); for(i=0;i<n;i++){ printf("enter a[%d]:",i); scanf("%lf"&a[i]); } main関数での結果の出力は、 for(i=0;i<n;i++){ printf("a[%d]=%lf\n",a[i]); } printf("ave=%lf stddev=%lf\n",ave,stddev); です。

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

  • ベストアンサー
回答No.1

/* こんな感じになりました。 あと、平均(average)と標準偏差と書かれてますが、出力するのは分散と標準偏差ではないのですか? もし、平均ならvoid calc_ave_stddev(int n, double a[], double *ave, double *stddev)関数の中のこの av=total/n; //トータル÷入力回数 avの値をprintfで出力してください。 */ #include <stdio.h> #include <stdlib.h> #include <math.h> void swap(double *a, double *b); void calc_ave_stddev(int n, double a[], double *ave, double *stddev); int main(void) { int i, j, n=0; double *a, ave=0.0, stddev=0.0; a=(double *)malloc(100); printf("enter n:"); scanf("%d",&n); for(i=0; i<n; i++){ printf("enter a[%d]:", i); scanf("%lf",&a[i]); } for(j=0; j<n; j++){ for(i=j+1; i<n; i++){ if(a[i]>a[j]){ swap(&a[i], &a[j]); } } } for(i=0; i<n; i++){ printf("a[%d]=%f\n", i, a[i]); } calc_ave_stddev(n, a, &ave, &stddev); printf("ave=%f stddev=%f\n", ave, stddev); free(a); return 0; } void swap(double *a, double *b) { double temp=0.0; temp=*a; *a=*b; *b=temp; } void calc_ave_stddev(int n, double a[], double *ave, double *stddev) { int i; double *s; double total=0.0, av=0.0; s=(double *)malloc(100); for(i=0; i<n; i++){ total+=a[i]; } av=total/n; for(i=0; i<n; i++){ *ave+=((a[i]-av)*(a[i]-av)/n); } *stddev=sqrt(*ave); free(s); }

関連するQ&A

  • C++に関する質問です

    #include <stdio.h> double calave (double [ ] ); double calmax (double [ ] ); main () { int i; double average,maximum; double a[5]; for ( i=0;i<=4;i++) { printf ("Input data %d\n", i ); scanf ("%lf",&a [i] ); } average = calave (a); maximum = calmax (a); printf ("Average = %lf\n", average); printf (" Maximum = %lf\n", maximum); } double calave (double x [5]) { int i; double ave; ave = 0; for (i=0; i<=4; i++) { ave = ave + x[i]; } ave = ave /5.0; return (ave); } double calmax (double x[5]) { int i; double max; max = x[0]; for ( i=0; i<=4; i++) { if ( max >= x [i] ){ max = max; }else{ max = x[i]; } } return (max); } 上のプログラムでは,関数calaveに入力している配列変数はa[ ]だが,関数calave内で使用している配列変数はx[ ]であり,名前が違う変数である。これが,プログラム上は問題ない理由を教えてください。 よろしくお願いします。

  • c言語超初心者です。2

    #include <stdio.h> int main(void) { int na,nb, nc; int sum; double ave; puts("三つの整数を入力してください."); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("整数C:"); scanf("%d", &nc); sum=na+nb+nc; ave=(double)sum/3; printf("それらの合計は%5dです。\n", sum); printf("それらの平均は%5.1fです。\n",ave); return(0); } とういうのを作ったんですが、最後のそれらの合計は%5dとやりその5の意味は整数を10進法で少なくても5桁で表示とありますが、例えば1,2,3と入力しても合計は6とでて5桁ででないんですけど。そういう意味ではありませんか?あとave=(double)sum/3;のところをave=sum/3.0としても問題なくできるのですが、どっちでやったほうがいいとかはありますか?もしあったらその理由も教えてください。

  • C++でのプログラムについての質問です

    このような二次関数の解を求めるプログラムを作成したのですが、自作関数solveをvoid solve(double, double, double)のように変更し同じ動作をするように変更したいです どのようにへんこうすればよいでしょうか #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りとなる。\n"); if (a == 0.0) { if (b == 0.0) { printf("係数がおかしい\n"); exit(-1); } { x1 = -c / b; printf("解は%f です。\n", x1); exit(0); } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); if (D == 0.0) { printf("解は %f です。\n", x1); } else { printf("解は %f と %f です。¥n", x1, x2); } } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); printf("解は%.2f+%.2fi と%.2f-%.2fi \n", r1, r2, r1, r2); } } return 0; }

  • C言語でまったくわからないところがあります。

    C言語でまったくわからないところがあります。 配列を格納して、その中の最小値をA[9]と入れ替える動作がしたいのですが、 #include<stdio.h> int main(void) { double A[10],min,tmp; int i; for(i=0;i<=9;i++) { printf("A[%d]=",i); scanf("%lf",&A[i]); } printf("\n"); min=A[0]; for(i=0;i<=9;i++) { if(A[i]<min) { min=A[i]; } } tmp=A[i]; A[i]=A[9]; A[9]=tmp; for(i=0;i<=9;i++) { printf("A[%d]=%.0lf\n",i,A[i]); } return 0; } これを実行すると、A[9]=最小値にはなるのですが、A[i]はそのまま入れ替わらないのです。 誰か、どのように直せばよいか、教えていただけないでしょうか。よろしくお願いします。

  • C言語についての質問です

    プログラミング初心者です if関数を使用して二次方程式の解を解くプログムを作成したのですが、この作成した関数をユーザー定義関数を使用しmain 関数の中でユーザー定義関数を呼び出すことにより、 2次方程式の解を求めるプログラムへ変更したいのですが、どのように行えばいいのか分かりません… 私が作成したプログラムはこのようなものになっています #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りとなる。\n"); if (a == 0.0) { if (b == 0.0) { printf("係数がおかしい\n"); exit(-1); } { x1 = -c / b; printf("解は%f です。\n", x1); exit(0); } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); if (D == 0.0) { printf("解は %f です。\n", x1); } else { printf("解は %f と %f です。¥n", x1, x2); } } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); printf("解は%.2f+%.2fi と%.2f-%.2fi \n", r1, r2, r1, r2); } } return 0; } よろしくお願いいたします

  • 初めてのC言語 

    半径rで円周をだすプログラムを作りたいのですが作ってみたところ答えが0.00しかでてきません。 どこが間違っているのでしょうか。 #include <stdio.h> #define PI 3.14159265358979 /* 円周率 */ int main(void) { double r,a; printf("r="); scanf("%lf",&r); a=r*2*PI; printf("r*2*PI=%5.2lf\n",a); return 0; }

  • 行列のC言語プログラム

    行列を使ったC言語のプログラムの作成をしようとしているのですが、 最初で躓いてしまっています。次に内容を出すので何がダメなのか教えて下さい。 行列A=0 0 0 0      1 -2 0 0      0 0 0 -0.0201      0 0 1 -2.01005 #include<stdio.h> #include<math.h> void main(void){ double a[4][4]={{0,0,0,0},{1,-2,0.0},{0,0,0,-0.0201},{0,0,1,-2.01005}}; double det=0.0; det=a[2][1]*a[2][2]*a[4][3]; printf("%f\n",det); scanf("%lf",&det); } 確認用の計算で、1*-2*1=-2という結果になると思ったのですが、 実行すると表示される値が「0」でした。 箇所の指定も行列の内容も多分間違ってないと思え、どこに問題があるのかわかりません。 後、デバックによる出力の際に画面が一瞬出てすぐに消えるんですがそれについても 分かるならお願いします。(とりあえず最後にscanfを入れて凌げるのでついででいいです。)

  • C言語のプログラム

    今授業でCの勉強をしているのですが。以下のプログラムはどうして 計算されないのかがわかりません。型上げされて表示されるのかなと思ったのですが。。まだ初歩の段階ですがよろしくおねがいします。 #include <stdio.h> int main(void) { int vx; double vy; puts("ふたつの数を入力してください"); printf("実数vx"); scanf("%d",&vx); printf("実数vy"); scanf("%lf",&vy); printf("vx+vy=%f\n",vx+vy);/*←vx+vyでdouble型として認識されないのでしょうか?以下同様*/ printf("vx-vy=%f\n",vx-vy); printf("vx*vy=%f\n",vx*vy); printf("vx/vy=%f\n",vx/vy); return(0); }

  • c言語についての質問です。

    #include<stdio.h> int main(void){ double a,b; int c; printf("Type two numbers\n"); scanf("%lf",&a); scanf("%lf",&b); printf("Select 1)addition, 2) subtraction, 3)multiplication or 4)division\n"); scanf("%d",&c); switch(c){ case1: printf("%.6f + %.6f = %.6f",a,b,a+b); break; case2: printf("%.6f - %.6f = %.6f",a,b,a-b); break; case3: printf("%.6f * %.6f = %.6f",a,b,a*b); break; case4: printf("%.6f / %.6f = %.6f",a,b,a/b); break; default: printf("Error! Select 1, 2, 3 or 4\n"); break; } return 0; このプログラムをコンパイルして実行しても 正しく動きません。なぜですか?

  • C言語のプログラムについてです。

    円を描くプログラムを作りたいのですが、条件としてpointを使わないでつくらなければなりません。あとそのプログラムについての説明もいるので、合わせて回答お願いします。pointを使うと↓のプログラムです。 #include<stdio.h> #include<math.h> int main(void); int main(void) { double point[2][2]; double r; double pi=3.14159; int i; onenpl(); space(-100.0,-100.0,100.0,100.0); printf("円を描きます\n"); printf("半径を入力してください\n"); scanf("%lf",&r); point[0][0]=r*cos(0.0); point[0][1]=r*sin(0.0); for (i=1;i<360;i=i+1) { point[1][0]=r*cos(pi/180.0*i); point[1][1]=r*sin(pi/180.0*i); line(point[0][0],point[0][1],point[1][0],point[1][1]); point[0][0]=point[1][0]; point[0][1]=point[1][1]; } closepl(); return(0); }

専門家に質問してみよう