C言語 画面出力
keronimo
keronimo
ATOMRSS
  • コード求むID: 155
  • 登録日時:  2007/10/16 01:20
  • 最終更新日時: 2007/10/18 06:29
  • アクセス数: 2513
  • タグ: 
  • codeなにがしブックマークに追加する 0 users
  • このページを del.icio.us に追加
  • このページをはてなブックマークに追加

ただいまC言語研修中ですが、記述はC++形式です。
画面から式を入力し、計算させて結果を画面に表示させる問題です。ほぼ正しい答えが返ってくるようになりました。

困っているのはMAIN関数の最後で結果だけ表示していますが、問題作成の制約で、出力については1行で例えば「10 + 2 = 12」と、間にスペースを挿入して画面に表示させる事が必要です。
その際の使用可能関数はgetchar,putchar,gets,puts,fgets,fputsのいずれかでなければいけませんが方法が分かりません。

上記関数に詳しい方、教えていただけないでしょうか。
(長いソースですが、MAIN関数以外は一応参考で載せています。)



#include  <stdio.h>
#include  <string.h>
#include  <stdlib.h>

void analyze(char* input, char* operand1, char* op, char* operand2);
int char_to_int char );            //1文字→数字
char int_to_char int );            //2数字→文字  
int str_to_int char* );            //3文字列→数字 
void int_to_str int i, char *s );    //4数字→文字列   
int calc int l_operand, char op, int r_operand );
                                       //5  10進演算を実行
void strrev( char* s, char* );       //文字列反転                                     

void main void )
                           
  printf( "入力開始  例:-2*-9->enter\n" );
  char nyuryoku[10];
  char No1[10]; 
  char enzan;
  char No2[10]; 
  char hyouji[25]; 

  gets( nyuryoku );

  analyze(nyuryoku, No1, &enzan, No2);      //入力文字列の解析 

  int str_to_int No1 );               //3文字列→数字
  int str_to_int No2 );               //3文字列→数字

  int kekka calc a, enzan, );         //計算

  int_to_str kekka, hyouji );             //4数字→文字列   

  //ここで画面に1行で「9 * 3 = 27」と表示させたい!!
  //項目名→ No1 sp enzan sp No2 hyouji 

  puts( hyouji );                           //文字列を標準出力に書き出す

}


void analyze(char* input, char* operand1, char* op, char* operand2)
                                            //文字列解析
{
   int f_kigou 0;                         //演算子検索フラグ 
   int count 1;                           //マイナス符号の考慮
   while( *input != '\0' )
   {
      if( f_kigou == )
      
         *operand2 *input;
         operand2++;
      }
      else if( (count != 1) && 
               (*input == '+' || *input == '-' || *input == '*' ||
                *input =='/') )
      {
         *op *input;
         f_kigou 1;          
      }
      else
      {
         *operand1 *input;
         operand1++;
      }

      input++; 
      count++;
   }
   
   *operand1 '\0';
   *operand2 '\0';
}


int char_to_int char            //1文字→数字  
                      
  int suji; 
  suji '0'; 
  return suji; 
         


char int_to_char int            //2数字→文字  
                      
  char moji; 
  moji '0'; 
  return moji; 
}


int str_to_int char*            //3文字列→数字 
         
   char henkan[20];
   char* kazu; 
   int minus 0;             
                                     
   if( *c == '-'                    //マイナス値の考慮
   {
      minus 1; 
      c++;
   }
   strrev( henkan, );               //文字列反転
   kazu henkan;

   int j; 
   int suchi 0;                     //各桁を1つずつ数値化
   int count 0;                     //10を何乗するかの添字
   int keisan;                        //数値に対して乗じる10*?の結果
   int kekka 0;                     //結果のため込み

                                      //文字列を1桁ずつ数値化する
   while *kazu != '\0'     
                                    
     suchi char_to_int *kazu );   //文字→数値
     keisan 1;                      //数値に対して乗じる10*?の結果
     for count; j++   
                                    //百の位ならkeisan==1*10*10==100
        keisan *= 10;
        
     kekka kekka suchi keisan;  //各桁を数値化した結果をため込み

     kazu++;
     count++;
   }

   if minus ==                   //マイナス符号の考慮
   {
     kekka *= (-1);
   }

   return kekka;
}


void int_to_str int i, char *s    //4数字→文字列      
                                    //数字が何桁でも対応する
   char taihi[20];
   char henkan[20];
   int 0,amari;

   if                       //マイナス符号のセット
   {
     *s '-';
     s++;  
     (-1);                    //マイナス値はプラス値に変換
              
   else if ==                 //0の考慮
   {
     taihi[j] int_to_char( );
     j++;
   

   for != 0; j++          //1の位からセット(0以外が対象)
                                       
     amari 10 ;
     taihi[j] int_to_char( amari ); 

     10;                 
   }
         
   taihi[j] '\0';

   strrev( henkan, taihi );           //文字列反転 

   for (j 0; henkan[j] != '\0'; j++       //正しい順序での文字列をセット
                                            //マイナス符号は初めで考慮済み   
     *s henkan[j];
     s++;   
           

    *s '\0';

}

                                      //5  10進演算を実行 
int calc int l_operand, char op, int r_operand  
     
  int kekka;
  switch op )
  
     case '+': kekka l_operand r_operand;  
           break;
     case '-': kekka l_operand r_operand;  
           break;
     case '*': kekka l_operand r_operand;  
           break;
     case '/': kekka l_operand r_operand;  
           break;
  }
  return kekka;
}


