人に聞けない痔の悩み、これでスッキリ >>

データファイルから全体の人数、英、数、理の3科目得点を読み取る
各自の3科目合計を求める
全体の合計、平均点を英、数、理、合計について求める
3科目合計点について標準偏差を求める
データは50人分以上作成
[出力結果に入れるもの]
(1)各自の英数理3科目の合計得点および(2)英語偏差値、(3)数学偏差値(4)理科偏差値(5)3科目合計偏差値
(6)全体の英語平均点(7)数学平均点(8)理科平均点(9)3科目平均点および(10)英語標準偏差(11)数学標準偏差(12)理科標準偏差(13)3科目標準偏差
(14)全体の人数
参考2
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int e[50],m[50],s[50],a[50];
int i,n,esum=0,msum=0,ssum=0,asum;
float emean,mmean,smean,amean;
printf("人数を入力せよ\n");
scanf("%d",&n);
while(n!=0){
for(i=1;i<=n;i=i+1){
printf("英語,数学,理科の点数を入力せよ\n");
scanf("%d,%d,%d",&e[i],&m[i],&s[i]);
a[i]=e[i]+m[i]+s[i];
esum=esum+e[i];
msum=msum+m[i];
ssum=ssum+s[i];
}
asum=esum+msum+ssum;
emean=(float)esum/(float)n;
mmean=(float)msum/(float)n;
smean=(float)ssum/(float)n;
amean=(float)asum/(float)n;
printf("\n 番号 英語 数学 理科 合計\n");
printf("---------------------------\n");
for(i=0;i<=n;i++){
printf("%3d %4d %4d %4d %4d\n",i,e[i],m[i],s[i],a[i]);
}
printf("---------------------------\n");
printf("平均 %4.1f %4.1 %4.1 %5.2f\n",emean,mmean,smean,amean);
printf("---------------------------\n");
}
return 0;
}
どなたか教えてください。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

参考URLにあるような式をCに翻訳するだけなんですけど


そこでひっかかってるんでしょうか?

合計と平均は求められているっぽいから、その平均を使って
こんどは分散を求め、その平方根をとると標準偏差が得られます。

各自の偏差値は、さらにこの標準偏差と平均点を使うと。

参考URL:http://tokyo.cool.ne.jp/kanain/APIHTM/Hensa.htm
    • good
    • 0

課題文のまんまなんですよね?


どこがわからないのか、書いてないですが…。

もしかして、全部解けということですか?
丸写しして学校にもっていくんでしょうか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

Q標準偏差・分散

標準偏差と分散を求めるプログラムで

#include <stdio.h>
#include <math.h>

int main(void){
int i;
double data[10];
double heikin, total = 0.0, variance = 0.0, deviation = 0.0;

for ( i = 0; i < 10; i++ ){

printf("%d番目の値を入力:",i + 1);
scanf( "%lf",&data[i] );
total += data[i];
}

heikin = total / 10.0;

for(i = 0; i < 10; i++ ){

variance += ((data[i]-heikin)*(data[i] - heikin))/10.0;
}
deviation += sqrt(variance); printf("平均値は%f\n" , heikin );
printf("分散は%fです。\n",variance);
printf("標準偏差は%fです\n",deviation);


getchar();
getchar();
return(0);
}
という感じでいいのでしょうか?
分散と標準偏差の式はこれであっているとおもうのですが・・・・。

標準偏差と分散を求めるプログラムで

#include <stdio.h>
#include <math.h>

