質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

6回答

241閲覧

for文あたりで動作が停止する

tmtmmm

総合スコア24

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/05/08 01:59

編集2019/05/08 02:55

前提・実現したいこと

txtファイルからデータを取得し最大のscoreを出したいです。一応、0.5以上差が開いたら、新しい最大値をだしたいのでk++にしています。
変更後のコードです

c

1 2#include<stdio.h> 3#include<stdlib.h> 4 5int max_score[100],max_time[100],k=0,j,i; 6 7struct lv{ 8 float score; 9 float time; 10 struct lv *next; 11}; 12struct lv *add_list(float t,float s ,struct lv *head){ 13 struct lv *new_head; // 宣言 14 new_head = (struct lv *)malloc(sizeof(struct lv)); // 領域確保 15 new_head->time = t;// 新しいデータの代入 16 new_head->score = s;// 新しいデータの代入 17 new_head->next = head; // 古い head を新しい head の次のデータに指定 18 return new_head; 19} 20void max(struct lv *head){ 21 if(head->score>max_score[k]){ 22 max_score[k]=head->score; 23 max_time[k]=head->time; 24 } 25 else{ 26 if(max_score[k]-head->score >0.5){ 27 k++; 28 } 29 } 30 if(head->next !=NULL) 31 max(head->next); 32 else{ 33 for(j=0;j==k;j++){ 34 printf("番号:%d,時間:%f,値:%f\n",j+1,max_time[j],max_score[j]); 35 } 36 } 37} 38void main(){ 39 FILE *fp; 40 struct lv *lv; 41 struct lv *head=NULL; 42 float t,s; 43 int i=1000,n=0; 44 45 if ((fp=fopen("s:\jx18250_0426_100Hz.txt","r"))==NULL){ 46 printf("Cant open file %s\n", "a.txt"); /*オープンに失敗したらメッセージ表示*/ 47 } 48 while(fscanf(fp,"%f,%f",&t,&s)!= EOF){ 49 head=add_list(t,s,head); 50 } 51 52 max(head); 53 54 free(lv); 55 fclose(fp); 56}

試したこと

max()のところはとまるのはなくなりましたが、時間、値が0.000のままです。txtからの時間、値がとりだせていることは確認済みです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/05/08 02:11

ポインタのNU L L判定は?
tmtmmm

2019/05/08 02:40

そこが原因だったようです
guest

回答6

0

