C言語作業NOTES


C言語の第11回の授業後の宿題NOTES【文字】車番号を編む2009年3月9日から、北京市は自動車の所有者が自分で乗用車を編むことを許可した「京N」で始まるナンバープレートの後5位.車番号を編む規則は以下の通りである:ナンバープレートの最後の1位は数字でなければならず、残りの4位は大文字と英語のアルファベットで2位でなければならない(アルファベットI、Oは使用不可).例えば、京NAB 999、京NC 9 D 99、京NE 99 F 9、京N 9 GH 99、京N 9 J 9 K 9、京N 99 LM 9など.入力:5位自作番号札出力:自作番号札が合法か否か判断
Q 1:自作番号札の最後の方が数字かアルファベットかどうかをどう判断しますか?A:この問題は最初は本当に困っていました.私は最初は大文字と小文字の対応するACIIコードの範囲で判断しましたが、その後、他の人のプログラムを探して、C言語の中で、文字が数字またはアルファベットであるか否かを判断する方法:if(n=‘9’)またはif((n>=‘A’)&(n<=‘Z’))のような単引用符と文字の形式を採用することができ、小文字は同じである.
Q 2:守秘用例が通らない場合はどうすればいいですか?A:ええ、実は問題を繰り返して、自分が条件を漏らしたかどうかを見ます.私のように、最初から「アルファベットI、Oは使えない」という項目が漏れていました.しかし、私が修正した後も、秘密保持の例があります.それから私はインターネットでナンバープレートのコード規則を探して、ナンバープレートの中で使用する数字は範囲があることを発見して、つまり“0-9”で、その時私はまだこの1本がどんな意味があるか分かりませんでした.しかし、私が本当に他の面で変更できない(ASCIIコードを「A」のような形式に変更した後)、数字の範囲を規定するのではないかと思います.(なにしろコンピュータはバカだ).そして、私はまた別の人が書いたプログラムを探して、彼が確かに数字の取値範囲を規定していることに気づいた.そして私もひょうたんを描いて、数字の範囲を規定して、これでやっと最後の秘密保持用例==.
Q 3:文字列の読み込みについての小さな反省:
1)Q:どうして最初はscanf()で文字列を読み込めなかったのですか.A:scanfで読み込むとき、scanf("%s",&bn[N])と書いたので、実際に、文字列の読み込みには「&」を付ける必要はないことを本をめくって知りました.コンパイラは配列名「bn」をポインタとして処理しているので、「&」を追加するのはかえって文法の間違いです.そしてそれをプラスする必要もありません[N].正しいフォーマットは「scanf("%s",bn);」です.
2)Q:なぜgets()関数で文字列を読み込むと、自動的にプログラムを実行してくれたのですか.A:gets()のカッコにgets(&a)と書いてあるので、scanfと同じ間違いで、正しいフォーマットも配列名を書くだけでいいです.「gets(bn);」.当時、この問題は長い間悩んでいたが、よく本を読んで、やっと自分の間違いを発見した.
3)Ⅰ.他の人のプログラムが私に啓発してくれた:プログラムはできるだけ設定するが、出口、つまりプログラム設計の過程で、出力の結果が2つの逆の場合、私たちは判断を補助する変数flag(あるいはIsPrimeのような)を導入して、それらをBOOLのタイプとして判断することができて、“if(flag);printf();else printf();など、出力の結果を選択します.栗を挙げて、私がこのプログラムを書き始めたとき、最初に最後の1人が数字かどうかを判断したとき、すぐに「printf("ok.");」とつなぎました.それからプログラム全体、私は判断するとすぐにprintf()になって、うんざりして、プログラムを見ていても長いです.その後、私は直接flagを使って、printf()をプログラムの終わりに統一して移して、このようにさわやかに見えるだけではなくて、翁恺先生の話を聞いて、大型プログラムを書く時に間違いを犯しにくいと言いました.
Ⅱ.文字列入力時のコンパイラの限界について話します:これはリアルタイムでその数字の範囲の少しの発見と思考に続いています.最初は、コンパイラが文字列を読み込むときに、1つの数字が1つのユニットに格納されていると思っていました.しかし、その後、範囲を規定するかどうかを確認したとき、10を入力した結果、プログラムは正常に実行できることが分かった.したがって、コンパイラは文字列を読み込むときに、単位数字を1つのユニットに格納するかどうか、入力したデータを1つのユニットに格納するかどうかという原則を持っているはずです.しかし私が少し理解できないのは、私が入力したデータが1桁か2桁かをどのように判断しますか?(または高位数)のは?この中にランダム性があると思います.それから範囲を決めないと、今は秘密保持の用例が過ぎません.後で大きなプログラムを書くと、プログラムが崩壊する可能性があります.だから、コンパイラのこのような盲目性とランダム性は、非常に恐ろしいです.これは私にデータの値範囲の問題をもっと考えなければならないことに気づきました..また以前ifを書いたとき、elseをつけなかったので、コンパイラは馬鹿で用例ができませんでした.elseを書いてからどうすればいいかを書かなければなりません.それは用例を過ぎました.だから、コンパイラは本当に愚かで、覚えて、覚えています.
#include 
#include 
#define N 5
#define j 2
#define Board_number bn
int main(void)
{ 
 int i, cnt, flag;
 char bn[N + 1];//    
 scanf("%s", bn);
 //            
 if((bn[N - 1] > '9') || (bn[N - 1] < '0')){
  flag = 0;
  }
 //                  (I,O  ) 
 else {
  cnt = 0;
  for(i = 0; i < (N - 1); i++){
  if((bn[i] >= 'A') && (bn[i] <= 'Z') && (bn[i] != 'I') && (bn[i] != 'O'))
  cnt ++;
  }
   if(cnt == j){
   flag = 1;
  }
  else{
   flag = 0;
  }
 }
  if(flag){
   printf("ok.
");   }   else {    printf("no.
");   }  return 0; }