void strrev( char* s, char* )
                      //s:反転後  t:反転前
  int   strlen(t);  //入力文字数をjに入れる
  char* 1;  //入力文字の先頭アドレスから最終文字列の
                        //アドレスを算出
  int   0;          //カウンタ
  if(j != 0)
   
     while( )
      {
       *s *k;
       s++;  
       k--;
       m++;
      }
      *s '\0';
   }

 }

コメント

keronimo様

便利な関数であるprintf()をあえて使わせないと言うお題に取り組んでいると思われるので、あえて正解は書かずに、ヒントだけ書いてみようと思います。

http://www.cppll.jp/cppreference/

例えばこちらのページを参考にしながら、以下のことに注意して今一度考えを巡らせてみてはいかがでしょうか?
・アスキーコード表
・入出力関数:putchar()における引数の型
・入出力関数:puts()における引数の型

また、文法書から「型キャスト」の項目を確認されることもお奨めします。

蛇足ですが、今回お題とされている出力時の制約以外に制約がないのでしたら、stdlib.hで用意されている文字列操作関数に関して、使えるか否かを評価してみてはいかがでしょうか?このコードはもっと簡単になるかもしれませんよ。

どうぞがんばってください。

  • GoodJob
  • 0

ごめんなさい、意味があるか判りませんが、蛇足に追記です。 
「stdlib.h」→「stdlib.hをはじめとする標準Cライブラリ」 
と読み替えてください。

更に、今回のご質問ですが、printfを使わない場合の出力成型に関しての質問である可能性もあるのにようやく気づきました。main関数の最初にある以下の文を例のように変更した場合、どうなるかと言うのもヒントになるかと思います。
printf( "入力開始  例:-2*-9->enter\n" );

printf( "入力開始  例:-2*-9->enter: );

PS: 原点回帰も心地よいですね。EclipseにCDTも入れてしまおう。

  • GoodJob
  • 0

アドバイスありがとうございます。
テキストの内容が薄く、関数の使用例が分からずに困っています。
ヒントを参考にやってみます。


  • GoodJob
  • 0

keronimo様

>テキストの内容が薄く、関数の使用例が分からずに困っています。

どの様な理由からそのテキストを購入したor使うことになったのかは、私の視点からでは想像の域を出ません。使用例がわからないと言う事からC言語の制御構文などの言語仕様に重点を置いて、ライブラリに関してはあまり言及されていないものとお察しします。

今後、追加でテキストを購入される場合は・・・
1)自分がこれから何を学びたいのか目的を明確にする。
2)超大型書店など専門書を多く扱うお店に足を運ぶ。大学生協書籍部も悪くないと思います。即戦力を付けてから後付で論理・サイエンスの側面からの知識を得る場合は前者、逆の場合は後者を選ぶと良いように思えます。これは私個人の感想ですが、家電量販店付属の書籍部では良い本にめぐり合えた事はあまりありませんでした。
3)そこにあるでしょう大量の購入候補となる本に関してできる限り目を通して自分の要求に合う本を自費購入する。もし見つけることが出来ないのでしたら、時間の許す限り他の本屋も探してみる。
・・・事をお奨めします。上手に探せば長く手元に置いておける資料に出合えるかもしれません。

また、ネットの海をマンボウ状態になってプラプラしたところ、以下のページを発見いたしました。
 *Programing Place
  http://www.geocities.jp/ky_webid/index.html
この中の「C言語編」ですが、keronimo様のお手元にある資料の良い補完資料になりそうな気がします。
  C言語編
  http://www.geocities.jp/ky_webid/c/index.html

更新頻度も高く、練習問題とその回答まで用意してある優秀なページだというのが私の第一印象です。また、よく言及されるgets()の危険性なども書いてあり、実用に充分耐えうる資料だと思います。個人の力で作成されていると思いますが、その熱意に感服しています。

軽く探しただけなのでこれが本当にkeronimo様の要求に合うかは判りません。ネットの海を探せばもっと良い資料に出会えるかもしれません。使える資源は徹底的に使いましょう。

改めて、どうぞがんばってください。

  • GoodJob
  • 0

これでできるかな~と思った方法で簡単にできました。
文字列結合関数を使って、値・スペース・演算子・スペースと配列に入れて最後にputsで表示としました。

会社の研修グループがありまして、2ヶ月でCとC++を覚えて年内にツールを作るというスケジュールで動いています。もちろん言語の基礎がある事を前提ですが。
テキストは古いものをコピーして使っており、また全部の関数の使用例は載っていなくて当然かと思われます。

本日からC++に入りました。
また機会がありましたらお願いします。
ありがとうございました。

  • GoodJob
  • 0

keronimo様

まずは無事解決して何よりです。私のコメントは結果としてあまり必要なかったようですね。私自身にも別途利益が生じたコメントなので無問題です。

文字列→整数変換でマイナスの考慮の後、atio()すら使っておられなかったので、今回の問題はputchar()を連発して出力文字を制御させる、めまいのするような制約を受けているのでは?という想像すらしておりました。
strcat()が使えるのでしたら些かの注意で解決しますね。

C++はC側からその内部実装を見ると大変勉強になると考えています。是非とも良質な知識・技術を吸収して行って下さい。

私も知れば知るほど自分の無知や視点の偏りを思い知らされております。

改めて、今後もがんばってください。

  • GoodJob
  • 0

前へ 1 次へ

コメントする

[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。

[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。

ゲスト投稿者:ゲスト:

関連ソースコード・ノウハウを登録

PDFLib | A library for processing PDF on the fly プレゼン公開・共有サイト handsOut.jp オープンタイプ株式会社 チーム・マイナス6% - みんなで止めよう温暖化

ブックマークコメント