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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

573閲覧

動的に変化する文字数から決まった文字数に等間隔で抜き出す

KRoNe_9

総合スコア11

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/07/04 04:44

編集2018/07/06 07:38

1と0で作られた数列(動的に文字数が変化する)がテキストファイルに書き込まれており
ここから決まった文字数にほぼ等間隔で抽出するプログラムを作りたいのですがどういったアプローチで書けばよいかがわかりません。
等差数列で抜きだそうと思ったのですが綺麗な等間隔にはなりますが抽出したい文字数になりません。
わかりずらいと思うので
(例)
テキストファイルに
0 1 0 0 1 0 0 0 0 1 1 1 1 0
のように249文字(今回)書かれており
ここからほぼ等間隔に150文字抽出し別のテキストファイルに書き込みたい

ということです。
よろしくお願いします。

追記====================
コメントくださったみなさんありがとうございます。
よく考えてみれば等差数列で切り下げれば問題ありませんでした。
質問の時から少し状況、段階が進んだので追記します。現在EV3のカラーセンサを用いて読み取ったデータをテキストファイルに書き込もうとしています。
読み取ったデータをベクター配列に格納して、配列から読み取ったものをテキストファイルに書き込もうとしているのですが思ったようにうまくいきませんcase1から抜け出せない状態です。
とても汚いプログラムですがどこがおかしいや、ここはこうすべきなどを教えていただけると幸いです。

c++

1#include "app.h" 2#include <vector> 3#include <math.h> 4 5rgb_raw_t rgb_val; 6int red=0; 7int green=0; 8int blue=0; 9int gray=0; 10 11 12using namespace std; 13FILE *fp; 14 15vector<int> go; 16vector<int> back; 17 18void main_task(intptr_t unused) 19{ 20 ev3_sensor_config(EV3_PORT_2,COLOR_SENSOR); 21 ev3_motor_config(EV3_PORT_B, LARGE_MOTOR); 22 ev3_motor_config(EV3_PORT_C, LARGE_MOTOR); 23 24 ev3_sta_cyc(EV3_CYC_10MS); 25 ev3_sta_cyc(EV3_CYC_50MS); 26 ev3_sta_cyc(EV3_CYC_100MS); 27 28 29 while (1) { 30 tslp_tsk(100); 31 } 32 33 ev3_stp_cyc(EV3_CYC_100MS); 34 ev3_stp_cyc(EV3_CYC_50MS); 35 ev3_stp_cyc(EV3_CYC_10MS); 36 ext_tsk(); 37} 38 39void cyc_task_10ms(intptr_t exinf) 40{ 41 static int key; 42 43 44 switch(key) 45 { 46 47 // 直進(スキャン) 48 case 0: 49 50 if (ev3_motor_get_counts(EV3_PORT_C) > 300) { 51 ev3_motor_stop(EV3_PORT_B, true); 52 ev3_motor_stop(EV3_PORT_C, true); 53 ev3_motor_reset_counts(EV3_PORT_C); 54 key = 1; 55 }else{ 56 ev3_color_sensor_get_rgb_raw(EV3_PORT_2,&rgb_val); 57 red=rgb_val.r; 58 green=rgb_val.g; 59 blue=rgb_val.b; 60 gray=(red*0.3)+(green*0.59)+(blue*0.11); 61 62 ev3_motor_set_power(EV3_PORT_B,20); 63 ev3_motor_set_power(EV3_PORT_C,20); 64 65 if(gray<50){ 66 go.push_back(1); 67 }else{ 68 go.push_back(0); 69 } 70 } 71 72 break; 73 74 75 //回転180 76 case 1: 77 78 if (ev3_motor_get_counts(EV3_PORT_C) > 520) 79 { 80 ev3_motor_stop(EV3_PORT_B, true); 81 ev3_motor_stop(EV3_PORT_C, true); 82 ev3_motor_reset_counts(EV3_PORT_B); 83 ev3_motor_reset_counts(EV3_PORT_C); 84 key = 2; 85 }else{ 86 ev3_motor_set_power(EV3_PORT_C,15); 87 ev3_motor_stop(EV3_PORT_B,true); 88 89 double x ,z ,l ; 90 int a; 91 z = go.size()/150; 92 93 for(static int k = 0 ; k < 150; k++){ 94 fp = fopen("colorscan.txt","a"); 95 l = k * z; 96 x = floor(l); 97 a = go[x]; 98 fprintf(fp,"%d",a); 99 fclose(fp); 100 } 101 } 102 break; 103 104 // バック 105 case 2: 106 ev3_motor_set_power(EV3_PORT_B,-20); 107 ev3_motor_set_power(EV3_PORT_C,-20); 108 if (ev3_motor_get_counts(EV3_PORT_B) < -100) { 109 ev3_motor_reset_counts(EV3_PORT_B); 110 key = 3; 111 } 112 break; 113 114 //直進(スキャン) 115 case 3: 116 117 if (ev3_motor_get_counts(EV3_PORT_C) > 300) { 118 ev3_motor_reset_counts(EV3_PORT_C); 119 key = 4; 120 }else{ 121 ev3_motor_set_power(EV3_PORT_B,20); 122 ev3_motor_set_power(EV3_PORT_C,20); 123 124 ev3_color_sensor_get_rgb_raw(EV3_PORT_2,&rgb_val); 125 red=rgb_val.r; 126 green=rgb_val.g; 127 blue=rgb_val.b; 128 129 gray=(red*0.3)+(green*0.59)+(blue*0.11); 130 131 if(gray<50){ 132 back.push_back(1); 133 }else{ 134 back.push_back(0); 135 } 136 } 137 break; 138 139 // 停止 140 case 4: 141 142 ev3_motor_stop(EV3_PORT_B, true); 143 ev3_motor_stop(EV3_PORT_C, true); 144 145 double y , w ,n ; 146 int b; 147 148 w = back.size()/150; 149 150 for(static int j = 0 ; j < 150; j++){ 151 fp = fopen("colorscan.txt","a"); 152 n = j * w; 153 y = floor(n); 154 b = back[y]; 155 fprintf(fp,"%d",b); 156 fclose(fp); 157 } 158 159 for(static int i=0; i<1; i++){ 160 fp = fopen("colorscan.txt","a"); 161 fprintf(fp,"%d",88); 162 fclose(fp); 163 } 164 165 break; 166 ext_tsk(); 167 168 } 169} 170 171 172 173void cyc_task_50ms(intptr_t exinf) 174{ 175 // 通信 176 ext_tsk(); 177} 178 179void cyc_task_100ms(intptr_t exinf) 180{ 181 // 表示 182 ext_tsk(); 183} 184 185void ev3_cyc_10ms(intptr_t exinf) 186{ 187 act_tsk(CYC_TASK_10MS); 188} 189 190void ev3_cyc_50ms(intptr_t exinf) 191{ 192 act_tsk(CYC_TASK_50MS); 193} 194 195void ev3_cyc_100ms(intptr_t exinf) 196{ 197 act_tsk(CYC_TASK_100MS); 198} 199 200 201