int main(void){
int i;
double data[10];
double heikin, total = 0.0, variance = 0.0, deviation = 0.0;

for ( i = 0; i < 10; i++ ){

printf("%d番目の値を入力:",i + 1);
scanf( "%lf",&data[i] );
total += data[i];
}

heikin = total / 10.0;

for(i = 0; i < 10; i++ ){

variance += ((data[i]-heikin)*(data[i] - heikin))/10.0;
}
deviation += sqrt(variance); printf("平均値は%f\n"...続きを読む

Aベストアンサー

ん, そんなところ.
あとは気分の問題ですが, 「無駄だ」と思っても, variance を 0 クリアするコードを (variance を積算する) for の前に入れた方がよいかも.

Qc言語 成績表示のプログラムです。

c言語初心者です。課題で出た問題で、生徒の人数、その後出席番号と点数を入れ、ソートしてから表示するプログラムなのですが、人数分打ち終わったあとにセグメンテーション違反になります。添削とともになぜそうなるのか教えてもらえると幸いです。

include <stdio.h>
#define MAXDATA 10000
main()
{
int stnum[MAXDATA],point[MAXDATA],mem;
int n,j,k,i,tmp,tmps;

printf("生徒数を入力してください。");
scanf("%d",&mem);
if(mem<=0){
do{
printf("もう一度生徒数を入力してください。");
scanf("%d", &mem);
}while(mem<=0);
}
for(i=0;i<mem;i++){
printf("%d人目の生徒の点数を入力してください。\n",i+1);
scanf("%d", &(point[i]));
printf("%d人目の出席番号を数字で入力してください。\n",i+1);
scanf("%d", &(stnum[i]));
}
for(i=0;i<mem-1;i++){
j=i;
}
for(k=i+1;k<mem;k++){
if(point[j]>point[k]){j=k;}
}
tmp=point[j];
point[j]=point[i];
point[i]=tmp;

for(k=i+1;k<mem;k++){
if(stnum[j]>stnum[i]){j=k;}
}
tmps=stnum[j];
stnum[j]=stnum[i];
stnum[i]=tmps;

for(i=0;i<mem;i++){
printf("%d番の点数は%d点です。", stnum[n],point[n]);
}
}

c言語初心者です。課題で出た問題で、生徒の人数、その後出席番号と点数を入れ、ソートしてから表示するプログラムなのですが、人数分打ち終わったあとにセグメンテーション違反になります。添削とともになぜそうなるのか教えてもらえると幸いです。

include <stdio.h>
#define MAXDATA 10000
main()
{
int stnum[MAXDATA],point[MAXDATA],mem;
int n,j,k,i,tmp,tmps;

printf("生徒数を入力してください。");
scanf("%d",&mem);
if(mem<=0){
do{
printf("もう一度生徒数を入力してください...続きを読む

Aベストアンサー

#3です。#5さんのコードでも解決しないとのことなのであなたのコードにprintfを少々つけたコードを載せますので実行してください。
手入力が面倒なので使っていたNOINPUTFLAGを放置してます。"#define NOINPUTFLAG 1"にすれば適当に値をぶち込みます。
#if~#endifの部分はNOINPUTFLAGが0の時コンパイル時にあなたのコードと全く同じになるので変化はありません。

今後も何かエラーが出る場合はprintfなどで自分が何をしているのか確認してください。

/////////////////////////////////////////////
#include <stdio.h>
#define MAXDATA 10000
#define NOINPUTFLAG 0

//main()の型はintなのでそう宣言する
int main()
{
int stnum[MAXDATA],point[MAXDATA],mem;
int n,j,k,i,tmp,tmps;
printf("生徒数に1または10000を超える値を入れるとエラーになります\nもちろん数字以外の値もダメです\n");
//バッファオーバーフローですので場合によっては検知できません、1の方はjの初期化に注目
printf("生徒数を入力してください。");
scanf("%d",&mem);
if(mem<=0){
do{
printf("もう一度生徒数を入力してください。");
scanf("%d", &mem);
}while(mem<=0);
}
for(i=0;i<mem;i++){

//NOINPUTFLAGが0のとき何も変化はありません
#if NOINPUTFLAG
point[i]=i;
stnum[i]=i;
#else
printf("%d人目の生徒の点数を入力してください。\n",i+1);
scanf("%d", &(point[i]));
printf("%d人目の出席番号を数字で入力してください。\n",i+1);
scanf("%d", &(stnum[i]));
#endif

}

//NOINPUTFLAGが0のとき何も変化はありません
#if NOINPUTFLAG
printf("入力は省略しました\n");
#endif

for(i=0;i<mem-1;i++){
j=i;
}
printf("この時点でi=%d, j=%d, k=undefined。でもまだ配列にアクセスなし\n",i,j);
for(k=i+1;k<mem;k++){
if(point[j]>point[k]){j=k;}
}
printf("i+1(=%d)とmem(=%d)の大小を比べるとバブルソートを意図したと思われる処理は・・・ できたとしてもpoint[%d]は値が与えられてたっけ?\n",i+1,mem,i+1);
tmp=point[j];
point[j]=point[i];
point[i]=tmp;
printf("point[%d]とpoint[%d]を入れ替えました\n",i,j);

for(k=i+1;k<mem;k++){
if(stnum[j]>stnum[i]){j=k;}
}
printf("同じく。\ni+1(=%d)とmem(=%d)の大小を比べるとバブルソートを意図したと思われる処理は・・・\n",i+1,mem);
tmps=stnum[j];
stnum[j]=stnum[i];
stnum[i]=tmps;
printf("stnum[%d]とstnum[%d]を入れ替えました\n",i,j);

for(i=0;i<mem;i++){
printf("%d番の点数は%d点です。", stnum[i],point[i]);//改変:nはiだとのことだったので
}
return 0;//int型の返り値
}

#3です。#5さんのコードでも解決しないとのことなのであなたのコードにprintfを少々つけたコードを載せますので実行してください。
手入力が面倒なので使っていたNOINPUTFLAGを放置してます。"#define NOINPUTFLAG 1"にすれば適当に値をぶち込みます。
#if~#endifの部分はNOINPUTFLAGが0の時コンパイル時にあなたのコードと全く同じになるので変化はありません。

今後も何かエラーが出る場合はprintfなどで自分が何をしているのか確認してください。

/////////////////////////////////////////////
#include <...続きを読む

Q最大値と最小値を表示したいのですが・・・

double numに入っている数字から最大値と最小値を求めたいのですが、このままだと両方とも1.000になってしまうんです・・・
どうやったらちゃんと最大値と最小値が表示されるのでしょうか??
初心者なものでスイマセンが教えてください!!


#include<stdio.h>

int main(void)
{
int i,j;
double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0};
double max,min;

for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(num[i]>num[j])
max=num[i];
}
}

for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(num[i]<num[j])
min=num[i];
}
}
printf("最大値は%fです。",max);
printf("最小値は%fです。",min);

return 0;
}

double numに入っている数字から最大値と最小値を求めたいのですが、このままだと両方とも1.000になってしまうんです・・・
どうやったらちゃんと最大値と最小値が表示されるのでしょうか??
初心者なものでスイマセンが教えてください!!


#include<stdio.h>

int main(void)
{
int i,j;
double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0};
double max,min;

for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(num[i]>num[j])
max=num[i];
}
}

