• ベストアンサー

基本的なC言語のプログラム

C言語を勉強中です・・・ 0秒から1.0秒まで0.01秒刻みでデータ(s[i])を配列から表示させていく簡単なプログラムです。 0から0.2までは"30" 0.2から0.4までは"29" 0.4から1.0までは"30"と表示させたいのですが、 全て"30"と表示されてしまいます。 配列の仕方が悪いのでしょうか?? すごく基本的な質問かもしれませんが、どなたか分かる方、よろしくお願いします。 #include <stdio.h> #include <math.h> #define number0 (100) #define h (0.01) #define f1 (30.0) #define f2 (29.0) void main(void){ double s[number0]={0}; int i; double t; for(i=0; i<number0; i++){ t=h*i; if(0<=i<20){ s[i]=f1; } else { if (20<=i<40){ s[i]=f2; } else { s[i]=f1; } } printf("%g %g\n",t,s[i]); } }

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 条件式には、複数の条件を一度に指定はできません。 複数の条件式を指定するには、&& (and), || (or) を使います。 「if (20 <= i < 40)」と記述している部分を、 「if ((20 <= i) && (i < 40)) のように記述して下さい。 (内側の括弧は必須ではありませんが、上記のようにすると ミスが少なくなります。) georgia さんのプログラム (部分) をもう少し分かりやすく書くと 以下のようになります。 プログラム1, 2 共同じ結果が得られます。 参考にして下さい。 ------------------------------------- プログラム1 for (i = 0; i < number0; i++) {  t=h*i;  if (i < 20) {   s[i]=f1;  } else if (i < 40) {   s[i]=f2;  } else {   s[i]=f1;  }  printf("%g %g\n",t,s[i]); } ------------------------------------- プログラム2 for (i = 0; i < number0; i++) {  t=h*i;  s[i] = ((i < 20) || (i >= 40)) ? (f1) : (f2);  printf("%g %g\n",t,s[i]); } -------------------------------------

georgia
質問者

お礼

めちゃめちゃ分かりやすかったです!! 簡単なプログラムだったんですが、とっても困っていたので相当助かりました!! 本当にありがとうございました!! C言語の勉強頑張ります・・・

その他の回答 (1)

noname#30727
noname#30727
回答No.1

