• 締切済み

関数

FILE *fp; char *str,buf[1000]; char xbuf[100],*xstr;   char ybuf[100],*ystr; static double bx=0; static double by=0; if ((fp = fopen("kadai.txt", "r")) == NULL) { printf("ファイルが開けません\n"); return EXIT_SUCCESS; } while (fgets(buf, 1000, fp) != NULL) { str=buf;        while((*str!='\0'){ if(*str=='X'){ *str++; if(isdigit(*str) || *str=='-' || *str=='.') xstr=xbuf; if(isdigit(*str) || *str=='-' || *str=='.') while(isdigit(*str) || *str=='-' || *str=='.')*xstr++=*str++; *xstr='\0'; } if(*str=='Y'){ *str++; if(isdigit(*str) || *str=='-' || *str=='.') ystr=ybuf; if(isdigit(*str) || *str=='-' || *str=='.') while(isdigit(*str) |*str=='||*str=='.') *ystr++=*str++; *ystr='\0'; } else str++; } } ファイルからの一行の切り分けのプログラムなのですが if(*str=='X'){ *str++; if(isdigit(*str) || *str=='-' || *str=='.') xstr=xbuf; if(isdigit(*str) || *str=='-' || *str=='.') while(isdigit(*str) || *str=='-' || *str=='.')*xstr++=*str++; *xstr='\0'; } の部分と if(*str=='Y'){ *str++; if(isdigit(*str) || *str=='-' || *str=='.') ystr=ybuf; if(isdigit(*str) || *str=='-' || *str=='.') while(isdigit(*str) |*str=='||*str=='.') *ystr++=*str++; *ystr='\0'; } の部分は変数が違うだけでほとんど同じ文ですよね。 関数を作ってこの処理のときに呼び出せれば応用が利くと思い 考えてみたのですが中々できません。よろしければ教えて下さい。 まだ戻り値や関数の理解が今ひとつです。

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.6

これって、もしかして kadai.txt の内容が、例えば、   XA=-10.3YA=21   XB=-23.9*YB=-11.7   XZ=624,YZ=4.3.5 のとき、不要な文字( A B * , = X Y Z ◆)以外を、bx, by に数値化して入れる、ということですよね。  1行目の bx は -10.3、by は 21.0 と言う具合に?? ↑この想像が誤っていましたら、以降スルーしてください。 ---------------------------------------------------- >の部分は変数が違うだけでほとんど同じ文ですよね。 >関数を作ってこの処理のときに呼び出せれば応用が利くと思い  確かにそのとおりなのですが・・。    一度も、ソースを実行していませんよね。  「ポインタ」の扱いを勉強し、正常に動いてから関数化でも遅くないかと・・。 ---------------------------------------------------- 「ポインタの勉強」を棚上げにしたソースを・・(BorlandC++5.5.1)  (上の想像データで動作確認済み) >まだ戻り値や関数の理解が今ひとつです。  「戻り値・関数の型」を受け側( bx by )と同じの double としています。   http://www.bohyoh.com/CandCPP/C/Library/atof.html #include <stdio.h> #include <ctype.h> #include <stdlib.h> double GetVal( char cTop, char cBtm, char buf[] ) {  int i, iSw = 0, nn = 0, iOk;  char cTarget[ 16 ] = "-999.9";  for( i = 0; buf[ i ]; i++ ){   if( cTop == buf[ i ] ) iSw = 1;   if( cBtm == buf[ i ] ) break;   if( 0 == iSw ) continue;   iOk = 0;   if( isdigit( buf[ i ] ) ) iOk = 1;   if( '-' == buf[ i ] ) iOk = 1;   if( '.' == buf[ i ] ) iOk = 1;   if( 0 == iOk ) continue; // ◆不要文字除外   cTarget[ nn++ ] = buf[ i ];   cTarget[ nn ] = '\0';  // 文字列終端処理  }  return( atof( cTarget ) ); // 数値化 } int main() {  FILE *fp;  char buf[ 128 ];  double bx, by;  if( ( fp = fopen( "Z:\\kadai.txt", "r" ) ) == NULL ){   printf( "ファイルが開けません\n" );   return( 256 );  }  while( fgets( buf, 128, fp ) != NULL ){   bx = GetVal( 'X', 'Y', buf );   by = GetVal( 'Y', '\n', buf );   printf( "X=%6.1lf,Y=%6.1lf\n", bx, by );  }  fclose( fp );  return( 255 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

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

関数に渡すべき物 ・呼び出しごとに値が異なる物 ・呼び出し後に値が変わる物のポインタ 関数から返すべきもの ・実行したか、しなかったかの結果 int func(char n,char **str,char *nbuf) { char *nstr; if(**str==n){ (*str)++; if(isdigit(**str) || **str=='-' || **str=='.') nstr=nbuf; if(isdigit(**str) || **str=='-' || **str=='.') while(isdigit(**str) || **str=='-' || **str=='.') { *nstr++=**str; (*str)++; } *nstr='\0'; return 0; } else return 1; } FILE *fp; char *str,buf[1000]; char xbuf[100]; char ybuf[100]; static double bx=0; static double by=0; if ((fp = fopen("kadai.txt", "r")) == NULL) { printf("ファイルが開けません\n"); return EXIT_SUCCESS; } while (fgets(buf, 1000, fp) != NULL) { str=buf; while((*str!='\0'){ func('X',&str,xbuf); //if(*str=='X'){...}の代わり if (func('Y',&str,ybuf)) str++;//if(*str=='Y'){...}else str++;の代わり。1が返ってきたらelseの次の文のstr++;を行う } } 検証してないので上手く動かないかも知れない。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.4

こんなソースがあるとします。 #include <stdio.h> int main(void) { int a, b, c, x, y, z; a = 10; x = 2 * a + 3; printf("%d\n", x); b = 200; y = 2 * b + 3; printf("%d\n", y); c = 3000; z = 2 * c + 3; printf("%d\n", z); return 0; } x, y, zを求める文は、使っている変数(a, b, c)こそ異なりますが、 2に何かを掛けて3を足すという形は共通していますね。 この共通している部分を、関数として切り出してみましょう。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.3

どういった方法で勉強していますか? 何か一冊、しっかりした入門書をお読みになるのがよいと 思いますけれど…。

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

 こんにちは。 >まだ戻り値や関数の理解が今ひとつです。  この部分をクリアすればできますよ。  中身はほとんど出来ているも同然ですので。  ご参考までに。

zaqwe
質問者

補足

その部分がわかればわかるのはわかりますよ。 わからないから質問しているのです。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「なかなかできません」と書かれているということは, いくつか挑戦しているわけですよね? よければ, それらを出してもらえますか?

zaqwe
質問者

補足

できないというのはプログラムが思い浮かばないという意味です。

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

関連するQ&A