for(i=0; i<10;...続きを読む

Aベストアンサー

なぜforループが2重になっているのかよくわかりませんが、
考え方として、
・とりあえず配列の最初の値を暫定の最大値としてセットする
・forループで配列を調べていき、配列の値が暫定の最大値より大きな場合、それを暫定の最大値とする。
・forループを抜けると、暫定の最大値は暫定ではなく、その配列の最大値となっている。
という流れが普通のやり方です。

以上を踏まえてコーディングを手直しすると、以下のようになります。

#include<stdio.h>

int main(void)
{
int i;
double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0};
double max,min;

max=num[0];
for(i=0; i<10; i++)
{
if(num[i]>max)
max=num[i];
}

min=num[0]
for(i=0; i<10; i++)
{
if(num[i]<min)
min=num[i];
}

printf("最大値は%fです。",max);
printf("最小値は%fです。",min);

return 0;
}

なぜforループが2重になっているのかよくわかりませんが、
考え方として、
・とりあえず配列の最初の値を暫定の最大値としてセットする
・forループで配列を調べていき、配列の値が暫定の最大値より大きな場合、それを暫定の最大値とする。
・forループを抜けると、暫定の最大値は暫定ではなく、その配列の最大値となっている。
という流れが普通のやり方です。

以上を踏まえてコーディングを手直しすると、以下のようになります。