>if(0<=i<20){ この書き方だと意図したものになりません。 if (0 <= i && i < 20) { というように書きます。

georgia
質問者

お礼

あ、本当ですね!! 訂正したらプログラムちゃんと動きました!!本当にありがとうございました!!

関連するQ&A

  • プログラミング言語Cの演習

    以下のようにプログラミングをしてコンパイルしても特にエラーは無かったのですが・・・、実行しようとするとセグメンテーション違反になってしまいます。誰か分かる方がいたら解答かアドバイス欲しいです。 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXOP 100 #define NUMBER '0' #define MAXVAL 100 #define BUFSIZE 100 int getop(char s[]); int getch(void); void ungetch(int c); void push(double f); double pop(void); int sp = 0; double val[MAXVAL]; char buf[BUFSIZE]; int bufp = 0; main() { int type; double op2; char s[MAXOP]; while ((type = getop(s)) != EOF) { switch (type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '/': op2 = pop(); if (op2 != 0.0) push(pop() / op2); else printf("error: zero divisor\n"); break; case '%': op2 = pop(); if (op2 != 0.0) push(fmod(pop(), op2)); else printf("error: zero divisor\n"); break; case '\n': printf("\t%.8g\n", pop()); break; default: printf("error: unknown command %s\n", s); break; } } return 0; } int getop(char s[]) { int c, rc; float f; while ((rc = scanf("%c", &c)) != EOF) if ((s[0] = c) != ' ' && c != '\t') break; s[1] = '\0'; if (rc == EOF) return EOF; else if (!isdigit(c) && c != '.') return c; ungetc(c, stdin); scanf("%f", &f); sprintf(s, "%f", f); return NUMBER; } void push(double f) { if (sp < MAXVAL) val[sp++] = f; else printf("error: stack full, can't push %g\n", f); } double pop(void) { if (sp > 0) return val[--sp]; else { printf("error: stack empty\n"); return 0.0; } } int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= BUFSIZE) printf("ungetch: too many characters\n"); else buf[bufp++] = c; }

  • C言語のプログラムをエクセルに書き込む方法

    C言語のプログラムをエクセルに書き込みたいのですが、自分が理解していないのか、上手にできません。 前、質問(No.421727)して、教えてもらったのですがソートプログラムの実行結果もおかしい感じです。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 void filewrite(int j,int i,int a[]); void main(void){ int min,s,t,i,j,k,a[N]; srand((unsigned int)time(NULL)); for(i=0;i<N;i++) a[i]=rand()%1000+1; for(j=0;j<i-1;j++){ min=a[j]; s=j; for(k=j+1;k<i;k++){ if(a[k]<min){ min=a[k]; s=k; } } t=a[j];a[j]=a[s];a[s]=t; if(j%100 == 99){ for(s=0;s<i;s++) printf("%d\t",a[s]); } filewrite(j,i,a); } } void filewrite(int j,int i,int a[]) { int s; FILE *fp; char name[15]; printf("\nfilename="); scanf("%s",name); if((fp=fopen(name,"w"))==NULL){ printf("\nCan't open the sourse file\n"); exit(1); } if(j%100 == 99){ for(s=0;s<i;s++) fprintf(fp,"%d\n",a[s]); fclose(fp); } } よろしくお願いします。

  • C言語 ポインタのポインタ

    失礼します。現在ある確保したメモリに対してCSVから得た値を配列として入れていきたいのですが、うまくいきません。エラーとしてはコマンドプロンプトに何も表示がされていない状態です。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include<string.h> int main(void) { FILE *fp; double *fname = "./testfile.csv"; int i = 0; double **p; p = (double *)malloc(1000); //1000個のdouble(11行分) for (i = 0; i < 11; i++) { //行の先頭要素にアクセスして1000個のメモリを確保 p[i] = malloc(1000 * sizeof(double)); } fp = fopen(fname, "r"); if (fp == NULL) { printf("%sファイルが開けません¥n", fname); return -1; } double c; int column = 0; int row = 0; while ((c = fgetc(fp)) != EOF) { if (c == ',') { column++; //putchar('\n'); } else if (c == '\n') { row++; column = 0; //putchar('\n'); } else { p[row][column] = c; } } printf("%1f", p[0][1]); free(p); fclose(fp); return 0; } 何卒よろしくお願いします。 CSVの内容は、 gagdgj,gasgag,fgdagg fgaafgaf,gfaggfag,gfagd といった形です。 通報する

  • C言語プログラム

    2つの整数を入力させ、それらが等しい場合hitoshii、異なる場合にはhitoshikunaiと出力するプログラムを作りたいのですが、うまくいきません。間違っているところを教えてください。 #include<stdio.h> #include<conio.h> void main() { printf("整数を入力してください:"); int number1; scanf("%d",number1); printf("整数を入力してください:"); int number2; scanf("%d",number2); if(number1==number2) { printf("hitoshii"); } else { printf("hitoshikunai"); } getch(); }

  • C言語プログラムについて

    wikipediaのコムソートを参考に、次のように作りました。 動きますでしょうか。動かなければ、どこをどのようにすればよいか教えていただけませんでしょうか。 プログラム「#include<stdio.h> #include<string.h> void combsort(void); void swap(void); int main(void) { combsort(); swap(); printf("データ%dの並べ替え結果は、\n%d\nです。\n"data2,data); return 0; } void combsort(){ int h,swaps,data,len,data2; printf("ソートさせる数を入力。>\n"); scanf("%d",&data); data2 = data; len = strlen(data); h = len * 10 / 13; while(true){ swapa = 0; for(i = 0;i + h <len;i++) { if(data(i) > data(i + h)) { swap(data, i, i + h); swaps +=1; } } if(h==1){ if(swaps==0){ break; } } else{ h = h * 10 / 13; } } } void swap{ int a,i,j; const int t = a[i]; a[i] = a[j]; a[j] = t; } 」 data:scanfによって入力される並べ替えを行う数値(例:0219523056810)を代入。 data2:dataのコピーで、並べ替えを行う前のデータを保管しておくもの。 また、これの反対(これが、昇順なら、降順。降順なら、昇順。)を同じようにしたいと思います。(combsort2にて)どうすればよいでしょうか。 教えていただけませんでしょうか。 お早めのご回答お待ちしております。

  • 代入されません(C言語)

    こんにちは。 早速質問させていただきます。 申し訳ありませんが、問題の概要など話し始めるととても時間がかかってしまう為省略させていただきます。 下記のプログラムなのですが(私はプロではないため醜いプログラムですがご了承ください)、 #include <stdio.h> int num[8][5] = {{0,0,0,0,0},{0,0,1,0,0},{0,1,0,0,0},{0,1,1,0,0}, {1,0,0,0,0},{1,0,1,0,1},{1,1,0,1,0},{1,1,1,0,0}}; int ic = 0; int i=0, j=0; int id=0;//IDナンバー int m0=0, m1=0, m2=0; //中間層 int z0=0, z1=0; int t0=0, t1=0; double s0=0,s1=0; //総和 double w00=0, w01=0, w02=0, w10=0, w11=0, w12=0;//重み double sikii0=1, sikii1=1; //しきい値(θ) θ0とθ1 int t; //正解 double hoge = 0.1; double mm0, mm1, mm2; //p2. 4)学習 で使用 //プロトタイプ宣言 void input(void); void tyukan(void); void souwa(void); //総和 void hantei(void); void seikai(void); void omomi1(void); void omomi2(void); main(){ while(ic<70){ if(id > 7){ id=0; i=0; j=0; } getchar(); printf("IC = %d ID = %d\n", ic, id); input(); tyukan(); souwa(); hantei(); seikai(); if(z0 != t0) omomi1(); else if(z1 != t1) omomi2(); i++; ic++; id++; } return 0; } void input(){ printf("入力データ M=%d A=%d B=%d\n", num[i][j], num[i][j+1], num[i][j+2]); } void tyukan(){ if(id == 0){ m0=0; m1=0; m2=0; mm0=0; mm1=0; mm2=0; s0=0; s1=0; } m0=num[i][0]+num[i][1]+num[i][2]; m1=num[i][0]+num[i][1]; m2=num[i][0]+num[i][2]; //中間層m0m1m2に代入 mm0 = (double)m0; mm1 = (double)m1; mm2 = (double)m2; printf("中間層 m0=%d m1=%d m2=%d \n", num[i][0]+num[i][1]+num[i][2], num[i][0]+num[i][1], num[i][0]+num[i][2]); } void souwa(void){ printf("総和 s0=%f s1=%f\n",(double)m0*w00 + (double)m1*w01 + (double)m1*w02, (double)m0*w10 + (double)m1*w11 + (double)m2*w12); } //*****関数判定***************************************** void hantei(void){ printf("判定は "); if(s0 >= sikii0){ printf("z0 = 1 "); z0=1; } else{ printf("z0 = 0 "); z0=0; } if(s1 >= sikii1){ printf("z1 = 1\n"); z1=1; } else{ printf("z1 = 0\n"); z0=0; printf("sikii1 %f\n",sikii1); printf("sikii0 %f\n",sikii0); } } void seikai(void){ printf("正解は "); printf("t0 = %d t1 = %d\n", num[id][3], num[id][4]); t0=num[id][3]; t1=num[id][4]; } void omomi1(void){ if(z0 == 0 && t0 == 1){ w00 = w00 + (hoge*mm0); w01 = w01 + (hoge*mm1); w02 = w02 + (hoge*mm2); sikii0 = sikii0-hoge; printf("重み変更 00 %f\n重み変更 01 %f\n重み変更 02 %f\n", w00, w01, w02); printf("閾値 %f\n", sikii0); } else if(z0 == 1 && t0 == 0){ w00 = w00 - (hoge*mm0); w01 = w01 - (hoge*mm1); w02 = w02 - (hoge*mm2); sikii0 = sikii0+hoge; printf("重み変更 00 %f\n重み変更 01 %f\n重み変更 02 %f\n", w00, w01, w02); printf("閾値 %f\n", sikii0); } } void omomi2(void){ if(z1 == 0 && t1 == 1){ w10 = w10 + (hoge*mm0); w11 = w11 + (hoge*mm1); w12 = w12 + (hoge*mm2); sikii1 = sikii1-hoge; printf("重み変更 10 %f\n重み変更 11 %f\n重み変更 12 %f\n", w10, w11, w12); printf("閾値 %f\n", sikii1); } else if(z1 == 1 && t1 == 0){ w10 = w10 - (hoge*mm0); w11 = w11 - (hoge*mm1); w12 = w12 - (hoge*mm2); sikii1 = sikii1+hoge; printf("重み変更 10 %f\n重み変更 11 %f\n重み変更 12 %f\n", w10, w11, w12); printf("閾値 %f\n", sikii1); } } 問題はこのプログラムがID7になった時に発生します。 関数hanteiの部分で s0 >= sikii0とs1 >= sikii1がそれぞれ真だったらz0(またはz1)に1を代入するように 作ったのですが、 IC=7 ID=7の部分では,s0が1.20でsikii0が0.9(s0>=sikii0)にもかかわらず z0に1が代入されません(s1とsikii1も同様)。 いろいろ考えてみましたが、原因が分かりませんでした。 どなたかよろしくお願いします。

  • c言語でDFTのプログラムを作成したのですが

    c言語でDFTのプログラムを作成しました。 以下にソースを載せます。 #include<stdio.h> #include<math.h> #include<stdlib.h> #include<time.h> #define PI 3.141592653589793 #define N 64 //データ数 DFT(double result[]){ int i,k; double A[N],B[N],T=0; //A[N]:実数部,B[N]:虚数部 double a,b; for(k=0;k<N;++k){ a=b=0; for(i=0;i<N;++i){ a=a+result[i]*cos(2*PI*i*k/N);      b=b+(-1.0)*result[i]*sin(2*PI*i*k/N); } A[k]=a/N; B[k]=b/N; } for(i=0;i<N;++i){ printf("[%f秒]:Re:%f,Im:%f\n",T,A[i],B[i]); //変換後の値を表示 T=T+(0.1/N); } } main(){ int i; double T=0; double Sampdata; double result[N]; for(i=0;i<N;++i){ Sampdata=5*sin(20*PI*T);      //0~0.1秒間をN個にサンプリング result[i]=Sampdata; //サンプリングデータを代入 T=T+(0.1/N); } clock_t start,end; //処理時間計測開始 start=clock(); DFT(result); end=clock(); printf("%.2f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC); //処理時間表示 } 元信号には5sin(20πt)の値を入れています。この信号は周期は0.1secです。 これでフーリエ変換を行うとデータ数N/2を中心に対称なデータが出てくるのですが、処理が終わるのが早い気がするんです。 例えば2^15個のデータで実行しても2分もかからずに処理が終わってしまいます。一応、対称性が出てるとはいえ、終わるのが早すぎる気がするのですが、おかしい所があれば教えていただけると嬉しいです。 よろしくお願いします。

  • C言語プログラミングについて

    「要素数10の配列を準備する。 配列の各要素に0.0~1.0の乱数を入れる。 各配列に入力された乱数を出力する。 配列をオリジナル関数hanteiに渡す。 数hantei内において,各要素の値が0.5以上であれば1 , 0.5未満であれば0を出力する。」 C言語でこのような問題があるのですがどのように作ればよろしいのでしょうか? ちなみに以下のように作ってみて、「argcは一度も使用されていない」「argvは一度も使用されていない」とエラー(警告)が出てしまいました。修正、もしくは正しいプログラムを教えてくれませんか? #include <stdio.h> #include <time.h> #include <stdlib.h> #define SIZE 10 int hantei(double num) { return num>=0.5; } int main(int argc,char *argv[]) { double number[SIZE]; int i; srand((unsigned)time(NULL)); for(i=0;i<SIZE;i++) number[i]=(double)rand() / RAND_MAX; //手抜き乱数 for(i=0;i<SIZE;i++) { printf("%f %d\n",number[i], hantei(number[i])); } return 0; }

  • C言語の添削

    「C言語基礎課題1」 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <tchar.h> #include <ctype.h>                                       #include <string.h> #define MAX 100 /*点数*/ int flag; double avg(double t[],int n); int str_check(char s[]);                                        int main() { int number; //人数 double score[MAX]; //点数 char temp[MAX]; char str[MAX]; //名前 double ans; //平均成績 int i=0; //カウンタ変数 //人数の決める printf("人数を入力して下さい。\n"); scanf("%d",&number); //名前の入力 for(i=0;i<number;i++) { printf("%d番様の名前を入力して下さい。\n",i+1); scanf("%s",&str[i]); } //点数の入力 for(i=0;i<number;i++) { printf("%d番様の点数を入力して下さい。\n",i+1); scanf("%s",&temp); str_check(temp); if(flag==1) { score[i]=atoi(temp); //点数入力で有効範囲をチェック if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } if(flag==0) { printf("点数を数字で入力して下さい。\n"); i--; } } ans =avg(score,number); printf("\n=====入力内容一覧と成績平均値======\n"); for(i=0;i<number;i++) { printf("%d番の点数は%3.2lfです。\n",i+1,score[i]); } printf("平均点は%3.2lfです。\n",ans); printf("=====================================\n"); getch(); return 0; } /*avg関数の定義*/ double avg(double t[],int n) { int i; double sum; sum = 0.0; for(i=0;i<n;i++) { sum += t[i]; } return sum/n; } /*点数入力で文字か数字かチェック*/ int str_check(char s[]) { int i=0,n; //カウンタ変数 n=strlen(s); while(s!='\0') { if(s[i]>='0'&&s[i]<='9'||s[i]=='.') { i++; } else { break; } } if(i==n) { flag=1; } else { flag=0; } return flag; } [最初に組んだソースプログラム] #include<stdio.h> #include<stdio.h> #define NUM 3 /*点数*/ #define Name 3 /*人数*/ #include<conio.h> double avg(int t[]); struct stList{ char str[Name][100]; int score[NUM]; int i,j; }; int main(void) { int score[NUM]; //char str[Name]; char str[100]; int i,j; double ans; printf("名前を入力して下さい。\n",Name); for(i=0;i<Name;i++){ scanf("%s",&str[Name]); } // if(score[NUM]=0 || score[NUM]<=100) //{ // printf("点数を入力して下さい。\n",NUM); //} printf("点数を入力して下さい。\n",NUM); for(i=0;i<NUM;i++) { scanf("%d",&score[i]); if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } for(j=0;j<NUM;j++){ printf("%d番目の人の点数は%dです。\n",j+1,score[j]); } ans =avg(score); printf("平均点は%3.2lfです。\n",ans); getch(); return 0; } /* avg関数の定義 */ double avg(int t[]) { int i; double sum; sum = 0.0; for(i=0;i<3;i++){ sum += t[i]; } return sum/Name; } 「一人分のデータを保持する構造体(文字列と整数の変数をメンバに持つ)を用意し、3人分の名前と成績 (最大値100、最小値0)を入力でき、入力が終了したら、入力内容一覧と成績の平均値を表示する プログラムを作成せよ。 ※考えうる限りの異常系処理の導入、関数化を行うこと。」 研修で以下の指摘を受けました。 (1)compare関数が使われていない。 (2)名前入れる変数が3つ不明 (3)カウンタ変数がi,j,s,tになっている理由は? (4)名前を入力しなかった時の処理 (5)点数を処理しなかった時の処理 (6)定数NUMで人数3を指定できるようにしているのにプログラムはそれを利用仕切れていない(名前入力が固定3人)ので無意味 (7)if(tmp=0 || tmp<=100)←これなんでしょうか? (8)平均点表示の少数点以下有効桁数はどうなっているのか? (9)点数入力で文字を入れたときの処理 (10)点数入力で有効範囲外の数字を入れた時の処理 ちなみに最大値、最小値はdefineして欲しいです。理由は(2)に読めば分かる (11)変数名が謎なのが多い 課題のキーワードのどこにも出て来ないですし言葉だから 後、添付ファイルを添付します。 最初のソースプログラム名「最初に組んだもの」修正したものが「C言語基礎課題1」と名付けています。 いづれのソースプログラムも構造体を用意出来てないように思うのですがいかかですか?

  • C言語プログラムエラーについて

    構造体とポインタを使って関数電卓のプログラムを作ってコンパイルしたのですがひとつだけエラーがでて困っています。親切な方回答よろしくお願いします。 ソースコード↓ #include<stdio.h> #include<string.h> #include<math.h> int main(void) { int i; double result; char inp_buf[30]; double input_d; typedef struct{ char*f_name; double(*func)(double); }FUNC_TBL; FUNC_TBL f_tbl[] = { { "sin",sin }, { "cos",cos }, { "tan",tan }, { "exp",exp }, }; printf( ">" ); scanf( "%s %lf", inp_buf, &input_d); for( i=0;i< sizeof(f_tbl)/sizeof(FUNC_TBL);i++) { if(!strcmp(f_tbl[i],f_name,inp_buf)) { 29行目→ result = f_tbl[i],func(input_d); } } printf("%lf\n",result); return 0; } エラーメッセージ↓ (29):error C2440:`=`:`FUNC_TBL`から`double`に変換できません。

専門家に質問してみよう