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

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

ただいまの
回答率

90.34%

  • C

    3966questions

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

  • C++

    3748questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 232

KRoNe_9

score 3

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

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

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

#include "app.h"
#include <vector>
#include <math.h>

rgb_raw_t rgb_val;
int red=0;
int green=0;
int blue=0;
int gray=0;


using namespace std;
FILE *fp;

vector<int> go;
vector<int> back;

void main_task(intptr_t unused)
{
    ev3_sensor_config(EV3_PORT_2,COLOR_SENSOR);
    ev3_motor_config(EV3_PORT_B, LARGE_MOTOR);
    ev3_motor_config(EV3_PORT_C, LARGE_MOTOR);

    ev3_sta_cyc(EV3_CYC_10MS);
    ev3_sta_cyc(EV3_CYC_50MS);
    ev3_sta_cyc(EV3_CYC_100MS);


    while (1) {
        tslp_tsk(100);
    }

    ev3_stp_cyc(EV3_CYC_100MS);
    ev3_stp_cyc(EV3_CYC_50MS);
    ev3_stp_cyc(EV3_CYC_10MS);
    ext_tsk();
}

void cyc_task_10ms(intptr_t exinf)
{
    static int key;


    switch(key)
    {

        // 直進(スキャン)
        case 0:

        if (ev3_motor_get_counts(EV3_PORT_C) > 300) {
            ev3_motor_stop(EV3_PORT_B, true);
            ev3_motor_stop(EV3_PORT_C, true); 
            ev3_motor_reset_counts(EV3_PORT_C);
            key = 1;        
        }else{    
            ev3_color_sensor_get_rgb_raw(EV3_PORT_2,&rgb_val);
            red=rgb_val.r;
            green=rgb_val.g;
            blue=rgb_val.b;
            gray=(red*0.3)+(green*0.59)+(blue*0.11);

            ev3_motor_set_power(EV3_PORT_B,20);
            ev3_motor_set_power(EV3_PORT_C,20);

            if(gray<50){
                go.push_back(1);
            }else{
                go.push_back(0);
            }
        }

        break;


        //回転180
        case 1:

        if (ev3_motor_get_counts(EV3_PORT_C) > 520)
        {
            ev3_motor_stop(EV3_PORT_B, true);
            ev3_motor_stop(EV3_PORT_C, true); 
            ev3_motor_reset_counts(EV3_PORT_B);
            ev3_motor_reset_counts(EV3_PORT_C);
            key = 2;
        }else{
            ev3_motor_set_power(EV3_PORT_C,15);
            ev3_motor_stop(EV3_PORT_B,true);

            double x ,z ,l ;
            int a;
            z = go.size()/150;

            for(static int k = 0 ; k < 150; k++){
                fp = fopen("colorscan.txt","a");
                l = k * z;
                x = floor(l);
                a = go[x];
                fprintf(fp,"%d",a);
                fclose(fp);    
            }            
        }
        break; 

         // バック
        case 2:
        ev3_motor_set_power(EV3_PORT_B,-20);
        ev3_motor_set_power(EV3_PORT_C,-20);
        if (ev3_motor_get_counts(EV3_PORT_B) < -100) {
            ev3_motor_reset_counts(EV3_PORT_B);
            key = 3;
        }
        break; 

        //直進(スキャン)
        case 3:

        if (ev3_motor_get_counts(EV3_PORT_C) > 300) {
            ev3_motor_reset_counts(EV3_PORT_C);
            key = 4;
        }else{
            ev3_motor_set_power(EV3_PORT_B,20);
            ev3_motor_set_power(EV3_PORT_C,20);

            ev3_color_sensor_get_rgb_raw(EV3_PORT_2,&rgb_val);
            red=rgb_val.r;
            green=rgb_val.g;
            blue=rgb_val.b;

            gray=(red*0.3)+(green*0.59)+(blue*0.11);

               if(gray<50){
                back.push_back(1);
            }else{
                back.push_back(0);
            }
        }
        break;

        // 停止
        case 4:

        ev3_motor_stop(EV3_PORT_B, true);
        ev3_motor_stop(EV3_PORT_C, true);   

        double y , w ,n ;
        int b;

        w = back.size()/150;

        for(static int j = 0 ; j < 150; j++){
            fp = fopen("colorscan.txt","a");
            n = j * w;
            y = floor(n);
            b = back[y];
            fprintf(fp,"%d",b);
            fclose(fp);
        }

        for(static int i=0; i<1; i++){
        fp = fopen("colorscan.txt","a");
        fprintf(fp,"%d",88);
        fclose(fp);
        }

        break;
        ext_tsk();

    }
}



void cyc_task_50ms(intptr_t exinf)
{
    // 通信
    ext_tsk();
}

void cyc_task_100ms(intptr_t exinf)
{
    // 表示
    ext_tsk();
}

void ev3_cyc_10ms(intptr_t exinf)
{
    act_tsk(CYC_TASK_10MS);
}

void ev3_cyc_50ms(intptr_t exinf)
{
    act_tsk(CYC_TASK_50MS);
}

void ev3_cyc_100ms(intptr_t exinf)
{
    act_tsk(CYC_TASK_100MS);
}

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

#include "app.h"
#include <vector>
#include <math.h>