#include<stdio.h>

int main(void)
{
int i;
double num[]={4....続きを読む

QC言語で構造体のメンバを簡単に出力する方法ありますか?

いつもお世話になっています。

C言語の質問です。
単体テストログを取るために、
“関数Aをコールする前後で、関数Aに引数として渡す構造体のメンバをすべて”printf(もしくはfprintf)で出力して比較確認しなければならないのですが、

構造体のメンバが250とか、150とかあり、メンバ名もxxx_01,xxx_02などのようにエクセルなどで簡単に加工して作れるものではないので、いちいちメンバ名を指定しなければならないのでとても大変です。

オブジェクト指向言語なら、for each文とかでオブジェクトのメンバを簡単に取り出せるのでしょうが(間違っているかもしれません・・・)、C言語で構造体のメンバを、for文などのループを使って簡単に出力できる方法はないでしょうか?

メンバの型は、一定ではなく、char、int、double、別の構造体のポインタ型(これは出力しなくて良い)と混在しています。メンバが全て同一の型ならポインタで構造体の先頭アドレスからsizeof(メンバの型)の分インクリメントしていけば出力できそうな気もしますが、メモリ上に連続して確保されるのかも私にはわからないので困っています。

enumで列挙して・・・というのも調べてみましたが、応用は出来ないようでした。

どなたか、地道にメンバ名を書いて出力する以外の方法をご存知の方、いらっしゃいましたらお知恵をお貸しください。
よろしくお願いいたします。
※説明不足の点がありましたら補足いたします。

いつもお世話になっています。

C言語の質問です。
単体テストログを取るために、
“関数Aをコールする前後で、関数Aに引数として渡す構造体のメンバをすべて”printf(もしくはfprintf)で出力して比較確認しなければならないのですが、

構造体のメンバが250とか、150とかあり、メンバ名もxxx_01,xxx_02などのようにエクセルなどで簡単に加工して作れるものではないので、いちいちメンバ名を指定しなければならないのでとても大変です。

オブジェクト指向言語なら、for each文とかでオブジェクトのメンバを...続きを読む

Aベストアンサー

コードを書かないという方向性の提案を一つ。
デバッガに構造体の内容を出力させるというのはどうでしょうか。

struct {
int a;
char *b;
double c;
}
という型を持つ変数xがあったとして、gdbでは下記のような出力が得られます。
(gdb) print x
$1 = {
a = 123,
b = 0x2fd0 "ABC",
c = -9876.5
}

QC言語についてです 5人のテストの点数を入力すると 合計点、平均点、最高点、最低点を 出力するプログ

C言語についてです
5人のテストの点数を入力すると
合計点、平均点、最高点、最低点を
出力するプログラムを作成したいのですが
うまくできませんでした
なぜでしょうか?

Aベストアンサー

> int score[5], goukei,max,min = 0, i;
→ int score, goukei = 0, max = 0, min = 100, i;

> if (max < score[i])
> {
> max = score[i];
> }
→ if (max < score)
→ {
→  max = score;
→ }

> if (min > score[i])
> {
> min = score[i];
> }
→ if (min > score)
→ {
→  min = score;
→ }

Qscanf("%s", buf);でスペースを含んだ文字

コンソールプログラムで
scanf("%s", buf);
を使用してユーザに入力された文字によって処理を行いたいのですが、このままではスペースを含む文字列がスペースの手前で切られてしまいます。
C:\Program Filesなどを入力可能にさせたい場合にはどのようにするのがベターですか?

Aベストアンサー

お任せください!
そもそもscanfを使うというのはお勧めでは
ありません。scanfは文字+改行文字が入力
されないと完了しないためです。
が、それは良しとしましょう。
scanfの書式ですが、

int n = scanf("%[^\r\n]",buf);

という便利な書式があります。
perlでもおなじみの書式ですね。
上記の山文字"^"より前が読み込ませたい文字の集まりで、ハイフン指定が出来ます。
"^"より後ろが読込みを停止させたい文字の集まりです。上記の指定は復帰改行以外の文字が現れるまで読み込みます、という書式です。
下記のような指定も出来ます。

int n = scanf("%[a-zA-Z0-9\\: \t^\r\n]",buf);

なお、戻り値は読み込んだ項目数ですので、
if(n >= 1)
{
}
で判断できますね。

Qファイル出力で改行を入れたい!

data.txtにファイル出力を行うのですが、gets(c)で入力した一語一語に改行を入れてdata.txtに出力したいのですがどうすればよいでしょうか。
返答のほどよろしくお願いいたします。
include<stdio.h>
#define SIZE 20
void main(void)
{
char c[SIZE], *p;
FILE *fp;

fp = fopen("data.txt","w+");
p = c;
while(gets(c) != NULL){
fputs(p,fp);
}

fclose(fp);
printf("data.txtへ出力しました\n");

}

Aベストアンサー

一語一語ってのは、1回の入力毎って事でしょうか?
とするならば、これでどうでしょうか?

#include <stdio.h>
#define SIZE 20
void main(void)
{
  char c[SIZE], *p;
  FILE *fp;
  
  fp = fopen("data.txt","w+");
  p = c;
  while(gets(c) != NULL){
    fputs(p,fp);
    fputc('\n', fp);
  }
  
  fclose(fp);
  printf("data.txtへ出力しました\n");
  
}

Qがあるのにsqrtが・・・

最初にあるプログラムを作っていたのですが、その祭sqrtでエラーが出てしまったので、別にsqrtを使う短いプログラムを作りました。それが以下のものになります。(test3.c)

#include<stdio.h>
#include<math.h>

int main(void){
int atai;
double x=2.0;
atai=(int)sqrt(x);
printf("atai is %c",atai);
}


sqrtが動作するか確かめる為のものです。このプログラム(test3.c)で以下のエラーが出てしまいました。

/tmp/ccqEejZ1.o(.text+0x4d): In function `main':
test3.c: undefined reference to `sqrt'
collect2: ld はステータス 1 で終了しました

ちなみにLinux(Fedora core 4)を使用しています。
初心者ということもありなぜエラーが出るのか分かりません。
ちなみに<math.h>を使用しないプログラムは普通に動作します。
解決方法をご存知の方がいらっしゃいましたらご教授下さいませ。
よろしくお願いします。

最初にあるプログラムを作っていたのですが、その祭sqrtでエラーが出てしまったので、別にsqrtを使う短いプログラムを作りました。それが以下のものになります。(test3.c)

#include<stdio.h>
#include<math.h>

int main(void){
int atai;
double x=2.0;
atai=(int)sqrt(x);
printf("atai is %c",atai);
}


sqrtが動作するか確かめる為のものです。このプログラム(test3.c)で以下のエラーが出てしまいました。

/tmp/ccqEejZ1.o(.text+0x4d): In function `main':
test3.c: undefined r...続きを読む

Aベストアンサー

コンパイルのオプションつけてないとかないですよね?
たとえばTerminalとかだとコンパイル時に 『-lm』とかつけますが

Q平均値を関数を用いて出力したいのですが。。

平均値を関数を用いて出力したいのですが一箇所でつまずいてしまい
ました。ソースは
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/*構造体宣言*/
struct Students{
int N;
int A;
int B;
int C;
double ave;
};

/*平均値を計算する関数*/
struct Students Average(struct Students std[i]){
std[i].ave=(double)(std[i].A+std[i].B+std[i].C)/3;
return std[i];
}

int main(void){
struct Students std[49]; /*構造型配列*/

int i,N,A,B,C,num,scannum;

FILE*file; /*ファイルのポインタを用意*/

srand((unsigned)time(NULL)); /*乱数の初期化/


file=fopen("Data.txt","r"); /*Dataファイルの読み込み*/

/*ファイルのオープンチェック*/
if(file==NULL){
fprintf(stderr,"cannnot open file 'Data.txt'\n");
exit(1);
}
/*Studentsにデータを格納*/
for(i=0;i<=49;i++){
fscanf(file,"%d%d%d",&N,&A,&B);
std[i].N=N;
std[i].A=A;
std[i].B=B;
std[i].C=70+(rand()/(RAND_MAX+1.0)*31);
std[i].ave=Average(std[i]);

/*表示*/
printf("学籍番号:%d.",std[i].N);
printf("科目A:%d.\n",std[i].A);
printf("科目B:%d.\n",std[i].B);
printf("科目C:%d.\n",std[i].C);
printf("平均点:%d.\n",std[i].ave);

fclose(file);

return 0;
}
目標はA,B,Cの平均を出したいのですが関数宣言の際にstd[i]を
用いると未定義扱いになってしまい実行が出来ない状態です。
自分としては↑のソースでi番目の配列の平均値を導出し、表示
させようとしてるのですが。。。。アドバイスをお願いします。
m(__)m

平均値を関数を用いて出力したいのですが一箇所でつまずいてしまい
ました。ソースは
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/*構造体宣言*/
struct Students{
int N;
int A;
int B;
int C;
double ave;
};

/*平均値を計算する関数*/
struct Students Average(struct Students std[i]){
std[i].ave=(double)(std[i].A+std[i].B+std[i].C)/3;
return std[i];
}

int main(void){
struct Students std[49]; /*構造型配列*/

int i,N,A,B,C,num,scannum;
...続きを読む

Aベストアンサー

double Average(struct Students tmp);
{
return (double)(tmp.A+tmp.B+tmp.C)/3;
}

のようにするべきでは?

関数を呼び出すときの引数は値をコピーするための一時的な変数です。

std[i].ave = Average(std[i]);

としてAverage関数を呼び出すときには

struct Students Average(struct Students tmp)
tmp = std[i];
{
return (double)(tmp.A+tmp.B+tmp.C)/3;
}

とちょっと書き方は変になりますが、std[i]という変数を一時的に引数で宣言されている変数にコピーして
関数の中で計算を行いますので、std[i]のように名前が同じである必要がありません。
名前を同じにしても良いのですが、関数の中と外とでは全く違う変数として扱われます。
また、引数として宣言できる変数名は普通の変数宣言と同じ形式ですので
std[i]というような変数名を宣言することはできません。

あと、averageの中身ですが平均値を計算したいのであれば上記のように
平均値を戻り値としないと

std[i].ave=Average(std[i]);

で、型が違うのでエラーがでるのでは?

double Average(struct Students tmp);
{
return (double)(tmp.A+tmp.B+tmp.C)/3;
}

のようにするべきでは?

関数を呼び出すときの引数は値をコピーするための一時的な変数です。

std[i].ave = Average(std[i]);

としてAverage関数を呼び出すときには

struct Students Average(struct Students tmp)
tmp = std[i];
{
return (double)(tmp.A+tmp.B+tmp.C)/3;
}

とちょっと書き方は変になりますが、std[i]という変数を一時的に引数で宣言されている変数にコピーして
関数の中で計算を...続きを読む

Q数字の位ごとの値を表示するプログラム

scanfで入力した数字の位ごとの値を表示するプログラムを作りたいのですがどうしたらいいですか?

例えば1234という数字を入れたら
10の位・・・3
1の位・・・4
という感じです

Aベストアンサー

> 10の位・・・3

1234を10で割って小数点以下を切り捨て。→123.4→123
123を10で割った余りを求める。→3

> 1の位・・・4

1234を1で割って小数点以下を切り捨て。→1234
1234を10で割った余りを求める。→4

とか。


人気Q&Aランキング