第一篇:國際c語言亂碼大賽經(jīng)典之作
這篇是為C寫的,不過作為代碼閱讀習(xí)慣和能力的培養(yǎng),轉(zhuǎn)自人牲一笑的bolg。http://apps.hi.baidu.com/share/detail/16373609 // 原始代碼
#include iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' nr'/ :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!')}+}{rl#'{n' ')# }'+}##(!/”):t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1):0 t<3 ? main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)) :1 , t<_ ? main(t+1,_,a) :3 , main(-94,-27+t,a)&&t==2 ? _<13 ? main(2,_+1,“%s %d %dn”) :9 :16 :t<0 ? t<-72 ? main(_,t,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”) :t<-50 ? _==*a ? putchar(31[a]) :main(-65,_,a+1) :main((*a=='/')+t,_,a+1) :0 main(2,2,“%s”) :*a=='/'||main(0,main(-61,*a,“!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m.vpbks,fxntdCeghiry”),a+1);} // 翻譯成常規(guī)語言 // condition ? true : false;a,b,c generate step #include if(t<3) main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)); else 1; if(t<_) main(t+1,_,a); else 3; if(main(-94,-27+t,a)&&t==2){ if(_<13) return main(2,_+1,“%s %d %dn”); else return 9; }else return 16;}else{ if(t<0){ if(t<-72){ return main(_,t,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); }else{ if(t<-50){ if(_==*a) return putchar(31[a]);// pointer compile a[b] with b[a] else return main(-65,_,a+1); }else{ return main((*a=='/')+t,_,a+1); } } }else{ if(0 return main(2,2,“%s”); else // condition compile step a||b return *a=='/'|| main(0,main(-61,*a,“!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m.vpbks,fxntdCeghiry”),a+1); } } } // 除去不需要的,重構(gòu)if語句 #include if(t<3) main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)); if(t<_) main(t+1,_,a); if(main(-94,-27+t,a)&&t==2){ if(_<13) return main(2,_+1,“%s %d %dn”); else return 9; }else return 16;}else if(t<0){ // 根據(jù)語義,可進(jìn)一步重構(gòu) if(t<-72){ return main(_,t,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); }else if(t<-50){ if(_==*a) return putchar(a[31]);// 指針編譯原理a[b]和b[a],注意是char* else return main(-65,_,a+1); }else{ return main((*a=='/')+t,_,a+1); } }else if(0 return main(2,2,“%s”);}else{ if(!(*a=='/')) return i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m.vpbks,fxntdCeghiry“),a+1); else main(0,main(-61,*a,”!ek;dc return 1;// 等于(*a=='/')} } // 編譯環(huán)境main入口,CRTO.C for main(__argc, __argv, _environ);// 方法的編譯原來,返回值的寄存器狀態(tài) // 變量的類型轉(zhuǎn)換reinterpret_cast // 使用一個新的main方法,將舊的用一個新方法'decode'表示 // 根據(jù)題設(shè),本程序執(zhí)行方式為無命令參數(shù),即,argc==1 // 變量的聲名規(guī)約,改變變量名以方便理解 // 進(jìn)一步重構(gòu)if語句 #include if(arg1<3) decode(-79,-13,sCodec+decode(-87,1-arg2,decode(-86,0,sCodec+1)+sCodec)); if(arg1 decode(arg1+1,arg2,sCodec); if(decode(-94,-27+arg1,sCodec)&&arg1==2){ // 內(nèi)部遞歸,無后續(xù)分支,可展平為遞推方式 if(arg2<13) return decode(2,arg2+1,“%s %d %dn”); else return 9; }else return 16;}else if(arg1<-72){ // 可根據(jù)arg1范圍代入。本條件代入后略 return decode(arg2,arg1,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”);}else if(arg1<-50){ // 內(nèi)部遞歸,無后續(xù)分支,可展平為遞推方式 if(arg2==*sCodec) return putchar(sCodec[31]); else return decode(-65,arg2,sCodec+1);}else if(arg1<0){ // 內(nèi)部遞歸,無后續(xù)分支,可展平為遞推方式 return decode((*sCodec=='/')+arg1,arg2,sCodec+1);}else if(0 return decode(2,2,“%s”);}else{ // arg1 == 0 if(!(*sCodec=='/')) // 內(nèi)部遞歸,無后續(xù)分支,可展平為遞推方式 return decode(0,decode(-61,*sCodec,“!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m.vpbks,fxntdCeghiry”),sCodec+1); else return 1;} } int main(int argc, char* argv[], char** _environ){ return decode(argc,(int)argv,(char*)_environ);} // 分析出遞歸頂層返回值。 // 注意所有return的含義,9/16/1/putchar(),Non Zero-> TRUE // 分析arg1的內(nèi)容,重構(gòu)方法,有些坳,自己試著理解吧 #include if(arg1<3){ decode(0,-86,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); decode(1-arg2,-87,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); decode(-13,-79,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); } if(arg1 decode(arg1+1,arg2,sCodec); decode(-27+arg1,-94,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); if(arg1==2){ while(arg2<13){ arg2 ++; sCodec = “%s %d %dn”; // 上方條件代入 if(arg1<3){ decode(0,-86,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); decode(1-arg2,-87,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); decode(-13,-79,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); } if(arg1 decode(arg1+1,arg2,sCodec); decode(-27+arg1,-94,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); } } }else if(arg1<-50){ // 判斷條件可達(dá),取舍 char* s = sCodec; while(!(arg2==*s)){ s ++; } putchar(s[31]);}else if(arg1<0){ for(;arg1<0;arg1+=(*sCodec=='/')) sCodec ++; decode(0,arg2,sCodec+1);// 條件合并 }else if(arg1 == 0){ while(!(*sCodec=='/')){ // 條件合并 decode(-61,*sCodec,“!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m.vpbks,fxntdCeghiry”); sCodec ++; } } return 1;// return TRUE only } int main(int argc, char* argv[], char** _environ){ decode(2,2,“%s”);return 9;} // 分析條件,重構(gòu)2 #include if(arg1<3){ // arg1 <= 0 decode(0,-86,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); decode(1-arg2,-87,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); decode(-13,-79,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); } if(arg1 // 1 < arg1 < 13(max arg2) decode(arg1+1,arg2,sCodec); // arg1 <= 0,下同 decode(-27+arg1,-94,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); if(arg1==2){ while(arg2<13){ arg2 ++; sCodec = “%s %d %dn”; if(arg1<3){ decode(0,-86,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); decode(1-arg2,-87,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); decode(-13,-79,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); } if(arg1 decode(arg1+1,arg2,sCodec); decode(-27+arg1,-94,“@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”); } } }else if(arg1<=0){ // 單一條件代碼組 int border =(arg1<0); for(;arg1<0;arg1+=(*sCodec=='/')) sCodec ++; if(border) sCodec ++;// 邊界條件,注意 while(!(*sCodec=='/')){ char* s = “!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m.vpbks,fxntdCeghiry”; while(!(*sCodec==*s)){ s ++; } putchar(s[31]); sCodec ++; } } return 1;} int main(int argc, char* argv[], char** _environ){ decode(2,2,“%s”);return 9;} // 分析arg2代碼流向,重構(gòu)3 // tip.arg1 in function decode always '> 1' // the usage of arg1, arg2, sCodec.Can be omitted.#include sCodec = “@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”;int border =(arg1<0); for(;arg1<0;arg1+=(*sCodec=='/')) sCodec ++;if(border) sCodec ++;while(!(*sCodec=='/')){ char* s = “!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m.vpbks,fxntdCeghiry”; while(!(*sCodec==*s)){ s ++; } putchar(s[31]); sCodec ++;} } int decode(int arg1,int arg2){ // 考慮初始條件的 arg1 == 2, arg2 == 2,代碼合并 // 內(nèi)部遞歸,展平為遞推方式,注意邊界條件和遞歸嵌套的調(diào)用特點 if(arg1<3){ decode2(0); decode2(1-arg2); decode2(-13);} if(arg1 decode(arg1+1,arg2);decode2(-27+arg1);if(arg1==2){ while(arg2<13){ arg2 ++; if(arg1<3){ decode2(0); decode2(1-arg2); decode2(-13); } if(arg1 decode(arg1+1,arg2); decode2(-27+arg1); } } return 1;} int main(int argc, char* argv[], char** _environ){ decode(2,2);return 9;} // 最終結(jié)果 #include sCodec = “@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”;int border =(arg1<0); for(;arg1<0;arg1+=(*sCodec=='/')) sCodec ++;if(border) sCodec ++;while(!(*sCodec=='/')){ char* s = “!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m.vpbks,fxntdCeghiry”; while(!(*sCodec==*s)){ s ++; } putchar(s[31]); sCodec ++;} } int decode(){ int arg1, arg2;for(arg2=2;arg2<=13;arg2++){ decode2(0); decode2(1-arg2); decode2(-13); for(arg1=arg2;arg1>=2;arg1--) decode2(-27+arg1);} return 1;} int main(int argc, char* argv[], char** _environ){ decode();return 9;} // 額外寫段代碼,看一下。對照之后推一下原始代碼的結(jié)果吧。#include :'d*'3,}{w+K w'K:'+}e#';dq#'l r{#w'r q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#';nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i;:{nl]'/*{q#'ld;r'}{nlwb!/*de}'c;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!nr'/ ')}+}{rl#'{n' ')# }'+}##(!/”;char b[]=“!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m.vpbks,fxntdCeghiry”;for(int i=0;i for(int j=0;j if(a[i]==b[j]){ a[i]=b[j+31]; break; } } printf(“%s”,a);return 1;} On the /first/second/third/fourth/fifth/sixth/seventh/eigth/ninth/tenth/eleventh/twelfth/ day of Christmas my true love gave to me /twelve drummers drumming, /eleven pipers piping, /ten lords a-leaping, /nine ladies dancing, /eight maids a-milking, /seven swans a-swimming, /six geese a-laying, /five gold rings; /four calling birds, /three french hens, /two turtle doves and /a partridge in a pear tree./ 第1題 歌手大賽問題 題目:青年歌手參加歌曲大獎賽,有10個評委進(jìn)行打分,試編程求這位選手的平均得分。3種方法:分別要求使用到排序,數(shù)組,函數(shù),指針。分析:這道題的核心程序是排序,將評委打的10個分?jǐn)?shù)利用數(shù)組按增序(或降序)排列,計算數(shù)組中除了第一個和最后一個分?jǐn)?shù)以外的數(shù)以外的數(shù)的平均分 答案: #include 2. 12.抓交通肇事犯 一輛卡車違反交通規(guī)則,撞人后逃跑?,F(xiàn)場有三人目擊事件,但都沒有記住車號,只記下車號的一些特征。甲說:牌照的前兩位數(shù)字是相同的;乙說:牌照的后兩位數(shù)字是相同的,但與前兩位不同;丙是數(shù)學(xué)家,他說:四位的車號剛好是一個整數(shù)的平方。請根據(jù)以上線索求出車號。*問題分析與算法設(shè)計 按照題目的要求造出一個前兩位數(shù)相同、后兩位數(shù)相同且相互間又不同的整數(shù),然后判斷該整數(shù)是否是另一個整數(shù)的平方。*程序與程序注釋 #include 3. 14.怎樣存錢利最大 假設(shè)銀行整存整取存款不同期限的月息利率分別為: 0.63% 期限=1年 0.66% 期限=2年 0.69% 期限=3年 0.75% 期限=5年 0.84% 期限=8年 利息=本金*月息利率*12*存款年限。現(xiàn)在某人手中有2000元錢,請通過計算選擇一種存錢方案,使得錢存入銀行20年后得到的利息最多(假定銀行對超過存款期限的那一部分時間不付利息)。*問題分析與算法 為了得到最多的利息,存入銀行的錢應(yīng)在到期時馬上取出來,然后立刻將原來的本金和利息加起來再作為新的本金存入銀行,這樣不斷地滾動直到滿20年為止,由于存款的利率不同,所以不同的存款方法(年限)存20年得到的利息是不一樣的。分析題意,設(shè)2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,則到期時存款人應(yīng)得到的本利合計為: 2000*(1+rate1)i1*(1+rate2)i2*(1+rate3)i3*(1+rate5)i5*(1+rate8)i8 其中rateN為對應(yīng)存款年限的利率。根據(jù)題意還可得到以下限制條件: 0<=i8<=2 0<=i5<=(20-8*i8)/5 0<=i3<=(20-8*i8-5*i5)/3 0<=i2<=(20-8*i8-5*i5-3*i3)/2 0<=i1=20-8*i8-5*i5-3*i3-2*i2 可以用窮舉法窮舉所有的i8、i5、i3、i2和i1的組合,代入求本利的公式計算出最大值,就是最佳存款方案。*程序與程序注釋 #include 4. 51.誰是竊賊 公安人員審問四名竊賊嫌疑犯。已知,這四人當(dāng)中僅有一名是竊賊,還知道這四人中每人要么是誠實的,要么總是說謊的。在回答公安人員的問題中: 甲說:“乙沒有偷,是丁偷的。” 乙說:“我沒有偷,是丙便的?!?丙說:“甲沒有偷,是乙偷的?!?丁說:“我沒有偷。” 請根據(jù)這四人的答話判斷誰是盜竊者。*問題分析與算法設(shè)計 假設(shè)A、B、C、D分別代表四個人,變量的值為1代表該人是竊賤。由題目已知:四人中僅有一名是竊賤,且這四個人中的每個人要么說真話,要么說假話,而由于甲、乙、丙三人都說了兩句話:“X沒偷,X偷了”,故不論該人是否說謊,他提到的兩人中必有一人是小偷。故在列條件表達(dá)式時,可以不關(guān)心誰說謊,誰說實話。這樣,可以列出下列條件表達(dá)式: 甲說:”乙沒有偷,是丁偷的?!? B+D=1 乙說:“我沒有偷,是丙偷有?!? B+C=1 丙說:“甲沒有偷,是乙偷的?!? A+B=1 丁說:“我沒有偷?!? A+B+C+D=1 其中丁只說了一句話,無法判定其真假,表達(dá)式反映了四人中僅有一名是竊賤的條件。*程序與程序注釋 #include 69.魔術(shù)師的猜牌術(shù)(1)魔術(shù)師利用一副牌中的13張黑桃,預(yù)先將它們排好后迭在一起,牌面朝下。對觀眾說:我不看牌,只數(shù)數(shù)就可以猜到每張牌是什么,我大聲數(shù)數(shù),你們聽,不信?你們就看。魔術(shù)師將最上面的那張牌數(shù)為1,把它翻過來正好是黑桃A,將黑桃A放在桌子上,然后按順序從上到下數(shù)手上的余牌,第二次數(shù)1、2,將第一張牌放在這迭牌的下面,將第二張牌翻過來,正好是黑桃2,也將它放在桌子上,第三次數(shù)1、2、3,將前面兩張依次放在這迭牌的下面,再翻第三張牌正好是黑桃3。這樣依次進(jìn)行將13張牌全翻出來,準(zhǔn)確無誤。問魔術(shù)師手中的牌原始順序是怎樣安排的? *問題分析與算法設(shè)計 題目已經(jīng)將魔術(shù)師出牌的過程描述清楚,我們可以利用倒推的方法,很容易地推出原來牌的順序。人工倒推的方法是:在桌子上放13空盒子排成一圈,從1開始順序編號,將黑桃A放入1號盒子中,從下一個空盒子開始對空的盒子計數(shù),當(dāng)數(shù)到第二個空盒子時,將黑桃2放入空盒子中,然后再從下一個空盒子開始對空盒子計數(shù),順序放入3、4、5...,直到放入全部3張牌。注意在計數(shù)時要跳過非空的盒子,只對空盒子計數(shù)。最后牌在盒子中的順序,就是魔術(shù)師手中原來牌的順序。這種人工的方法是行之有效的,計算機(jī)可以模擬求解。*程序與程序注釋 #include 75.10個小孩分糖果 十個小孩圍成一圈分糖果,老師分給第一個小孩10塊,第二個小孩2塊,第三個小孩8塊,第四個小孩22塊,第五個小孩16塊,第六個小孩4塊,第七個小孩10塊,第八個小孩6塊,第九個小孩14塊,第十個小孩20塊。然后所有的小孩同時將手中的糖分一半給右邊的小孩;糖塊數(shù)為奇數(shù)的人可向老師要一塊。問經(jīng)過這樣幾次后大家手中的糖的塊數(shù)一樣多?每人各有多少塊糖? *問題分析與算法設(shè)計 題目描述的分糖過程是一個機(jī)械的重復(fù)過程,編程算法完全可以按照描述的過程進(jìn)行模擬。*程序與程序注釋 #include 學(xué)C語言有感 姓 名: 李文麗 學(xué) 號:034108048 班 級:083411 指導(dǎo)老師:張印 2009年12月 學(xué)C語言有感 第1頁 學(xué)C語言有感 摘要:C語言既有高級語言的特點,又具有匯編語言的特點;既能用來編寫不依賴計算機(jī)硬件的應(yīng)用程序,又能用來編寫各種系統(tǒng)程序;是一種受歡迎、應(yīng)用廣泛的程序設(shè)計語言C語言版本。首先按照學(xué)習(xí)C語言的順序分別介紹了我在學(xué)習(xí)C語言過程中所遇到的問題,敘述了在C語言學(xué)習(xí)過程,學(xué)習(xí)C語言的重點,難點,以及易出錯的地方,并且用具體的案例做解釋。然后闡述了學(xué)習(xí)C語言的體會:C語言的語法部分是學(xué)好C語言的基礎(chǔ),學(xué)習(xí)c語言不能停留在學(xué)習(xí)它的語法規(guī)則,只有通過上機(jī)才能檢驗自己是否掌握c語言、自己編寫的程序是否能夠正確地解題。最后總結(jié)學(xué)習(xí)c語言,既是件有趣的事情,又是件艱苦的事情。靜下心來學(xué)習(xí),我們會有所收獲,更會其樂無窮的。 關(guān)鍵詞:運算符 表達(dá)式 優(yōu)先級 語句 變量 一、C語言的學(xué)習(xí)中的問題 在這個學(xué)期里,我們工商管理專業(yè)的學(xué)生在專業(yè)老師張印的帶領(lǐng)下進(jìn)行了實用c語言簡明教程的學(xué)習(xí)。經(jīng)過這一個學(xué)期的學(xué)習(xí),我們已經(jīng)對c語言這門課程有了一定的了解。C語言是一門最基礎(chǔ)的語言,也是一門廣泛使用的語言。所以學(xué)習(xí)C語言義不容辭 首先,在學(xué)習(xí)的最初幾節(jié)課,老是主要向我們講述了C語言的特點,學(xué)習(xí)C語言的意義,以及學(xué)習(xí)C語言能給我們所帶來的方便優(yōu)越之處。 C語言是一種結(jié)構(gòu)化語言。它層次清晰,簡潔緊湊、靈活方便,便于按模塊化方式組織程序,易于調(diào)試和維護(hù)。C語言的表現(xiàn)能力和處理能力極強(qiáng),語法限制不太嚴(yán)格、程序設(shè)計自由度大。它不僅具有豐富的運算符和數(shù)據(jù)類型,便于實現(xiàn)各類復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。它還可以直接訪問內(nèi)存的物理地址,進(jìn)行位(bit)一級的操作,適用范圍大,可移植性好??傊?,C語言既有高級語言的特點,又具有匯編語言的特點;既是一個成功的系統(tǒng)設(shè)計語言,有是一個使用的程序設(shè)計語言;既能用來編寫不依賴計算機(jī)硬件的應(yīng)用程序,又能用來編寫各種系統(tǒng)程序;是一種受歡迎、應(yīng)用廣泛的程序設(shè)計語言C語言版本。 當(dāng)然,C語言也有自身的不足,比如:C語言的語法限制不太嚴(yán)格,對變量的類型約束不嚴(yán)格,影響程序的安全性,對數(shù)族下標(biāo)越界不作檢查等。從應(yīng)用的角度,C語言比其他高級語 學(xué)C語言有感 第2頁 言較難掌握。 下面我給大家說一說我在學(xué)習(xí)C語言過程中所遇到的問題。 在第二章,我們學(xué)習(xí)的是數(shù)據(jù)描述與基本操作。在這一章,我們主要講了數(shù)據(jù)類型,運算符與表達(dá)式,和不同類型數(shù)據(jù)間的混合運算。其中比較難以理解和掌握的是自加、自減運算符。 自加、自減運算符作用是使變量的值增1或減1;當(dāng)符號在前,變量在后,++i/--i 變量的值先加1或先減1,然后再參與其它運算。當(dāng)符號在后,變量在前,++i/--i 變量的值先參與其它運算,然后再加1或先減1。例如: # include 1.自加運算符(++)和自減運算符(--)只能用于變量,而不能用于常量或表達(dá)式,如6++或(a+b)++都是不合法的。因為5是常量,常量的值是不能改變的。(a+b)++也不可能實現(xiàn),假如a+b的值為5,那么自加后得到的6放在什么地方? 2.++和--的結(jié)合方向是“自右向左”。負(fù)號運算符和++運算符同優(yōu)先級,而結(jié)合方向為“自右向左”,即它相當(dāng)于-(i++),如果有printf(“%d”,-i++),則先取出i的值3,輸出-i的值-3,然后i增值為4。注意-(i++)是先用i的原值3加上負(fù)號輸出-3,再對i加1,不要認(rèn)為加完1后再加負(fù)號,輸出-4,這是不對的。 例如,x=a*b+c%d 無所謂; 例如,a=3;y=a*++a;不同的編譯系統(tǒng)有兩種處理方式,結(jié)果不同: A)按從左到右的順序處理為:先取a的值3,再計算++a,a的值 自增為4,子表達(dá)式++a的值也為4,所以相乘的結(jié)果為12; 學(xué)C語言有感 第3頁 B)按從右到左的順序處理為:先計算++a,a的值自增為4,子表達(dá)式++a的值也為4,再取a的值為4,所以相乘的結(jié)果為16。 在第三章我們講的是順序結(jié)構(gòu)程序設(shè)計,其中所涉及的主要問題說優(yōu)先級。 說到優(yōu)先級什么叫優(yōu)先級?比方說,我們在公交車終點站排座隊時總會遇到70歲以上的老人不需要排隊就能上車的情景,這就是優(yōu)先級的涵義。C程序在運行時也象排隊坐車一樣,首先照顧那些優(yōu)先級高的運算符,若是優(yōu)先級相同,那么就象遇到兩位(或兩位以上)70歲以上的老人那樣,讓他們依次上車。 下面我們通過幾個例子來說明: (1)3*20/4%10 這個表達(dá)式中出現(xiàn)3種運算符,是同級運算符,運算順序按從左至右結(jié)合,因此先計算3 * 20=60,然后被4除,結(jié)果為15,最后是%(求余數(shù))運算,所以表達(dá)式的最終結(jié)果為15%10 = 5(2)a = 3;b = 5;c =++ a* b ;d =a + +* b; 例子中的“;”是C語言的語句分隔符,執(zhí)行順序為從左到右,第1條語句執(zhí)行后a的值為3,第2條語句執(zhí)行后b的值為5,第3條語句中有兩個運算符前置+ +和*,按表中所列順序,+ +先執(zhí)行,*后執(zhí)行,所以+ + a執(zhí)行后,a的值為4,由于+ +為前置運算,所以a的值4參與運算,C的值為20,最后執(zhí)行第4條語句,由于a + +為后置運算,所以a值為4參與運算,使得d的值仍為20,而a參與運算后其值加1,值為5。這個例子執(zhí)行后,a的值為5,b的值為5,c的值為20,d的值也是20。(3)a = 3,b = 5,b+ = a,c = b* 5 例子中的“,”是逗號結(jié)合運算,上式稱為逗號表達(dá)式,自左向右結(jié)合,最后一個表達(dá)式的結(jié)果值就是逗號表達(dá)式的結(jié)果,所以上面的逗號表達(dá)式結(jié)果為40,a的值為3,b的值為8,c的值為40。 但是C語言中的優(yōu)先級的運算并不是千篇一律的,只能說是在大多數(shù)情況下,有些運算符的優(yōu)先級有其自己的特點,因此這點大家要注意。例如條件表達(dá)式:條件?結(jié)果1:結(jié)果2,這種表達(dá)式很多朋友都知道,它的作用與IF…ELSE…條件判斷語句很雷同,它運算時的優(yōu)先級就不是按照C語言的規(guī)則來完成的。所以說對于優(yōu)先級各位編程愛好者一定靈活掌握,不要死記硬背。 第三四章的選擇結(jié)構(gòu)程序設(shè)計和循環(huán)結(jié)構(gòu)設(shè)計說我們這學(xué)期所學(xué)內(nèi)容的重點。在這里,學(xué)者結(jié)構(gòu)程序設(shè)計比較簡單,我們就不多說了,主要談一下循結(jié)構(gòu)環(huán)程序設(shè)計。 學(xué)C語言有感 第4頁 循環(huán)結(jié)構(gòu)可以減少源程序重復(fù)書寫的工作量,用來描述重復(fù)執(zhí)行某段算法的問題,這是程序設(shè)計中最能發(fā)揮計算機(jī)特長的程序結(jié)構(gòu),C語言中提供四種循環(huán),即goto循環(huán)、while循環(huán)、do –while循環(huán)和for循環(huán)。四種循環(huán)可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提昌用goto循環(huán),所以下面我們重點講解另外的三種循環(huán)。 用while和do—while循環(huán)時,循環(huán)變量的初始化的操作應(yīng)在循環(huán)體之前,而for循環(huán)是在語句1中進(jìn)行的;while 循環(huán)和for循環(huán)都是先判斷表達(dá)式,后執(zhí)行循環(huán)體,而do—while循環(huán)是先執(zhí)行循環(huán)體后判斷表達(dá)式,也就是說do—while的循環(huán)體最少被執(zhí)行一次,而while 循環(huán)和for就不一定了。這三種循環(huán)都可以用break語句跳出循環(huán),用continue語句結(jié)束本次循環(huán),而goto語句與if構(gòu)成的循環(huán),不能用break和 continue語句進(jìn)行控制。這三種結(jié)構(gòu)并不是彼此孤立的,在循環(huán)中可能出現(xiàn)分支、順序結(jié)構(gòu),分支中也可能出現(xiàn)循環(huán)、順序結(jié)構(gòu)而把循環(huán)、分支看成一個語句,它又是構(gòu)成順序結(jié)構(gòu)的一個元素,因此這三種結(jié)構(gòu)相互結(jié)合,就能實現(xiàn)各種算法,設(shè)計出解題程序,但若是很大的題目,這樣編出的程序往往很長,重復(fù)結(jié)構(gòu)多,并且可閱讀性差,因此我們常將C程序設(shè)計成模塊化結(jié)構(gòu)。 二、C語言學(xué)習(xí)的重點、難點 針對我個人而言,在C語言學(xué)習(xí)過程,學(xué)習(xí)C語言的重點,難點,以及易出錯的地方主要有以下幾個方面: 如果對幾個變量賦予同一個初值,應(yīng)寫成: int a=3,b=3,c=3;表示a、b、c的初值都是3。不能寫成: int a=b=c=3;2 強(qiáng)制類型轉(zhuǎn)換其一般形式為(類型名)(表達(dá)式)表達(dá)式應(yīng)該用括號括起來。如(int)(x+y)表示將x+y的值轉(zhuǎn)換成整形如果寫成(int)x+y則表示將x轉(zhuǎn)換成整形,然后與y相加。使用scanf函數(shù)注意的問題: ①“格式控制”后面應(yīng)當(dāng)是變量地址,而不應(yīng)是變量名。如 scanf(“%d”,a)是不對的,應(yīng)改為scanf(“%d”,&a);②scanf函數(shù)格式控制最后面不能有n否則將沒有結(jié)果輸出如scanf(“%dn”,&a);是不對的。③輸入數(shù)據(jù)時不能規(guī)定精度,如scanf(“%7.2f”),&a);是不合法的 ④如果在%后有一個“*”附加說明符,表示跳過它指定的列數(shù)。 學(xué)C語言有感 第5頁 三、學(xué)習(xí)c語言的體會 在經(jīng)過了一個學(xué)期的學(xué)習(xí)之后,對于學(xué)習(xí)c語言心得體會也總結(jié)了一下: 1、既然是一門語言,他就漢語,英語一樣,都有自己的語法規(guī)則,學(xué)習(xí)一門語言,就是要按照它的語法來編程。C語言的語法部分是學(xué)好C語言的基礎(chǔ),只有學(xué)好了這些語法,才會寫程序,看程序。所以對一個初學(xué)者來說,加深對課堂講授內(nèi)容的理解,要扎實地熟悉每一個語法,并能根據(jù)這些語法來編程。 2、課堂上要講授許多關(guān)于c語言的語法規(guī)則,聽起來十分枯燥無味,也不容易記住死記硬背是不可取的。然而要使用c語言這個工具解決實際問題,又必須掌握它。通過多次上機(jī)練習(xí),對于語法知識有了感性的認(rèn)識,加深對它的理解,在理解的基礎(chǔ)上就會自然而然地掌握c語言的語法規(guī)定。對于一些內(nèi)容自己認(rèn)為在課堂上聽懂了,但上機(jī)實踐中會發(fā)現(xiàn)原來理解的偏差,這是由于大部分學(xué)生是初次接觸程序設(shè)計,缺乏程序設(shè)計的實踐所致。 3、學(xué)習(xí)c語言不能停留在學(xué)習(xí)它的語法規(guī)則,而是利用學(xué)到的知識編寫c語言程序,解決實際問題。即把c語言作為工具,描述解決實際問題的步驟,由計算機(jī)幫助我們解題。只有通過上機(jī)才能檢驗自己是否掌握c語言、自己編寫的程序是否能夠正確地解題。學(xué)習(xí)C語言是沒有什么捷徑的,打好基礎(chǔ),做好每章的練習(xí)才是關(guān)鍵。尤其是書本里的習(xí)題,不能因為簡單就不去實踐,學(xué)習(xí)C語言,乃至于學(xué)習(xí)所有的電腦知識都是一樣的,實踐練習(xí)永遠(yuǎn)處于最為重要的地位,須知電腦是要實際操作的,對于C語言,更是要是把這個程序自己編出來并且運行成功,知識點才記得最為深刻。 通過上機(jī)實驗來驗證自己編制的程序是否正確,恐怕是大多數(shù)同學(xué)在完成老師作業(yè)時的心態(tài)。但是在程序設(shè)計領(lǐng)域里這是一定要克服的傳統(tǒng)的、錯誤的想法。因為在這種思想支配下,可能你會想辦法去“掩蓋”程序中的錯誤,而不是盡可能多地發(fā)現(xiàn)程序中存在的問題。自己編好程序上機(jī)調(diào)試運行時,可能有很多你想不到的情況發(fā)生,通過解決這些問題,可以逐步提高自己對c語言的理解和程序開發(fā)能力。學(xué)習(xí)c語言更為重要的是掌握編程的思想,如何用簡捷的方法解決一個問題。同樣做一個循環(huán)問題,可能有人要做300次循環(huán),而有的人要做100次,這就是差距。平時,我們學(xué)習(xí)的時候要注意掌握每個概念,當(dāng)然理論的學(xué)習(xí)是離不開實踐的,尤其是c語言,需要你編寫大量的程序,最初可以學(xué)著別人的程序打,慢慢就應(yīng)該獨立出來,把自己的想法用c語言描述出來,這是一件十分快樂的事情。建議初學(xué)者不要看高級編程,先勤寫代碼、多看代碼、培 學(xué)C語言有感 第6頁 養(yǎng)風(fēng)格、熟悉語法、最關(guān)鍵的還是把握思想。當(dāng)你能夠信手拈來的時候,你的c語言才可以說學(xué)會了。一定要養(yǎng)成自己獨立寫完一個程序的能力,這樣可以有一種成就感。不斷培養(yǎng)這種成就感,循序漸進(jìn),進(jìn)步是自然的事情。 四、總結(jié) 學(xué)習(xí)c語言,既是件有趣的事情,又是件艱苦的事情。說它有趣,是因為從中你能得到快樂,能使你的計算機(jī)整體水平上升一大步。說它艱苦,是因為學(xué)習(xí)它的過程比起學(xué)習(xí)其他計算機(jī)知識,要難得多 C語言只是一門計算機(jī)語言,說到底就是一種工具。它的用處就是可以讓你用它編出能夠運行的程序來,而這些程序可以實現(xiàn)某些人需要的功能。人通過學(xué)習(xí)c語言也可以更加深入的了解計算機(jī),所以很多人都把c語言作為計算機(jī)入門的第一門語言來學(xué)習(xí),因為他學(xué)習(xí)起來相對簡單一些。至于實際的意義,無非是讓你多學(xué)會一門技能,讓你更加深入對計算機(jī)的了解,為學(xué)習(xí)其他計算機(jī)語言打下好的基礎(chǔ)。 學(xué)習(xí)最好抱著一種踏踏實實的心態(tài),老是想著有什么實際的好處并不會促進(jìn)我們的學(xué)習(xí),因為知識對人的影響是潛移默化的,靜下心來學(xué)習(xí)吧,我相信我們會有收獲的!而且如果你真的用心學(xué)習(xí),會發(fā)現(xiàn)學(xué)起來越來越有意思,也會給你帶來無窮的樂趣的! 學(xué)C語言有感 第7頁 參考文獻(xiàn): [1] 3 沈其益等編著,棉花病害——基礎(chǔ)理論與防治,北京:科學(xué)出版社,1992.7 [2] 3 沈其益、張三等編著,棉花病害——基礎(chǔ)理論與防治,北京:科學(xué)出版社,1992.7。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。參考文獻(xiàn)(不少于10篇,中文參考文獻(xiàn)不少于7篇,英文不少于3篇) 學(xué)C語言有感 第8頁 學(xué)C語言有感 第9頁 如何學(xué)C語言 (一)“項目驅(qū)動”式教學(xué) 目前最著名、最有影響、應(yīng)用最廣泛的windows、linux和UNIX三個操作系統(tǒng)都是用C語言編寫的。0S是計算機(jī)系統(tǒng)(由軟硬件兩個子系統(tǒng)構(gòu)成)的核心和靈魂,它是軟件中最龐大最復(fù)雜的系統(tǒng)軟件。既然如此龐大復(fù)雜的0S都可以用c語言編寫,從狹義而言,還有什么系統(tǒng)軟件和應(yīng)用軟件不能用c語言編寫呢?由此可以肯定的說,c語言是一門十分優(yōu)秀而又重要的語言。 c語言程序設(shè)計是過程性程序設(shè)計語言,它的發(fā)展貫穿了計算機(jī)發(fā)展的歷程,它蘊含了程序設(shè)計的基本思想,囊括了程序設(shè)計的基本概念,所以它是理工科高等院校的一門基礎(chǔ)課程。從市面上有關(guān)c語言的書籍和高等院校采用的教材來看,它們有一個共性,那就是:脫離了實際應(yīng)用(全是小打小鬧的小例子),純粹的過程性程序設(shè)計,沒有軟件工程思想的體現(xiàn),沒有一定程序設(shè)計風(fēng)格,僅僅是為了讓大家明白什么是c語言而已。 高等院校開設(shè)c語言程序設(shè)計的目的是讓學(xué)生對程序設(shè)計有個入門,有個直觀的理解,同時為其他后續(xù)課程作鋪墊。但是如果教學(xué)僅僅以此為目的,那么教學(xué)本身就效果而言是個大大的失敗。 大家知道,在商業(yè)上講究唯利是圖,“利”是商業(yè)追求的目標(biāo),離開了“利”經(jīng)商,則商無動力,其結(jié)果是必敗無疑。在c語言程序設(shè)計教學(xué)當(dāng)中,教師應(yīng)該把“唯用是圖”作為教學(xué)的首要目標(biāo)。如果拋開了實際應(yīng)用進(jìn)行程序設(shè)計教學(xué),就是紙上談兵,就是“說明書”式的教學(xué)。印度的程序設(shè)計課程采用“事件驅(qū)動式”教學(xué),我認(rèn)為在中國的c語言程序設(shè)計教學(xué)中應(yīng)該采用“項目驅(qū)動式”教學(xué)?!绊椖框?qū)動式”教學(xué)就是以項目為目的,以c語言理論教學(xué)為過程,最終能用c語言設(shè)計項目,實現(xiàn)項目的要求?!绊椖框?qū)動式”教學(xué)的關(guān)鍵在于培養(yǎng)學(xué)生“如何做什么”和“可以干什么”。一個項目就是一個工程,在“項目驅(qū)動式”教學(xué)中,首先應(yīng)該讓學(xué)生簡單了解什么是軟件工程思想,其次在c語言理論教學(xué)過程中,讓學(xué)生懂得面向?qū)ο蟮某绦蛟O(shè)計的風(fēng)格,最后引導(dǎo)他們來設(shè)計項目。 (二)“項目驅(qū)動”式教學(xué)應(yīng)注意的問題 1.c語言程序設(shè)計教學(xué)要幫助學(xué)生樹立面向工程的觀點 在計算機(jī)行業(yè)中,軟件是通過人們的智力活動、把知識與技術(shù)轉(zhuǎn)化成信息的一種產(chǎn)品。軟件的設(shè)計已經(jīng)用工程的觀念來進(jìn)行管理。軟件設(shè)計工作被當(dāng)作一項系統(tǒng)工程來對待。軟件的的生存周期一般可分為以下階段:問題定義、可行性研究、需求分析、概要設(shè)計、詳細(xì)設(shè)計、編碼、測試、運行與維護(hù)。我們不難看出軟件工程的復(fù)雜程度是很大的。理工科高等院校把c語言作為一門基礎(chǔ)課程,也是為了給社會培養(yǎng)信息技術(shù)人才。眾所周知,養(yǎng)成一個好的習(xí)慣是非常重要的,所以c語言程序設(shè)計作為大多數(shù)工科院校學(xué)生接觸的第一門程序設(shè)計語言(有的院校講pascal),就應(yīng)該讓學(xué)生樹立正確的觀點。那么當(dāng)前的程序設(shè)計教學(xué)也必須以切合將來軟件工程開發(fā)的實際需要為第一目標(biāo),使學(xué)生在學(xué)習(xí)程序設(shè)計的初級階段就樹立正確的軟件工程觀點。這樣做不僅可以為學(xué)生將來從事計算機(jī)應(yīng)用設(shè)計打下良好的基礎(chǔ),而且有利于培養(yǎng)學(xué)生分析問題的完備性,以及統(tǒng)籌全局,協(xié)調(diào)關(guān)系的基本素質(zhì)。 2.理論教學(xué)應(yīng)從單一的“結(jié)構(gòu)化程序設(shè)計”向“結(jié)構(gòu)化與面向?qū)ο蟛⑴e”轉(zhuǎn)變 “結(jié)構(gòu)化程序設(shè)計”方法是程序設(shè)計的基礎(chǔ),必須讓學(xué)生掌握得堅實可靠。結(jié)構(gòu)化程序設(shè)計的過程是培養(yǎng)學(xué)生思維能力的過程,在教學(xué)中經(jīng)常發(fā)現(xiàn)有些學(xué)生的思維混亂。這些都是缺乏思維訓(xùn)練的結(jié)果。結(jié)構(gòu)化程序設(shè)計的訓(xùn)練不僅可以讓學(xué)生養(yǎng)成良好的程序設(shè)計習(xí)慣,而且可以有效地培養(yǎng)學(xué)生思維的條理性和邏輯性。所以在授課過程中要注意講解結(jié)構(gòu)化程序設(shè)計的思想時應(yīng)突出兩點:(1)程序的質(zhì)量首先取決于它的結(jié)構(gòu)。(2)程序設(shè)計的基本方法是自頂向下地逐步求精和模塊化。 在c程序教學(xué)過程中,越到后面的章節(jié),學(xué)生越會產(chǎn)生設(shè)計程序逐漸變難的感覺,這是不符 合邏輯的一種怪現(xiàn)象。按照常理,C語言學(xué)的越多,說明你的程序設(shè)計知識越多,設(shè)計起程序來應(yīng)該更加得心應(yīng)手,那么出現(xiàn)這種現(xiàn)象的原因何在呢?當(dāng)然該問題的出現(xiàn)的原因是多方面的,但是其中最重要的一點就是長期以來程序設(shè)計的觀念不是以如何處理好對象為出發(fā)點,而是以如何使用好語言為基本點。受這種思想的影響,我們的程序設(shè)計教學(xué)大多數(shù)不是以如何解決好問題為重點,而是以講解語法規(guī)則和語句格式為重點,是“說明書”式的教學(xué)。這樣做造成的結(jié)果就是見到一個程序后學(xué)生首先想到是該用哪條語句,而不是思考怎樣合理的解析。要切實解決這個問題,首先應(yīng)該改變程序設(shè)計的觀念?!懊嫦?qū)ο蟪绦蛟O(shè)計”思想是目前最為流行、極為實用的一種程序設(shè)計方法,但是讓學(xué)生直接接觸“面向?qū)ο蟪绦蛟O(shè)計”,肯定不能對程序設(shè)計打下牢固的基礎(chǔ)?!敖Y(jié)構(gòu)化與面向?qū)ο蟛⑴e”是現(xiàn)代計算機(jī)程序設(shè)計的發(fā)展趨勢,應(yīng)該認(rèn)真探索研究,讓學(xué)生有一個較為輕松的學(xué)習(xí)過程。程序設(shè)計的實質(zhì)就是編寫處理對象的過程,所以將c與c++有機(jī)的融為一體的教材應(yīng)該是首選教材,在教學(xué)過程中,我們應(yīng)該從社會發(fā)展的角度進(jìn)行探索研究,將目前最為流行又極為實用“面向?qū)ο蟪绦蛟O(shè)計”思想融合到c語言教學(xué)中。 3.c語言教學(xué)應(yīng)培養(yǎng)學(xué)生良好的程序設(shè)計風(fēng)格 具有良好的設(shè)計風(fēng)格應(yīng)該是程序員所具備的基本素質(zhì),在實際的項目中程序員往往都有自己的一些編程風(fēng)格。目前95%以上的程序設(shè)計書籍不注重程序設(shè)計風(fēng)格問題,這導(dǎo)致了很多學(xué)生沒有良好的程序設(shè)計風(fēng)格,在他們剛剛畢業(yè)踏入社會時,如果周圍的同事沒有良好的編程風(fēng)格,那么很難通過環(huán)境來使自己提高這方面的素質(zhì),即使有提高也不容易比較全面的提高。因此在學(xué)生接觸的第一門程序設(shè)計語言教學(xué)中,就應(yīng)該培養(yǎng)學(xué)生良好的程序設(shè)計風(fēng)格,使他們一進(jìn)工作環(huán)境就具備這個素質(zhì)。 Pascal設(shè)計者N.Writh教授十分重視程序設(shè)計風(fēng)格的養(yǎng)成,他堅信“教給學(xué)生們以表達(dá)他們思維的語言會深深地影響他們思維和創(chuàng)造發(fā)明的習(xí)慣,而正是這些語言本身的混亂直接影響著學(xué)生們的程序設(shè)計的風(fēng)格”,他這里所指的“這些運用”是當(dāng)時那些主要用于程序設(shè)計教學(xué)的計算機(jī)語言。對學(xué)生來講,一開始就強(qiáng)調(diào)程序設(shè)計風(fēng)格很有必要,良好的程序設(shè)計風(fēng)格不僅有助于提高程序的可靠性、可理解性、可測試性、可維護(hù)性和可重用性,而且也能夠促進(jìn)技術(shù)的交流,改善軟件的質(zhì)量。所以培養(yǎng)良好的程序設(shè)計風(fēng)格對于初學(xué)者來說非常重要。程序設(shè)計風(fēng)格,實際上是指的是編碼風(fēng)格。在教學(xué)過程中應(yīng)從源程序文檔化,數(shù)據(jù)說明的原則,輸入/輸出方法這三個方面培養(yǎng)學(xué)生的編碼風(fēng)格,進(jìn)而從編碼原則探討提高程序的可讀性、改善程序質(zhì)量的方法。 (1)源程序文檔化。編碼的目的是產(chǎn)生程序,但是為了提高程序的可維護(hù)性。源代碼是需要實現(xiàn)文檔化的。源程序文檔化包括選擇標(biāo)識符(變量和標(biāo)號)的名字、安排注釋以及標(biāo)準(zhǔn)的書寫格式等。 ①選擇標(biāo)識符的命名規(guī)則。標(biāo)識符包括模塊名、變量名、常量名、標(biāo)號名、子程序名等。這些名字應(yīng)能反映它所代表的實際東西,應(yīng)有一定實際意義,使其能顧名思義。另外在模塊名、變量名、常量名、標(biāo)號名、子程序名中使用下劃線是一種風(fēng)格。使用這一技術(shù)的一種廣為人知的命名規(guī)則就是匈牙利命名法(變量類型由一個或兩個字符表示,并且這些字符將作為變量名的前綴)。當(dāng)然使用匈牙利命名法與否都沒有錯誤,重要的是要保持一致性——在整個程序中使用相同的命名規(guī)則。這就是說,如果你在一個小組環(huán)境中編程,你和其他小組成員應(yīng)該制定一種命名規(guī)則。并自始至終使用這種規(guī)則。如果有人使用了別的命名規(guī)則,那么集成的程序讀起來將是很費勁的。此外,你還要與程序中用到的第三方庫(如果有的話)所使用的風(fēng)格保持一致。如果可能的話,你應(yīng)該盡量使用與第三方庫相同的命名規(guī)則,這將加強(qiáng)你的程序的可讀性和一致性。 ②注釋。程序中的注釋是程序設(shè)計者與程序閱讀者之間通信的重要手段。注釋能夠幫助讀者理解程序,并為后續(xù)測試維護(hù)提供明確的指導(dǎo)信息。因此,注釋是十分重要的,大多數(shù)程序 設(shè)計語言提供了使用自然語言來寫注釋的環(huán)境,為程序閱讀者帶來很大的方便。注釋分為功能性注釋和序言性注釋。 a.功能性注釋。功能性注釋在源程序中,用以描述其后的語句或程序段是在做什么工作,也就是解釋下面要“做什么”,而不是解釋下面怎么做。對于書寫功能性注釋,要注意以下幾點:第一描述一段程序,而不是每一個語句。第二利用縮進(jìn)和空行,使程序與注釋容易區(qū)別。第三注釋要準(zhǔn)確無誤。 b.序言性注釋。序言性注釋通常位于每個程序模塊的開頭部分,它給出程序的整體說明,對于理解程序具有引導(dǎo)作用。有些軟件開發(fā)部門對序言性注釋做了明確而嚴(yán)格的規(guī)定,要求程序編制者逐項列出。有關(guān)內(nèi)容包括:程序標(biāo)題;有關(guān)該模塊功能和目的的說明;主要算法;接口說明:包括調(diào)用形式,參數(shù)描述,子程序清單;有關(guān)數(shù)據(jù)描述;模塊位置(在哪一個源文件中,或隸屬于哪一個軟件包);開發(fā)簡歷:模塊設(shè)計者、復(fù)審考、復(fù)審日期。③用標(biāo)準(zhǔn)的書寫格式。源程序清單的書寫建議采用以下幾點: a.每行只寫一條語句; b.用分層縮進(jìn)的寫法顯示嵌套結(jié)構(gòu)層次,這樣可使程序的邏輯結(jié)構(gòu)更加清晰,層次更加分明。c.書寫表達(dá)式時適當(dāng)使用空格或圓括號作隔離符。 d.在注釋段周圍加上邊框; e.注釋段與程序段、以及不同的程序段之間插入字行; (2)數(shù)據(jù)說明采用的原則。在編寫程序時,要注意數(shù)據(jù)說明的風(fēng)格。 數(shù)據(jù)說明的次序如果規(guī)范,將有利于測試,排錯和維護(hù)。首先說明的先后次序要固定,例如,按常量說明、簡單變量類型說明、數(shù)組說明用數(shù)據(jù)塊說明、所有的文件說明的順序說明。當(dāng)然在類型說明中還可進(jìn)一步要求,例如按如下順序排列:整型量說明、實型量說明、字符量說明、邏輯說明。 其次當(dāng)用一個語句說明多個變量名時,應(yīng)當(dāng)對這些變量按字母的順序排列。 最后對于復(fù)雜數(shù)據(jù)結(jié)構(gòu),應(yīng)利用注釋說明實現(xiàn)這個數(shù)據(jù)結(jié)構(gòu)的特點。 (3)輸入/輸出方法。輸入/輸出的方式和格式應(yīng)當(dāng)盡量避免因設(shè)計不當(dāng)給用戶帶來的麻煩。這就要求,源程序的輸入/輸出風(fēng)格必須滿足能否為用戶接受這一原則。所以在設(shè)計程序時,應(yīng)考慮以下原則:輸入數(shù)據(jù)時,要使輸入的步驟和操作盡可能簡單,應(yīng)允許使用自由格式輸入;應(yīng)允許缺省值;對輸入的數(shù)據(jù)要進(jìn)行檢驗,以保證每個數(shù)據(jù)的有效性。 (三)結(jié)束語 在教學(xué)過程中,我們讓學(xué)生設(shè)計一個程序模擬體育彩票的銷售與對獎的過程,取得了良好的效果。他不僅啟發(fā)和誘導(dǎo)了學(xué)生獨立思考、積極思維的主動性,而且充分調(diào)動了學(xué)生學(xué)習(xí)的自覺性和積極性,使學(xué)生融會貫通地掌握了所學(xué)知識,提高了分析問題和解決實際問題的能力。 搞好c程序設(shè)計的教學(xué)工作涉及的因素很多,如果以項目來驅(qū)動教學(xué),首先讓學(xué)生樹立面向工程的思想,其次把教學(xué)從單一的“結(jié)構(gòu)化程序設(shè)計”向“結(jié)構(gòu)化與面向?qū)ο蟛⑴e”轉(zhuǎn)變,最后特別要培養(yǎng)學(xué)生養(yǎng)成良好的編碼風(fēng)格,從而使他們學(xué)會能夠“干什么”,那么我們認(rèn)為教學(xué)目的就達(dá)到了。 1.算法(Algorithm)是一系列解決問題的清晰指令,算法代表著用系統(tǒng)的方法描述解決 問題的策略機(jī)制。也就是說,能夠?qū)σ欢ㄒ?guī)范的輸入,在有限時間內(nèi)獲得所要求的輸出。 2.算法具有以下特點:有窮性、確定性、有零個或多個輸入、有一個或過個輸出、可行 性。 3.結(jié)構(gòu)化程序設(shè)計的三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。 4.結(jié)構(gòu)化程序:自頂向下、逐步求精、模塊化設(shè)計、結(jié)構(gòu)化編碼。 5.什么叫結(jié)構(gòu)化算法,為什么要提倡結(jié)構(gòu)化算法:結(jié)構(gòu)化算法是由一些基本結(jié)構(gòu)順序組成的。在基本結(jié)構(gòu)之間不存在向前或向后的跳轉(zhuǎn),流程的轉(zhuǎn)移只存在于一個基本的結(jié)構(gòu)范圍內(nèi)。一個非結(jié)構(gòu)化的算法可以用一個等價的結(jié)構(gòu)化算法代替,其功能不變。跟結(jié)構(gòu)化算法比較起來,非結(jié)構(gòu)化算法有以下缺點。流程不受限制的隨意轉(zhuǎn)來轉(zhuǎn)去,使流程圖豪無規(guī)律.使人在閱讀的時候難以理解算法的邏輯.難以閱讀,也難以修改.從而使算法的可靠性和可維護(hù)性難以保證。 6.結(jié)構(gòu)化程序設(shè)計(structured programming)是進(jìn)行以模塊功能和處理過程設(shè)計為主的詳 細(xì)設(shè)計的基本原則第二篇:C語言大賽題目精選(帶答案)
第三篇:c語言
第四篇:如何學(xué)C語言
第五篇:C語言