ベストアンサー

  • maxの最初のfor(i=0;i<100;i++){は98~100回同じことを繰り返しているだけなので不要です。
  • for(j=0;j=i;j++){この処理の意味が全てのmax_time、max_scoreを表示するというものであれば、jは* max_time/scoreの添え字なので、この配列の要素数(100)未満という条件であるべきだと思います。そうでない場合、恐らくfor文である必要はありません。どちらにせよ、場所を移動するか実行するかどうかの条件を付けるべきです。
  • max(head->next);は最終的にnullになるためnullチェックが必要です。
  • struct lv *lv;使用していないため不要です。
  • headおよびhead->nextはmallocされていますが、freeされていません。

投稿2019/05/08 02:27

編集2019/05/08 02:54
moredeep

総合スコア1507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmtmmm

2019/05/08 02:43

返信ありがとうございます。3つめの最大値未満という条件であるべきというところがどうすればよいのかわかりません。ご教授おねがいします。nullチェックは修正ずみです。
moredeep

2019/05/08 03:02

すみません、表現が間違っていました。配列の要素数未満が正しいですね。 配列はmax_score[100]と100個の要素を持っているので、今回は100未満です。 >時間、値が0.000のままです こちらはif文の条件の各値がどのようになっているかを確認してみたほうがいいかと思います。
guest

0

can110 さんご回答の最後の一文が的と思いますので, 再帰で無いコードを^^;
ただ, 結果が何を表すものなのか全然分かりませんので, 合っているのやら…

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <errno.h> 4 5//#define TEST //テスト時定義 6 7#define ARRAY_MAX 100 8float max_score[ARRAY_MAX], max_time[ARRAY_MAX]; 9int max_len=0; 10 11struct lv{ 12 float score; 13 float time; 14 struct lv *next; 15}; 16 17struct lv *add_list(float t, float s ,struct lv *head){ 18 struct lv *new_head; // 宣言 19 new_head = (struct lv *)malloc(sizeof(struct lv)); // 領域確保 20 new_head->time = t;// 新しいデータの代入 21 new_head->score = s;// 新しいデータの代入 22 new_head->next = head; // 古い head を新しい head の次のデータに指定 23 return new_head; 24} 25 26struct lv *readfile(char *filename) { 27 struct lv *head=NULL; 28 29#ifdef TEST 30 head = add_list( 1.0, 100.0, head); 31 head = add_list( 2.0, 99.0, head); 32 head = add_list( 3.0, 101.0, head); 33 head = add_list( 4.0, 110.0, head); 34 head = add_list( 5.0, 88.0, head); 35 head = add_list( 6.0, 80.0, head); 36 head = add_list( 7.0, 100.0, head); 37 head = add_list( 8.0, 95.0, head); 38 head = add_list( 9.0, 103.0, head); 39 head = add_list(10.0, 0.0, head); 40#else 41 float t,s; 42 FILE *fp; 43 44 if((fp = fopen(filename, "r")) == NULL) { 45 printf("Can't read file. errno=%d filename='%s'\n", errno, filename); 46 return NULL; 47 } 48 while(fscanf(fp, "%f,%f", &t, &s) != EOF) { 49 head = add_list(t, s, head); 50 } 51 fclose(fp); 52#endif 53 54 return head; 55} 56 57void max(struct lv *head) { 58 for(struct lv *p=head; p!=NULL; p=p->next) { 59 if(p->score > max_score[max_len]){ 60 max_score[max_len] = p->score; 61 max_time[max_len] = p->time; 62 } else if(max_score[max_len]-p->score > 0.5) { 63 if(++max_len >= ARRAY_MAX) return; 64 } 65 } 66} 67 68void free_list(struct lv *head) { 69 for(struct lv *p=head, *next; p!=NULL; p=next) { 70 next = p->next; 71 free(p); 72 } 73} 74 75void main() { 76 struct lv *head = readfile("s:\jx18250_0426_100Hz.txt"); 77 if(head == NULL) exit(1); 78 79 max(head); 80 81 free_list(head); 82 83 for(int i=0; i<max_len; i++) { 84 printf("番号:%d,時間:%f,値:%f\n", i+1, max_time[i], max_score[i]); 85 } 86}

投稿2019/05/08 05:47

編集2019/05/08 05:51
jimbe

総合スコア12632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

時間、値が0.000のままです。

printf("番号:%d,時間:%f,値:%f\n",j+1,max_time[j],max_score[j]);
int値に対して書式%fを使うのは誤りです。
というかmax_timeintでよいのでしょうか??

投稿2019/05/08 03:04

can110

総合スコア38258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C

1if(head->next !=NULL) 2 max(head->next)

何をしようとしているのかわかりませんのでnullチェックここに入れるのが適切かわかりませんが
とにかくnullチェックが抜けてます。

あと全体的にwarning出まくりなので(使ってない変数あったり条件式がj=iだったり)
ちゃんとコンパイラの言うこと聞いてあげてください。

投稿2019/05/08 02:19

編集2019/05/08 02:23
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmtmmm

2019/05/08 02:45

返信ありがとうございます。nullチェックをしたところうごきました。ですが、時間、値が0をずっと繰り返しています。txtからのデータ取得はかくにんずみです。
ozwk

2019/05/08 02:52

C言語でないと駄目なとき以外はC言語はもはや使わないほうが労力的にいいんですが Cじゃないと駄目なんですか? 課題だっていうなら頑張ってくださいとしか言えませんが。
guest

0

詳しくは見ていませんが、maxの再帰呼び出しから抜け出せてないと思います。
maxの先頭あたりで、headがNULLなら即returnするようにしてみては。

投稿2019/05/08 02:11

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmtmmm

2019/05/08 02:46

返信ありがとうございます。時間、値が0をずっと繰り返していて最大値が取得できていないのですがどうすればいいでしょうか?
guest

0

ぱっとみただけですが、

for(j=0;j=i;j++){

printf("%d,時間:%f,値:%f",j+1,max_time[j],max_score[j]); }

このfor文、条件のところが間違ってます

投稿2019/05/08 02:09

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmtmmm

2019/05/08 02:11

返信ありがとうございます。 j==iということですかね?
y_waiwai

2019/05/08 02:16

そこで何をしようとしてるところまでは見てないですが、、 j==i としたなら、jとiが同じ時だけループするという動作になりますが、そんでいいのでしょうか
tmtmmm

2019/05/08 02:48

ご指摘ありがとうございます。jとiが同じ時だけループするという動作でだいじょうぶでしたが数がおおいので100で制限しましたが最大値、時間が0.00000となってしまいます。txtからのしゅとくはできています
y_waiwai

2019/05/08 05:46

えーと、、同じ値の時だけループする、とすると、i が0の時に、一回だけループする、それ以外の時は全くループされない、という動作になると思いますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問