rgb_raw_t rgb_val;
int red=0;
int green=0;
int blue=0;
int gray=0;

using namespace std;
FILE *fp;

void main_task(intptr_t unused)
{
    ev3_sensor_config(EV3_PORT_2,COLOR_SENSOR);
    ev3_motor_config(EV3_PORT_B, LARGE_MOTOR);
    ev3_motor_config(EV3_PORT_C, LARGE_MOTOR);

    ev3_sta_cyc(EV3_CYC_10MS);
    ev3_sta_cyc(EV3_CYC_50MS);
    ev3_sta_cyc(EV3_CYC_100MS);


    while (1) {
        tslp_tsk(100);
    }

    ev3_stp_cyc(EV3_CYC_100MS);
    ev3_stp_cyc(EV3_CYC_50MS);
    ev3_stp_cyc(EV3_CYC_10MS);
    ext_tsk();
}

void cyc_task_10ms(intptr_t exinf)
{
    static int key;

    static vector<int> go;
    static vector<int> back;

    switch(key)
    {

        // 直進(スキャン)
        case 0:
        for(;;){
            ev3_color_sensor_get_rgb_raw(EV3_PORT_2,&rgb_val);
            red=rgb_val.r;
            green=rgb_val.g;
            blue=rgb_val.b;

            gray=(red*0.3)+(green*0.59)+(blue*0.11);

            ev3_motor_set_power(EV3_PORT_B,20);
            ev3_motor_set_power(EV3_PORT_C,20);
            if(gray<30 && ev3_motor_get_counts(EV3_PORT_C) < 320){
                go.push_back(1);
            }else if(gray>=30 && ev3_motor_get_counts(EV3_PORT_C) < 320){
                go.push_back(0);
            }else{
                ev3_motor_reset_counts(EV3_PORT_C);
                key = 1;
                break;
            }
        }
        break;


        //回転180
        case 1:
        if (ev3_motor_get_counts(EV3_PORT_C) > 530)
        {
            ev3_motor_stop(EV3_PORT_B, true);
            ev3_motor_stop(EV3_PORT_C, true); 
            ev3_motor_reset_counts(EV3_PORT_B);
            ev3_motor_reset_counts(EV3_PORT_C);
            key = 2;
        }else{
            ev3_motor_set_power(EV3_PORT_C,15);
            ev3_motor_stop(EV3_PORT_B,true);

            double z ,l ;
            int a,x;
            z = go.size()/150;
            fp = fopen("colorscan.txt","a");

            for(static int k = 0 ; k < 150; k++){
                l = k * z;
                x = (int)floor(l);
                a = go[x];
                fprintf(fp,"%d",a);
            }
            fclose(fp);
        }
        break; 

         // バック
        case 2:
        ev3_motor_set_power(EV3_PORT_B,-20);
        ev3_motor_set_power(EV3_PORT_C,-20);
        if (ev3_motor_get_counts(EV3_PORT_B) < -100) {
            ev3_motor_reset_counts(EV3_PORT_B);
            key = 3;
        }
        break; 

        //直進(スキャン)
        case 3:

        for(;;){
            ev3_color_sensor_get_rgb_raw(EV3_PORT_2,&rgb_val);
            red=rgb_val.r;
            green=rgb_val.g;
            blue=rgb_val.b;

            gray=(red*0.3)+(green*0.59)+(blue*0.11);

            ev3_motor_set_power(EV3_PORT_B,20);
            ev3_motor_set_power(EV3_PORT_C,20);
            if(gray<30 && ev3_motor_get_counts(EV3_PORT_C) < 240){
                back.push_back(1);
            }else if(gray>=30 && ev3_motor_get_counts(EV3_PORT_C) < 240){
                back.push_back(0);
            }else{
                ev3_motor_reset_counts(EV3_PORT_C);
                key = 4;
                break;
            }
        }
        break;

        // 停止
        case 4:
        ev3_motor_stop(EV3_PORT_B, true);
        ev3_motor_stop(EV3_PORT_C, true);   

        double  w ,n ;
        int b,y;

        w = back.size()/150;
        fp = fopen("colorscan.txt","a");
        for(static int j = 0 ; j < 150; j++){

            n = j * w;
            y = (int)floor(n);
            b = back[y];
            fprintf(fp,"%d",b);
        }
        fclose(fp);

        fp = fopen("colorscan.txt","a");
        for(static int i=0; i<1; i++){
            fprintf(fp,"\n");
        }
        fclose(fp);

        break;
        ext_tsk();
    }
}



void cyc_task_50ms(intptr_t exinf)
{
    // 通信
    ext_tsk();
}

void cyc_task_100ms(intptr_t exinf)
{
    // 表示
    ext_tsk();
}

void ev3_cyc_10ms(intptr_t exinf)
{
    act_tsk(CYC_TASK_10MS);
}

void ev3_cyc_50ms(intptr_t exinf)
{
    act_tsk(CYC_TASK_50MS);
}

void ev3_cyc_100ms(intptr_t exinf)
{
    act_tsk(CYC_TASK_100MS);
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • a_saitoh

    2018/07/05 17:27

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

    キャンセル

回答 2

checkベストアンサー

+1

等差数列でいいのでは?
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, ・・・ 番目を取る。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

こんなのでいいのか?

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C

    3966questions

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

  • C++

    3748questions

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