ページ 11

入力した文字列から該当した文字列を発見するプログラムについて

Posted: 2009年12月24日(木) 22:11
by SS4
こんばんわ。
いつも参考にさせていただいているSS4です。

今現在ほぼ独学でC言語を勉強しています。
環境はWindowsでVisual C++ 2005 Express Editionを使っています。

今作成したいプログラムは、
自分で入力した文字列から2つ以上連続した英文字や数字を発見したいというものです
説明しにくいのでサンプル的には、


入力してください>>AABCD
出力:AAが1つあります

入力してください>>AABBBC //AAとBBでカウント1づつ(BBBのように3つあってもカウントは2ではなく1)
出力:AAが1つあります
  BBが1つあります

このようなプログラムを作りたいです。

また、ABCDEFG~~~Z,abcdefg~~~z,0123~~~9など
文字列を順番通りに入力された場合も

入力してください>>AB15         //この場合ABが続いているのでカウント1
出力:続けられた文字列が1つあります

入力してください>>ABG89        //ABと89が続いているのでカウント2
出力:続けられた文字列が2つあります

と上記二つの条件を満たしたプログラムを作りたいんですが
この場合は配列を使って入力された文字を前から一文字ずつ
確認する方法しかないのでしょうか?
初心者なので説明不足かとは思いますが
ご指導よろしくお願いいたします。

Re:入力した文字列から該当した文字列を発見するプログラムについて

Posted: 2009年12月24日(木) 22:42
by たかぎ
前半については、adjacent_find関数を使うと簡単に実現できそうです。
後半は、1文字ずつ見るしかないでしょうね。

Re:入力した文字列から該当した文字列を発見するプログラムについて

Posted: 2009年12月24日(木) 23:03
by SS4
早速の回答ありがとうございます。
adjacent_find関数を調べた結果
このような参考ソースがでてきました。
前半部分では自分で文字列を入力したいんですが
このソースでは
     v1.push_back(3);
v1.push_back(2);
v1.push_back(1);
v1.push_back(1);
v1.push_back(4);といった感じに最初からデータが入ってますよね?
この場合はどのようにしてデータ入力させたらいいんですか?


#include <stdio.h>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

int main()
{
vector<int> v1, v2;
vector<int>::iterator it;
// 初期設定
printf("**初期状態 v1**\n");
v1.push_back(3);
v1.push_back(2);
v1.push_back(1);
v1.push_back(1);
v1.push_back(4);
for (it = v1.begin(); it != v1.end(); it++)
printf(" %d", *it);
printf("\n");
printf("**初期状態 v2**\n");
for (int i1 = 0; i1 < 5; i1++)
v2.push_back(i1);
for (it = v2.begin(); it != v2.end(); it++)
printf(" %d", *it);
printf("\n");
// 検索(同じ要素が連続)
it = adjacent_find(v1.begin(), v1.end());
if (it != v1.end())
printf("v1 には %d が連続している箇所がある\n", *it);
else
printf("v1 には連続した要素がない\n");

it = adjacent_find(v2.begin(), v2.end());
if (it != v2.end())
printf("v2 には %d が連続している箇所がある\n", *it);
else
printf("v2 には連続した要素がない\n");
// 検索(次の要素より大きい)
it = adjacent_find(v1.begin(), v1.end(), greater<int>());
if (it != v1.end())
printf("v1 では %d が次の要素より大きい\n", *it);
else
printf("v1 は昇順に並んでいる\n");

it = adjacent_find(v2.begin(), v2.end(), greater<int>());
if (it != v2.end())
printf("v2 では %d が次の要素より大きい\n", *it);
else
printf("v2 は昇順に並んでいる\n");

return 0;
}

(出力)

**初期状態 v1**
3 2 1 1 4
**初期状態 v2**
0 1 2 3 4
v1 には 1 が連続している箇所がある
v2 には連続した要素がない
v1 では 3 が次の要素より大きい
v2 は昇順に並んでいる

------------------------------------------

また後半の1文字ずつ見る方法ってどうすれば一番効率がいい探し方ができますか?

Re:入力した文字列から該当した文字列を発見するプログラムについて

Posted: 2009年12月24日(木) 23:09
by たかぎ
失礼、C言語だとadjacent_findを使えませんね。
やはり1文字ずつ処理するしかなさそうです。

Re:入力した文字列から該当した文字列を発見するプログラムについて

Posted: 2009年12月25日(金) 09:52
by non
入力されるのが、半角アスキーのみで、100文字未満という条件で最初の方を作って見ました。
また、出力の形式も、指定されたものと若干異なりますが、独学で勉強されているということで、
学校の課題でないなら、よけいな物がない方がわかりやすいと思い、変更しました。
参考にして、2つ目の課題を考えてみてください。
#include <stdio.h>
int main(void)
{
    int i=1;
    int sw=0;
    char str[100];
    printf("入力してください>>");
    gets(str);
    while(str!='\0'){
        if(str[i-1]==str){
            if(sw==0){
                printf("出力:%c%cが1つあります\n",str[i-1],str[i-1]); 
                sw=1;
            }
        }
        else{
            if(sw==1)
                sw=0;
        }
        i++;
    }
    return 0;
}

Re:入力した文字列から該当した文字列を発見するプログラムについて

Posted: 2009年12月25日(金) 09:57
by SS4
返信遅くなりました。
たかぎさん、nonさんありがとうございます。

adjacent_find関数はCでは使えないんですか?


課題ではないです。


入力は半角アスキーのみで、100文字未満です。

追記
上記ソースで実行できました…
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

int main()
{
vector<int> v1, v2;
vector<int>::iterator it;
// 初期設定
printf("**初期状態 v1**\n");
v1.push_back(3);
v1.push_back(2);
v1.push_back(1);
v1.push_back(1);
v1.push_back(4);
for (it = v1.begin(); it != v1.end(); it++)
printf(" %d", *it);
printf("\n");
printf("**初期状態 v2**\n");
for (int i1 = 0; i1 < 5; i1++)
v2.push_back(i1);
for (it = v2.begin(); it != v2.end(); it++)
printf(" %d", *it);
printf("\n");
// 検索(同じ要素が連続)
it = adjacent_find(v1.begin(), v1.end());
if (it != v1.end())
printf("v1 には %d が連続している箇所がある\n", *it);
else
printf("v1 には連続した要素がない\n");

it = adjacent_find(v2.begin(), v2.end());
if (it != v2.end())
printf("v2 には %d が連続している箇所がある\n", *it);
else
printf("v2 には連続した要素がない\n");
// 検索(次の要素より大きい)
it = adjacent_find(v1.begin(), v1.end(), greater<int>());
if (it != v1.end())
printf("v1 では %d が次の要素より大きい\n", *it);
else
printf("v1 は昇順に並んでいる\n");

it = adjacent_find(v2.begin(), v2.end(), greater<int>());
if (it != v2.end())
printf("v2 では %d が次の要素より大きい\n", *it);
else
printf("v2 は昇順に並んでいる\n");

return 0;
}



画像

Re:入力した文字列から該当した文字列を発見するプログラムについて

Posted: 2009年12月25日(金) 12:23
by non
課題でなく自学の勉強なら、便利な関数を使わずに、解く方法を考えた方が勉強に
なります。