第一篇:国际c语言乱码大赛经典之作
这篇是为C写的,不过作为代码阅读习惯和能力的培养,转自人牲一笑的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);} // 翻译成常规语言 // 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); } } } // 除去不需要的,重构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){ // 根据语义,可进一步重构 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=='/')} } // 编译环境main入口,CRTO.C for main(__argc, __argv, _environ);// 方法的编译原来,返回值的寄存器状态 // 变量的类型转换reinterpret_cast // 使用一个新的main方法,将旧的用一个新方法'decode'表示 // 根据题设,本程序执行方式为无命令参数,即,argc==1 // 变量的声名规约,改变变量名以方便理解 // 进一步重构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){ // 内部递归,无后续分支,可展平为递推方式 if(arg2<13) return decode(2,arg2+1,“%s %d %dn”); else return 9; }else return 16;}else if(arg1<-72){ // 可根据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){ // 内部递归,无后续分支,可展平为递推方式 if(arg2==*sCodec) return putchar(sCodec[31]); else return decode(-65,arg2,sCodec+1);}else if(arg1<0){ // 内部递归,无后续分支,可展平为递推方式 return decode((*sCodec=='/')+arg1,arg2,sCodec+1);}else if(0 return decode(2,2,“%s”);}else{ // arg1 == 0 if(!(*sCodec=='/')) // 内部递归,无后续分支,可展平为递推方式 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的内容,重构方法,有些坳,自己试着理解吧 #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){ // 判断条件可达,取舍 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;} // 分析条件,重构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代码流向,重构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,代码合并 // 内部递归,展平为递推方式,注意边界条件和递归嵌套的调用特点 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;} // 最终结果 #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;} // 额外写段代码,看一下。对照之后推一下原始代码的结果吧。#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个评委进行打分,试编程求这位选手的平均得分。3种方法:分别要求使用到排序,数组,函数,指针。分析:这道题的核心程序是排序,将评委打的10个分数利用数组按增序(或降序)排列,计算数组中除了第一个和最后一个分数以外的数以外的数的平均分 答案: #include 2. 12.抓交通肇事犯 一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。*问题分析与算法设计 按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。*程序与程序注释 #include 3. 14.怎样存钱利最大 假设银行整存整取存款不同期限的月息利率分别为: 0.63% 期限=1年 0.66% 期限=2年 0.69% 期限=3年 0.75% 期限=5年 0.84% 期限=8年 利息=本金*月息利率*12*存款年限。现在某人手中有2000元钱,请通过计算选择一种存钱方案,使得钱存入银行20年后得到的利息最多(假定银行对超过存款期限的那一部分时间不付利息)。*问题分析与算法 为了得到最多的利息,存入银行的钱应在到期时马上取出来,然后立刻将原来的本金和利息加起来再作为新的本金存入银行,这样不断地滚动直到满20年为止,由于存款的利率不同,所以不同的存款方法(年限)存20年得到的利息是不一样的。分析题意,设2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,则到期时存款人应得到的本利合计为: 2000*(1+rate1)i1*(1+rate2)i2*(1+rate3)i3*(1+rate5)i5*(1+rate8)i8 其中rateN为对应存款年限的利率。根据题意还可得到以下限制条件: 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.谁是窃贼 公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的。在回答公安人员的问题中: 甲说:“乙没有偷,是丁偷的。” 乙说:“我没有偷,是丙便的。” 丙说:“甲没有偷,是乙偷的。” 丁说:“我没有偷。” 请根据这四人的答话判断谁是盗窃者。*问题分析与算法设计 假设A、B、C、D分别代表四个人,变量的值为1代表该人是窃贱。由题目已知:四人中仅有一名是窃贱,且这四个人中的每个人要么说真话,要么说假话,而由于甲、乙、丙三人都说了两句话:“X没偷,X偷了”,故不论该人是否说谎,他提到的两人中必有一人是小偷。故在列条件表达式时,可以不关心谁说谎,谁说实话。这样,可以列出下列条件表达式: 甲说:”乙没有偷,是丁偷的。” B+D=1 乙说:“我没有偷,是丙偷有。” B+C=1 丙说:“甲没有偷,是乙偷的。” A+B=1 丁说:“我没有偷。” A+B+C+D=1 其中丁只说了一句话,无法判定其真假,表达式反映了四人中仅有一名是窃贱的条件。*程序与程序注释 #include 69.魔术师的猜牌术(1)魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,牌面朝下。对观众说:我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?你们就看。魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,将黑桃A放在桌子上,然后按顺序从上到下数手上的余牌,第二次数1、2,将第一张牌放在这迭牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前面两张依次放在这迭牌的下面,再翻第三张牌正好是黑桃3。这样依次进行将13张牌全翻出来,准确无误。问魔术师手中的牌原始顺序是怎样安排的? *问题分析与算法设计 题目已经将魔术师出牌的过程描述清楚,我们可以利用倒推的方法,很容易地推出原来牌的顺序。人工倒推的方法是:在桌子上放13空盒子排成一圈,从1开始顺序编号,将黑桃A放入1号盒子中,从下一个空盒子开始对空的盒子计数,当数到第二个空盒子时,将黑桃2放入空盒子中,然后再从下一个空盒子开始对空盒子计数,顺序放入3、4、5...,直到放入全部3张牌。注意在计数时要跳过非空的盒子,只对空盒子计数。最后牌在盒子中的顺序,就是魔术师手中原来牌的顺序。这种人工的方法是行之有效的,计算机可以模拟求解。*程序与程序注释 #include 75.10个小孩分糖果 十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖的块数一样多?每人各有多少块糖? *问题分析与算法设计 题目描述的分糖过程是一个机械的重复过程,编程算法完全可以按照描述的过程进行模拟。*程序与程序注释 #include 学C语言有感 姓 名: 李文丽 学 号:034108048 班 级:083411 指导老师:张印 2009年12月 学C语言有感 第1页 学C语言有感 摘要:C语言既有高级语言的特点,又具有汇编语言的特点;既能用来编写不依赖计算机硬件的应用程序,又能用来编写各种系统程序;是一种受欢迎、应用广泛的程序设计语言C语言版本。首先按照学习C语言的顺序分别介绍了我在学习C语言过程中所遇到的问题,叙述了在C语言学习过程,学习C语言的重点,难点,以及易出错的地方,并且用具体的案例做解释。然后阐述了学习C语言的体会:C语言的语法部分是学好C语言的基础,学习c语言不能停留在学习它的语法规则,只有通过上机才能检验自己是否掌握c语言、自己编写的程序是否能够正确地解题。最后总结学习c语言,既是件有趣的事情,又是件艰苦的事情。静下心来学习,我们会有所收获,更会其乐无穷的。 关键词:运算符 表达式 优先级 语句 变量 一、C语言的学习中的问题 在这个学期里,我们工商管理专业的学生在专业老师张印的带领下进行了实用c语言简明教程的学习。经过这一个学期的学习,我们已经对c语言这门课程有了一定的了解。C语言是一门最基础的语言,也是一门广泛使用的语言。所以学习C语言义不容辞 首先,在学习的最初几节课,老是主要向我们讲述了C语言的特点,学习C语言的意义,以及学习C语言能给我们所带来的方便优越之处。 C语言是一种结构化语言。它层次清晰,简洁紧凑、灵活方便,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强,语法限制不太严格、程序设计自由度大。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作,适用范围大,可移植性好。总之,C语言既有高级语言的特点,又具有汇编语言的特点;既是一个成功的系统设计语言,有是一个使用的程序设计语言;既能用来编写不依赖计算机硬件的应用程序,又能用来编写各种系统程序;是一种受欢迎、应用广泛的程序设计语言C语言版本。 当然,C语言也有自身的不足,比如:C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数族下标越界不作检查等。从应用的角度,C语言比其他高级语 学C语言有感 第2页 言较难掌握。 下面我给大家说一说我在学习C语言过程中所遇到的问题。 在第二章,我们学习的是数据描述与基本操作。在这一章,我们主要讲了数据类型,运算符与表达式,和不同类型数据间的混合运算。其中比较难以理解和掌握的是自加、自减运算符。 自加、自减运算符作用是使变量的值增1或减1;当符号在前,变量在后,++i/--i 变量的值先加1或先减1,然后再参与其它运算。当符号在后,变量在前,++i/--i 变量的值先参与其它运算,然后再加1或先减1。例如: # include 1.自加运算符(++)和自减运算符(--)只能用于变量,而不能用于常量或表达式,如6++或(a+b)++都是不合法的。因为5是常量,常量的值是不能改变的。(a+b)++也不可能实现,假如a+b的值为5,那么自加后得到的6放在什么地方? 2.++和--的结合方向是“自右向左”。负号运算符和++运算符同优先级,而结合方向为“自右向左”,即它相当于-(i++),如果有printf(“%d”,-i++),则先取出i的值3,输出-i的值-3,然后i增值为4。注意-(i++)是先用i的原值3加上负号输出-3,再对i加1,不要认为加完1后再加负号,输出-4,这是不对的。 例如,x=a*b+c%d 无所谓; 例如,a=3;y=a*++a;不同的编译系统有两种处理方式,结果不同: A)按从左到右的顺序处理为:先取a的值3,再计算++a,a的值 自增为4,子表达式++a的值也为4,所以相乘的结果为12; 学C语言有感 第3页 B)按从右到左的顺序处理为:先计算++a,a的值自增为4,子表达式++a的值也为4,再取a的值为4,所以相乘的结果为16。 在第三章我们讲的是顺序结构程序设计,其中所涉及的主要问题说优先级。 说到优先级什么叫优先级?比方说,我们在公交车终点站排座队时总会遇到70岁以上的老人不需要排队就能上车的情景,这就是优先级的涵义。C程序在运行时也象排队坐车一样,首先照顾那些优先级高的运算符,若是优先级相同,那么就象遇到两位(或两位以上)70岁以上的老人那样,让他们依次上车。 下面我们通过几个例子来说明: (1)3*20/4%10 这个表达式中出现3种运算符,是同级运算符,运算顺序按从左至右结合,因此先计算3 * 20=60,然后被4除,结果为15,最后是%(求余数)运算,所以表达式的最终结果为15%10 = 5(2)a = 3;b = 5;c =++ a* b ;d =a + +* b; 例子中的“;”是C语言的语句分隔符,执行顺序为从左到右,第1条语句执行后a的值为3,第2条语句执行后b的值为5,第3条语句中有两个运算符前置+ +和*,按表中所列顺序,+ +先执行,*后执行,所以+ + a执行后,a的值为4,由于+ +为前置运算,所以a的值4参与运算,C的值为20,最后执行第4条语句,由于a + +为后置运算,所以a值为4参与运算,使得d的值仍为20,而a参与运算后其值加1,值为5。这个例子执行后,a的值为5,b的值为5,c的值为20,d的值也是20。(3)a = 3,b = 5,b+ = a,c = b* 5 例子中的“,”是逗号结合运算,上式称为逗号表达式,自左向右结合,最后一个表达式的结果值就是逗号表达式的结果,所以上面的逗号表达式结果为40,a的值为3,b的值为8,c的值为40。 但是C语言中的优先级的运算并不是千篇一律的,只能说是在大多数情况下,有些运算符的优先级有其自己的特点,因此这点大家要注意。例如条件表达式:条件?结果1:结果2,这种表达式很多朋友都知道,它的作用与IF…ELSE…条件判断语句很雷同,它运算时的优先级就不是按照C语言的规则来完成的。所以说对于优先级各位编程爱好者一定灵活掌握,不要死记硬背。 第三四章的选择结构程序设计和循环结构设计说我们这学期所学内容的重点。在这里,学者结构程序设计比较简单,我们就不多说了,主要谈一下循结构环程序设计。 学C语言有感 第4页 循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do –while循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提昌用goto循环,所以下面我们重点讲解另外的三种循环。 用while和do—while循环时,循环变量的初始化的操作应在循环体之前,而for循环是在语句1中进行的;while 循环和for循环都是先判断表达式,后执行循环体,而do—while循环是先执行循环体后判断表达式,也就是说do—while的循环体最少被执行一次,而while 循环和for就不一定了。这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,不能用break和 continue语句进行控制。这三种结构并不是彼此孤立的,在循环中可能出现分支、顺序结构,分支中也可能出现循环、顺序结构而把循环、分支看成一个语句,它又是构成顺序结构的一个元素,因此这三种结构相互结合,就能实现各种算法,设计出解题程序,但若是很大的题目,这样编出的程序往往很长,重复结构多,并且可阅读性差,因此我们常将C程序设计成模块化结构。 二、C语言学习的重点、难点 针对我个人而言,在C语言学习过程,学习C语言的重点,难点,以及易出错的地方主要有以下几个方面: 如果对几个变量赋予同一个初值,应写成: int a=3,b=3,c=3;表示a、b、c的初值都是3。不能写成: int a=b=c=3;2 强制类型转换其一般形式为(类型名)(表达式)表达式应该用括号括起来。如(int)(x+y)表示将x+y的值转换成整形如果写成(int)x+y则表示将x转换成整形,然后与y相加。使用scanf函数注意的问题: ①“格式控制”后面应当是变量地址,而不应是变量名。如 scanf(“%d”,a)是不对的,应改为scanf(“%d”,&a);②scanf函数格式控制最后面不能有n否则将没有结果输出如scanf(“%dn”,&a);是不对的。③输入数据时不能规定精度,如scanf(“%7.2f”),&a);是不合法的 ④如果在%后有一个“*”附加说明符,表示跳过它指定的列数。 学C语言有感 第5页 三、学习c语言的体会 在经过了一个学期的学习之后,对于学习c语言心得体会也总结了一下: 1、既然是一门语言,他就汉语,英语一样,都有自己的语法规则,学习一门语言,就是要按照它的语法来编程。C语言的语法部分是学好C语言的基础,只有学好了这些语法,才会写程序,看程序。所以对一个初学者来说,加深对课堂讲授内容的理解,要扎实地熟悉每一个语法,并能根据这些语法来编程。 2、课堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住死记硬背是不可取的。然而要使用c语言这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致。 3、学习c语言不能停留在学习它的语法规则,而是利用学到的知识编写c语言程序,解决实际问题。即把c语言作为工具,描述解决实际问题的步骤,由计算机帮助我们解题。只有通过上机才能检验自己是否掌握c语言、自己编写的程序是否能够正确地解题。学习C语言是没有什么捷径的,打好基础,做好每章的练习才是关键。尤其是书本里的习题,不能因为简单就不去实践,学习C语言,乃至于学习所有的电脑知识都是一样的,实践练习永远处于最为重要的地位,须知电脑是要实际操作的,对于C语言,更是要是把这个程序自己编出来并且运行成功,知识点才记得最为深刻。 通过上机实验来验证自己编制的程序是否正确,恐怕是大多数同学在完成老师作业时的心态。但是在程序设计领域里这是一定要克服的传统的、错误的想法。因为在这种思想支配下,可能你会想办法去“掩盖”程序中的错误,而不是尽可能多地发现程序中存在的问题。自己编好程序上机调试运行时,可能有很多你想不到的情况发生,通过解决这些问题,可以逐步提高自己对c语言的理解和程序开发能力。学习c语言更为重要的是掌握编程的思想,如何用简捷的方法解决一个问题。同样做一个循环问题,可能有人要做300次循环,而有的人要做100次,这就是差距。平时,我们学习的时候要注意掌握每个概念,当然理论的学习是离不开实践的,尤其是c语言,需要你编写大量的程序,最初可以学着别人的程序打,慢慢就应该独立出来,把自己的想法用c语言描述出来,这是一件十分快乐的事情。建议初学者不要看高级编程,先勤写代码、多看代码、培 学C语言有感 第6页 养风格、熟悉语法、最关键的还是把握思想。当你能够信手拈来的时候,你的c语言才可以说学会了。一定要养成自己独立写完一个程序的能力,这样可以有一种成就感。不断培养这种成就感,循序渐进,进步是自然的事情。 四、总结 学习c语言,既是件有趣的事情,又是件艰苦的事情。说它有趣,是因为从中你能得到快乐,能使你的计算机整体水平上升一大步。说它艰苦,是因为学习它的过程比起学习其他计算机知识,要难得多 C语言只是一门计算机语言,说到底就是一种工具。它的用处就是可以让你用它编出能够运行的程序来,而这些程序可以实现某些人需要的功能。人通过学习c语言也可以更加深入的了解计算机,所以很多人都把c语言作为计算机入门的第一门语言来学习,因为他学习起来相对简单一些。至于实际的意义,无非是让你多学会一门技能,让你更加深入对计算机的了解,为学习其他计算机语言打下好的基础。 学习最好抱着一种踏踏实实的心态,老是想着有什么实际的好处并不会促进我们的学习,因为知识对人的影响是潜移默化的,静下心来学习吧,我相信我们会有收获的!而且如果你真的用心学习,会发现学起来越来越有意思,也会给你带来无穷的乐趣的! 学C语言有感 第7页 参考文献: [1] 3 沈其益等编著,棉花病害——基础理论与防治,北京:科学出版社,1992.7 [2] 3 沈其益、张三等编著,棉花病害——基础理论与防治,北京:科学出版社,1992.7。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。参考文献(不少于10篇,中文参考文献不少于7篇,英文不少于3篇) 学C语言有感 第8页 学C语言有感 第9页 如何学C语言 (一)“项目驱动”式教学 目前最著名、最有影响、应用最广泛的windows、linux和UNIX三个操作系统都是用C语言编写的。0S是计算机系统(由软硬件两个子系统构成)的核心和灵魂,它是软件中最庞大最复杂的系统软件。既然如此庞大复杂的0S都可以用c语言编写,从狭义而言,还有什么系统软件和应用软件不能用c语言编写呢?由此可以肯定的说,c语言是一门十分优秀而又重要的语言。 c语言程序设计是过程性程序设计语言,它的发展贯穿了计算机发展的历程,它蕴含了程序设计的基本思想,囊括了程序设计的基本概念,所以它是理工科高等院校的一门基础课程。从市面上有关c语言的书籍和高等院校采用的教材来看,它们有一个共性,那就是:脱离了实际应用(全是小打小闹的小例子),纯粹的过程性程序设计,没有软件工程思想的体现,没有一定程序设计风格,仅仅是为了让大家明白什么是c语言而已。 高等院校开设c语言程序设计的目的是让学生对程序设计有个入门,有个直观的理解,同时为其他后续课程作铺垫。但是如果教学仅仅以此为目的,那么教学本身就效果而言是个大大的失败。 大家知道,在商业上讲究唯利是图,“利”是商业追求的目标,离开了“利”经商,则商无动力,其结果是必败无疑。在c语言程序设计教学当中,教师应该把“唯用是图”作为教学的首要目标。如果抛开了实际应用进行程序设计教学,就是纸上谈兵,就是“说明书”式的教学。印度的程序设计课程采用“事件驱动式”教学,我认为在中国的c语言程序设计教学中应该采用“项目驱动式”教学。“项目驱动式”教学就是以项目为目的,以c语言理论教学为过程,最终能用c语言设计项目,实现项目的要求。“项目驱动式”教学的关键在于培养学生“如何做什么”和“可以干什么”。一个项目就是一个工程,在“项目驱动式”教学中,首先应该让学生简单了解什么是软件工程思想,其次在c语言理论教学过程中,让学生懂得面向对象的程序设计的风格,最后引导他们来设计项目。 (二)“项目驱动”式教学应注意的问题 1.c语言程序设计教学要帮助学生树立面向工程的观点 在计算机行业中,软件是通过人们的智力活动、把知识与技术转化成信息的一种产品。软件的设计已经用工程的观念来进行管理。软件设计工作被当作一项系统工程来对待。软件的的生存周期一般可分为以下阶段:问题定义、可行性研究、需求分析、概要设计、详细设计、编码、测试、运行与维护。我们不难看出软件工程的复杂程度是很大的。理工科高等院校把c语言作为一门基础课程,也是为了给社会培养信息技术人才。众所周知,养成一个好的习惯是非常重要的,所以c语言程序设计作为大多数工科院校学生接触的第一门程序设计语言(有的院校讲pascal),就应该让学生树立正确的观点。那么当前的程序设计教学也必须以切合将来软件工程开发的实际需要为第一目标,使学生在学习程序设计的初级阶段就树立正确的软件工程观点。这样做不仅可以为学生将来从事计算机应用设计打下良好的基础,而且有利于培养学生分析问题的完备性,以及统筹全局,协调关系的基本素质。 2.理论教学应从单一的“结构化程序设计”向“结构化与面向对象并举”转变 “结构化程序设计”方法是程序设计的基础,必须让学生掌握得坚实可靠。结构化程序设计的过程是培养学生思维能力的过程,在教学中经常发现有些学生的思维混乱。这些都是缺乏思维训练的结果。结构化程序设计的训练不仅可以让学生养成良好的程序设计习惯,而且可以有效地培养学生思维的条理性和逻辑性。所以在授课过程中要注意讲解结构化程序设计的思想时应突出两点:(1)程序的质量首先取决于它的结构。(2)程序设计的基本方法是自顶向下地逐步求精和模块化。 在c程序教学过程中,越到后面的章节,学生越会产生设计程序逐渐变难的感觉,这是不符 合逻辑的一种怪现象。按照常理,C语言学的越多,说明你的程序设计知识越多,设计起程序来应该更加得心应手,那么出现这种现象的原因何在呢?当然该问题的出现的原因是多方面的,但是其中最重要的一点就是长期以来程序设计的观念不是以如何处理好对象为出发点,而是以如何使用好语言为基本点。受这种思想的影响,我们的程序设计教学大多数不是以如何解决好问题为重点,而是以讲解语法规则和语句格式为重点,是“说明书”式的教学。这样做造成的结果就是见到一个程序后学生首先想到是该用哪条语句,而不是思考怎样合理的解析。要切实解决这个问题,首先应该改变程序设计的观念。“面向对象程序设计”思想是目前最为流行、极为实用的一种程序设计方法,但是让学生直接接触“面向对象程序设计”,肯定不能对程序设计打下牢固的基础。“结构化与面向对象并举”是现代计算机程序设计的发展趋势,应该认真探索研究,让学生有一个较为轻松的学习过程。程序设计的实质就是编写处理对象的过程,所以将c与c++有机的融为一体的教材应该是首选教材,在教学过程中,我们应该从社会发展的角度进行探索研究,将目前最为流行又极为实用“面向对象程序设计”思想融合到c语言教学中。 3.c语言教学应培养学生良好的程序设计风格 具有良好的设计风格应该是程序员所具备的基本素质,在实际的项目中程序员往往都有自己的一些编程风格。目前95%以上的程序设计书籍不注重程序设计风格问题,这导致了很多学生没有良好的程序设计风格,在他们刚刚毕业踏入社会时,如果周围的同事没有良好的编程风格,那么很难通过环境来使自己提高这方面的素质,即使有提高也不容易比较全面的提高。因此在学生接触的第一门程序设计语言教学中,就应该培养学生良好的程序设计风格,使他们一进工作环境就具备这个素质。 Pascal设计者N.Writh教授十分重视程序设计风格的养成,他坚信“教给学生们以表达他们思维的语言会深深地影响他们思维和创造发明的习惯,而正是这些语言本身的混乱直接影响着学生们的程序设计的风格”,他这里所指的“这些运用”是当时那些主要用于程序设计教学的计算机语言。对学生来讲,一开始就强调程序设计风格很有必要,良好的程序设计风格不仅有助于提高程序的可靠性、可理解性、可测试性、可维护性和可重用性,而且也能够促进技术的交流,改善软件的质量。所以培养良好的程序设计风格对于初学者来说非常重要。程序设计风格,实际上是指的是编码风格。在教学过程中应从源程序文档化,数据说明的原则,输入/输出方法这三个方面培养学生的编码风格,进而从编码原则探讨提高程序的可读性、改善程序质量的方法。 (1)源程序文档化。编码的目的是产生程序,但是为了提高程序的可维护性。源代码是需要实现文档化的。源程序文档化包括选择标识符(变量和标号)的名字、安排注释以及标准的书写格式等。 ①选择标识符的命名规则。标识符包括模块名、变量名、常量名、标号名、子程序名等。这些名字应能反映它所代表的实际东西,应有一定实际意义,使其能顾名思义。另外在模块名、变量名、常量名、标号名、子程序名中使用下划线是一种风格。使用这一技术的一种广为人知的命名规则就是匈牙利命名法(变量类型由一个或两个字符表示,并且这些字符将作为变量名的前缀)。当然使用匈牙利命名法与否都没有错误,重要的是要保持一致性——在整个程序中使用相同的命名规则。这就是说,如果你在一个小组环境中编程,你和其他小组成员应该制定一种命名规则。并自始至终使用这种规则。如果有人使用了别的命名规则,那么集成的程序读起来将是很费劲的。此外,你还要与程序中用到的第三方库(如果有的话)所使用的风格保持一致。如果可能的话,你应该尽量使用与第三方库相同的命名规则,这将加强你的程序的可读性和一致性。 ②注释。程序中的注释是程序设计者与程序阅读者之间通信的重要手段。注释能够帮助读者理解程序,并为后续测试维护提供明确的指导信息。因此,注释是十分重要的,大多数程序 设计语言提供了使用自然语言来写注释的环境,为程序阅读者带来很大的方便。注释分为功能性注释和序言性注释。 a.功能性注释。功能性注释在源程序中,用以描述其后的语句或程序段是在做什么工作,也就是解释下面要“做什么”,而不是解释下面怎么做。对于书写功能性注释,要注意以下几点:第一描述一段程序,而不是每一个语句。第二利用缩进和空行,使程序与注释容易区别。第三注释要准确无误。 b.序言性注释。序言性注释通常位于每个程序模块的开头部分,它给出程序的整体说明,对于理解程序具有引导作用。有些软件开发部门对序言性注释做了明确而严格的规定,要求程序编制者逐项列出。有关内容包括:程序标题;有关该模块功能和目的的说明;主要算法;接口说明:包括调用形式,参数描述,子程序清单;有关数据描述;模块位置(在哪一个源文件中,或隶属于哪一个软件包);开发简历:模块设计者、复审考、复审日期。③用标准的书写格式。源程序清单的书写建议采用以下几点: a.每行只写一条语句; b.用分层缩进的写法显示嵌套结构层次,这样可使程序的逻辑结构更加清晰,层次更加分明。c.书写表达式时适当使用空格或圆括号作隔离符。 d.在注释段周围加上边框; e.注释段与程序段、以及不同的程序段之间插入字行; (2)数据说明采用的原则。在编写程序时,要注意数据说明的风格。 数据说明的次序如果规范,将有利于测试,排错和维护。首先说明的先后次序要固定,例如,按常量说明、简单变量类型说明、数组说明用数据块说明、所有的文件说明的顺序说明。当然在类型说明中还可进一步要求,例如按如下顺序排列:整型量说明、实型量说明、字符量说明、逻辑说明。 其次当用一个语句说明多个变量名时,应当对这些变量按字母的顺序排列。 最后对于复杂数据结构,应利用注释说明实现这个数据结构的特点。 (3)输入/输出方法。输入/输出的方式和格式应当尽量避免因设计不当给用户带来的麻烦。这就要求,源程序的输入/输出风格必须满足能否为用户接受这一原则。所以在设计程序时,应考虑以下原则:输入数据时,要使输入的步骤和操作尽可能简单,应允许使用自由格式输入;应允许缺省值;对输入的数据要进行检验,以保证每个数据的有效性。 (三)结束语 在教学过程中,我们让学生设计一个程序模拟体育彩票的销售与对奖的过程,取得了良好的效果。他不仅启发和诱导了学生独立思考、积极思维的主动性,而且充分调动了学生学习的自觉性和积极性,使学生融会贯通地掌握了所学知识,提高了分析问题和解决实际问题的能力。 搞好c程序设计的教学工作涉及的因素很多,如果以项目来驱动教学,首先让学生树立面向工程的思想,其次把教学从单一的“结构化程序设计”向“结构化与面向对象并举”转变,最后特别要培养学生养成良好的编码风格,从而使他们学会能够“干什么”,那么我们认为教学目的就达到了。 1.算法(Algorithm)是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决 问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。 2.算法具有以下特点:有穷性、确定性、有零个或多个输入、有一个或过个输出、可行 性。 3.结构化程序设计的三种基本结构:顺序结构、选择结构、循环结构。 4.结构化程序:自顶向下、逐步求精、模块化设计、结构化编码。 5.什么叫结构化算法,为什么要提倡结构化算法:结构化算法是由一些基本结构顺序组成的。在基本结构之间不存在向前或向后的跳转,流程的转移只存在于一个基本的结构范围内。一个非结构化的算法可以用一个等价的结构化算法代替,其功能不变。跟结构化算法比较起来,非结构化算法有以下缺点。流程不受限制的随意转来转去,使流程图豪无规律.使人在阅读的时候难以理解算法的逻辑.难以阅读,也难以修改.从而使算法的可靠性和可维护性难以保证。 6.结构化程序设计(structured programming)是进行以模块功能和处理过程设计为主的详 细设计的基本原则第二篇:C语言大赛题目精选(带答案)
第三篇:c语言
第四篇:如何学C语言
第五篇:C语言