• 締切済み

文字認識について教えてください

perlでプログラムを書いています。 配列に//と連続で入っているとき、 (例えばa[0]=a,a[1]=b,a[2]=/,a[3]=/,a[4]=c,a[5]=/,a[6]=d) $count=@a for($i=0;$i<$count;$i++){ if(@a[$i] eq"/"){ 省略 } } とやると、a[3]とa[5]ではifの中に入るのに、a[2]では入りません。 これはどうしてでしょうか? 教えてください。

みんなの回答

  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

>配列に//と連続で入っているとき、 と書いてあるので、ひょっとして a[2] = "//"; ですか? 先頭の一文字だけ比較するなら if(substr($a[$i],0,1) eq "/"){ 省略 } または正規表現で、 if($a[$i] =~ m|^/|){ 省略 } /を含めばいいのであれば、 if($a[$i] =~ m|/|){ 省略 }

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

手元の環境では、a[2]でもifの中に入りますよ。 @a = ('a','b','/','/','c','/','d'); $count=@a; for($i=0;$i<$count;$i++){ if(@a[$i] eq"/"){ print "$i "; } } 結果は、2 3 5 が出力されます。 なお、結果に影響はないと思いますが、 if(@a[$i] eq"/"){ の部分は、 if($a[$i] eq"/"){ にした方がいいと思います。 うまくいかないのは、「省略」の部分(連続した/を検出する部分)の問題じゃないでしょうか。こういうときは、どこに問題があるのか知るために、print文を入れて変数を出力したり、複雑な部分を一旦コメントアウトして単純化したプログラムにして実行してみるとよいと思います。つまづくたびに教えてgooで質問したら、あなたの時間がもったいないし、なかなか上達しません。 それから、この手の処理は、文字認識とはいいません。文字認識とは一般的に、手書きや印刷された文字を読み取って、判別することを言うと思います。

wawawawawa
質問者

お礼

タイトルへのご指摘ありがとうございます。 ちなみに、どこに問題があるか知るために、print文で出力したり、他の部をコメントアウトしたりは当然やっております。 それでもできないので、今回は質問させて頂きました。 たまたま、2つの質問が続いてはしまいましたが、2つとも何日かやった後にわからないので質問させて頂いたのです。 回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • tatsumi01
  • ベストアンサー率30% (976/3185)
回答No.1

perl は全然知らないので手助けにはなりません。 投稿タイトルが「文字認識について教えてください」となっていますが、質問内容は文字認識とは全く関係ありませんね。wawawawawa さんの書いているプログラムが文字認識目的のものかも知れませんが。 タイトルは、たとえば「配列への連続的な値の代入について」など具体的な問題に関連するものにした方が回答が得られやすいと思います。

wawawawawa
質問者

お礼

タイトルへのご指摘ありがとございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字認識について

    perlでプログラムを書いています。 配列の中にもし"<"があったらif文に入るってしたいのですが、 for(省略){ if(@配列[i] eq"<"){ としても、 if(@配列[i] eq"\<"){ としても、 if文の中に入れません。これは何故でしょうか? また、"//"とスラッシュが2回続いた時も同様にif文に入りたいのですが、これも方法を教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • phpのfor文の中で配列を作りたいです。

    $a = array(); $a[0]="あ"; $a[1]=""; $a[2]="い"; $a[3]=""; $a[4]=""; $a[5]="う"; のような配列がありfor文の中で文字列が一文字以上だったら配列$bに入れるということをしたいのですが、 $b=array(); for($i=0; $i<count($a); $i++){ $c = mb_strlen($a[$i]); if($c>=1){ $b = $a[$i]; } } var_dump($b); とすると$bには最後の”う”しか入りません。 $bを $b[0]="あ"; $b[1]="い"; $b[2]="う"; とするようにするにはどうしたらいいですか?

    • ベストアンサー
    • PHP
  • 配列のソートと削除

    String型のstrToRemoveで与えられた文字列を配列から探し、あればそれ以降の配列の数字をすべて左にシフトします。 なので配列の大きさは1小さくなります。その結果の配列をreturnで返します。 例) ({"A","B","C","D","B"}, "B")配列1にBがあるのでそれ以降の文字列をすべて左にシフト→ {"A","C","D","B"} ({"A","B","C","D","B"}, "A") 配列0にAがあるのでそれ以降の文字列を左にシフト→ {"B","C","D","B"} プログラムは以下のように組みました。 public class ArrayFun { public String[] oneRemoved(String[] array, String strToRemove) { int count = 0; for (int i = 0; i < array.length; i++) {      if (strToRemove.equals(array[i]) && count == 0) {        for (int j = i; j < array.length - 1; j++) {          array[j] = array[j + 1];        }          count++;      } }      array = new String[array.length - 1];      array[array.length - 1] = null;      return array; } } ちなみにcountは、一度シフトすればもう同じ文字列がそれ以降の配列にあってもシフトはしないので、countでシフトしたかどうかを判断しようと思い付けました。 これでテストメソッドも作るのですが、 import static org.junit.Assert.*; import org.junit.Test; public class ArrayFunTest { @Test public void testoneRemoved() { ArrayFun af = new ArrayFun(); String[] a1 = {"A","B","C","D","B" };//元の配列 String[] a2 = {"A","BB","CCC","DDD","B"};//元の配列 String[] a3 = {"B","C","D","B"};//シフト後の配列 String[] a4 = {"A","BB","CCC","DDD","B"};//シフト後の配列 assertEquals(a3, af.oneRemoved(a1, "A")); assertEquals(a4, af.oneRemoved(a2, "NotHere")); } } 以上のように組むと、assertEqualsの真ん中に黒線が入って自動的に@SuppressWarnings("deprecation")が加えられてしまいます。 実行結果は、({"A","B","C","D","B"}, "A") の例だと、配列0にB が入るはずがnullになっている、とエラーがでます。 どのようにしたら正常に動かせるでしょうか?宜しくお願いします。

    • ベストアンサー
    • Java
  • 文字の結合

    Perl初心者です。 ある条件にしたがって文字を結合したいのですが、なかなかうまくいきません。以下のように記述してみたのですが何かヒントございましたらお教え願えませんでしょうか。 実現したいのは、たとえばQ5_1a_1_CB_1とQ5_1a_1_CB_3が"1"だったら_KINOU5_1a_1_に「あ,う」、Q5_1b_1_CB_1とQ5_1b_1_CB_5とQ5_1b_1_CB_6が"1"だったら_KINOU5_1b_1_に「あ,お,か」と代入したいのです。 想像では「$kinou .= $z.",";」のところが何か不足しているような気がします。 for($i=1; $i<=14; $i++){ for ($j=1; $j<=3; $j++){ $c = ('','a','b','c','d','e','f','g','h','i','j','k','l','m','n',)[$i]; $name2 = "_KINOU5_1".$c."_"."$j"."_"; $kinou = ""; for ($k=1; $k<=11; $k++){ $z = ('','あ','い','う','え','お','か','き','く','け','こ','さ',)[$k]; $name3 = "Q5_1".$c."_"."$j"."_CB_".$k; if ($data{$name3} eq '1'){ $kinou .= $z.","; } } chop $kinou; $newtemplate =~ s/$name2/$kinou/g; } }

    • ベストアンサー
    • Perl
  • 条件式の省略

    if文の条件式の中を省略したいと思っています。 for(i=0;i<5;i++){ if(p[i][0]==a[0]||p[i][0]==b[0]||p[i][0]==c[0]||p[i][0]==d[0] ||p[i][1]==a[0]||p[i][1]==b[0]||p[i][1]==c[0]||p[i][1]==d[0] ||p[i][2]==a[0]||p[i][2]==b[0]||p[i][2]==c[0]||p[i][2]==d[0] ||p[i][3]==a[0]||p[i][3]==b[0]||p[i][3]==c[0]||p[i][3]==d[0]){ continue; }else{ a[1]=p[i][0]; b[1]=p[i][1]; c[1]=p[i][2]; d[1]=p[i][3]; } ifの条件式の中のp[i][1]~p[i][3]を省略したいのですが、どうやったらできるかわかりません。ぜひ教えてください。

  • ポインタ文字列をchar[ ]の文字列へ変換する方法

    C言語の問題で悩んでいます。 ポインタ型で受け取った文字列を、通常の配列に変換し、それぞれの文字列がいくつ使われているというプログラムを組みたいのですが、うまくいきません。 とりあえずここまでのソースを。 #include <stdio.h> int count[95]={0}; void Countx(void){ int x; for(x=0;x<=95;x++){ if(count[x]!=0){ printf("'%c': %d\n",x+32,count[x]); } } } void County(char *str){ int c; for(c=0;c<=20;c++){ count[c+32]=str[c]; } } int main(void){ County("I am a BILL."); Counxt(); return 0; } "I am a BILL"の部分が以下のように ' ':3 '.':1 'a':2 というふうにそれぞれの文字と、利用された回数を出すようにプログラムを組みたいのですが、上記のままだとが ' ':84 '!':104 '"':105 と言う風に、文字コードが空白から順番に、右の回数の部分はなぞの数字が表示されてしまいます。 どうか理想どおりの結果が出るようにする方法を教えてください。 よろしくお願いします。

  • c言語の質問です。回答お願いします

    下のプログラムですが、隣り合う配列の値の和を求め、さらにその中で一番大きい値を求めるプログラムです。例えば、下のプログラムの例だと配列の最初を0番目とすると3番目が一番大きく2,3,4番目の値を足して21になります。そして、2,3,4番目の中で値が9の四番目を求めたいのですが2番目の5が求めた値となります。おそらく2回目のfor分の辺りがおかしいと思うのですが・・・ よろしくお願いします。 #include<stdio.h> int main(void){ int va[10]={1,3,5,7,9,0,2,4,6,8}; int a,b,c; int max; int saidai; int i,j; max=va[0]; a=0; b=0; for(a=0;a<10;a++){ if(a==0 && max<va[a]+va[a+1]){ max=va[a]+va[a+1]; b=a; } else if(a==9 && max<va[a-1]+va[a]){ max=va[a-1]+va[a]; b=a; } else if(max<va[a-1]+va[a]+va[a+1]){ max=va[a-1]+va[a]+va[a+1]; b=a; } } saidai=va[b-1]; c=0; i=b-1; for(i=b-1;i<=b+1;i++){ if(va[i]<saidai){ c=i; saidai=va[i]; } } printf("%d番目:最大値%d\n",c+1,saidai); }

  • C言語 関数の作り方

    1~30の数字を使い、直角三角形が成り立つ組み合わせを見つけよ。(a<=b<=c) ただし、a,b,c辺を見つけて配列に入れる機能は関数にすること。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー #include <stdio.h> int main(void) {    int a,b,c,i=0,ct=0;    int ahen[20];    int bhen[20];    int chen[20];    for(a=1;a<31;a++)    {     for(b=1;b<31;b++)     {      for(c=1;c<31;c++)      {       if(a*a+b*b==c*c && a<=b && b<=c)       {         ahen[i]=a;         bhen[i]=b;         chen[i]=c;         i=i+1;         ct++;       }      }     }    }    for(i=0;i<ct;i++)    {     printf("%d %d %d\n",ahen[i],bhen[i],chen[i]);    }    return 0; } 実行例: 3 4 5 5 12 13 6 8 10 7 24 25 8 15 17 9 12 15 10 24 26 12 16 20 15 20 25 18 24 30 20 21 29 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー とりあえず、関数を使わない上記のプログラムを作って見ました。 ここから関数を使ったものに変更したいのですが、配列が絡むとさっぱり分かりません。 printfで表示する箇所以外を全て関数にするのだと思いますが、どなたかご教示願います。

  • 文字と数字の判定について

    c言語を学び始めたばかりの者です。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <ctype.h> main(){ printf("数当てゲームを開始します。\n"); int a,count,n,b; srand((unsigned)time(NULL)); printf("1~10の中から1つ数字を選びます。\n"); a = (rand()%10)+1; printf("選びました\n"); for(count=0;;count++){ printf("その数字はズバリ:"); scanf("%d",&n); //もし数字でなければという文にしたい!! if (?){ printf("数字を入力してください。\n"); continue; } else{ if(n<a){ printf("もっと大きな値です。\n"); printf("%d回間違えました。\n",count+1); continue; } if(n==a){ printf("正解です!!\n"); b=0; exit(0); } if(n>a){ printf("もっと小さな値です。\n"); printf("%d回間違えました。\n",count+1); continue; } } } } というプログラムなのですが数字の判定の仕方が分からなくて最初のifの条件に何をいれればいいのか分からないので分かるかたいましたら教えてもらえないでしょうか?

  • 2つの変数(文字)を組み合わせて1つの変数として認識させる方法?

    PHPの初心者チュートリアルサイトやphp manualなども見てるのですが あまりに基本的過ぎるのか、どうしてもわからないので教えてください。 $myarray1 = array("a","b","c"); $myarray2 = array("d","e","f"); $myarray3 = array("x","y","z"); という配列があるとして、 これをforループで使いたいと考えました。 例えば無理やり書くと下記のようなイメージなのですが やはりこのようなあてずっぽうではうまく行かず・・・。 for( $i = 1; $i<= 3; $i++ ){ echo {$myarray.$i}[0] . "<br/>"; } 「$myarray.$i」を$myarray1~3と認識させてa,d,xの3つを出力することはできますか?

    • 締切済み
    • PHP