再追記(7/6)
綺麗にまとまってきたので再追記します。

C++

1#include "app.h" 2#include <vector> 3#include <math.h> 4 5rgb_raw_t rgb_val; 6int red=0; 7int green=0; 8int blue=0; 9int gray=0; 10 11using namespace std; 12FILE *fp; 13 14void main_task(intptr_t unused) 15{ 16 ev3_sensor_config(EV3_PORT_2,COLOR_SENSOR); 17 ev3_motor_config(EV3_PORT_B, LARGE_MOTOR); 18 ev3_motor_config(EV3_PORT_C, LARGE_MOTOR); 19 20 ev3_sta_cyc(EV3_CYC_10MS); 21 ev3_sta_cyc(EV3_CYC_50MS); 22 ev3_sta_cyc(EV3_CYC_100MS); 23 24 25 while (1) { 26 tslp_tsk(100); 27 } 28 29 ev3_stp_cyc(EV3_CYC_100MS); 30 ev3_stp_cyc(EV3_CYC_50MS); 31 ev3_stp_cyc(EV3_CYC_10MS); 32 ext_tsk(); 33} 34 35void cyc_task_10ms(intptr_t exinf) 36{ 37 static int key; 38 39 static vector<int> go; 40 static vector<int> back; 41 42 switch(key) 43 { 44 45 // 直進(スキャン) 46 case 0: 47 for(;;){ 48 ev3_color_sensor_get_rgb_raw(EV3_PORT_2,&rgb_val); 49 red=rgb_val.r; 50 green=rgb_val.g; 51 blue=rgb_val.b; 52 53 gray=(red*0.3)+(green*0.59)+(blue*0.11); 54 55 ev3_motor_set_power(EV3_PORT_B,20); 56 ev3_motor_set_power(EV3_PORT_C,20); 57 if(gray<30 && ev3_motor_get_counts(EV3_PORT_C) < 320){ 58 go.push_back(1); 59 }else if(gray>=30 && ev3_motor_get_counts(EV3_PORT_C) < 320){ 60 go.push_back(0); 61 }else{ 62 ev3_motor_reset_counts(EV3_PORT_C); 63 key = 1; 64 break; 65 } 66 } 67 break; 68 69 70 //回転180 71 case 1: 72 if (ev3_motor_get_counts(EV3_PORT_C) > 530) 73 { 74 ev3_motor_stop(EV3_PORT_B, true); 75 ev3_motor_stop(EV3_PORT_C, true); 76 ev3_motor_reset_counts(EV3_PORT_B); 77 ev3_motor_reset_counts(EV3_PORT_C); 78 key = 2; 79 }else{ 80 ev3_motor_set_power(EV3_PORT_C,15); 81 ev3_motor_stop(EV3_PORT_B,true); 82 83 double z ,l ; 84 int a,x; 85 z = go.size()/150; 86 fp = fopen("colorscan.txt","a"); 87 88 for(static int k = 0 ; k < 150; k++){ 89 l = k * z; 90 x = (int)floor(l); 91 a = go[x]; 92 fprintf(fp,"%d",a); 93 } 94 fclose(fp); 95 } 96 break; 97 98 // バック 99 case 2: 100 ev3_motor_set_power(EV3_PORT_B,-20); 101 ev3_motor_set_power(EV3_PORT_C,-20); 102 if (ev3_motor_get_counts(EV3_PORT_B) < -100) { 103 ev3_motor_reset_counts(EV3_PORT_B); 104 key = 3; 105 } 106 break; 107 108 //直進(スキャン) 109 case 3: 110 111 for(;;){ 112 ev3_color_sensor_get_rgb_raw(EV3_PORT_2,&rgb_val); 113 red=rgb_val.r; 114 green=rgb_val.g; 115 blue=rgb_val.b; 116 117 gray=(red*0.3)+(green*0.59)+(blue*0.11); 118 119 ev3_motor_set_power(EV3_PORT_B,20); 120 ev3_motor_set_power(EV3_PORT_C,20); 121 if(gray<30 && ev3_motor_get_counts(EV3_PORT_C) < 240){ 122 back.push_back(1); 123 }else if(gray>=30 && ev3_motor_get_counts(EV3_PORT_C) < 240){ 124 back.push_back(0); 125 }else{ 126 ev3_motor_reset_counts(EV3_PORT_C); 127 key = 4; 128 break; 129 } 130 } 131 break; 132 133 // 停止 134 case 4: 135 ev3_motor_stop(EV3_PORT_B, true); 136 ev3_motor_stop(EV3_PORT_C, true); 137 138 double w ,n ; 139 int b,y; 140 141 w = back.size()/150; 142 fp = fopen("colorscan.txt","a"); 143 for(static int j = 0 ; j < 150; j++){ 144 145 n = j * w; 146 y = (int)floor(n); 147 b = back[y]; 148 fprintf(fp,"%d",b); 149 } 150 fclose(fp); 151 152 fp = fopen("colorscan.txt","a"); 153 for(static int i=0; i<1; i++){ 154 fprintf(fp,"\n"); 155 } 156 fclose(fp); 157 158 break; 159 ext_tsk(); 160 } 161} 162 163 164 165void cyc_task_50ms(intptr_t exinf) 166{ 167 // 通信 168 ext_tsk(); 169} 170 171void cyc_task_100ms(intptr_t exinf) 172{ 173 // 表示 174 ext_tsk(); 175} 176 177void ev3_cyc_10ms(intptr_t exinf) 178{ 179 act_tsk(CYC_TASK_10MS); 180} 181 182void ev3_cyc_50ms(intptr_t exinf) 183{ 184 act_tsk(CYC_TASK_50MS); 185} 186 187void ev3_cyc_100ms(intptr_t exinf) 188{ 189 act_tsk(CYC_TASK_100MS); 190}

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

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

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

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

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

a_saitoh

2018/07/05 08:27

読み込むテキストファイルのサイズについて、テキストファイル全体をメモリ(配列)に読み込んでも構わないという前提はおけますか?
guest

回答2

0

こんなのでいいのか?

1.fgets()で文字列を読み込む。
2.strlen()で文字数を求める。
3.文字数-1(改行を省く)を抽出する文字数で割る。
4.整数にならない場合は切り捨てる。(切り上げると抽出文字数にならない)
5.結果を抽出する際の文字間隔として、文字を抽出しファイルに書き出す。

投稿2018/07/04 05:45

cateye

総合スコア6851

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

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

0

ベストアンサー

等差数列でいいのでは?
249を150で割ると、1.66 なので、公差は1.66 です。
各項は整数にならないので、切り捨てるなどして整数にして添え字に使えばいい。

0, 1.66, 3.32, 4.98, 6.64, 8.3, 9.96, ・・・
なので、四捨五入することにすると、
0, 1, 3, 5, 6, 8, 10, ・・・ 番目を取る。

投稿2018/07/04 04:55

編集2018/07/04 09:33
otn

総合スコア84505

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問