C 语言上机总结报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言
上机实验报告
经过了九周的上机练习,我们算是完成了阶段性的胜利,从书本
上枯燥的知识,通过上机练习把他们学以致用,融会贯通;不得不说,
上机对于大一不允许带电脑,算得上是对c语言巩固和提高的重要途
径了,很多我们不懂得问题,通过敲一下代码就知道可不可以这样了。
还有很多格式,看不懂的代码,也都能解决。
另外,重要的是通过上
机我也拾得了编程的乐趣,链接好的程序就像是我的Baby,一节课
生好几个。
这是一种莫大的成就感。
原来我还可以这样。
如果仅是书
本上的知识,我很难保证能坚持看下去,因为要把抽象的东西阐述出来,很多时候都是很枯燥的。
所以上机便是这样一个辅助的途径。
下
面是我这九周所积累的一些问题和经验。
1.首先就是书写的问题。
到现在我还时不时忘了加分号。
这么一
个细微的问题有时候会报很多错。
其中易犯的便是scanf中&的使用,以及&&逻辑运算符和位运算符不分,==错写=,自定义函数,声明时
不加分号,do,while语句while后忘加分号,以及数组不从a[0]开
始写,for循环中控制条件用<还是<=,于是就会溢出。
2.printf里格式的问题,想要在数前补0整数可以靠.num而浮点
数需要前加0,对于输出无符号16进制数%x,八进制数%o和十进制%u,总是记不住,还有一个比较特别的是可以用*占位,然后在后面的参
数中说明精度和宽度,用#让浮点数始终有小数,字符串的5.4s只显
示4位。
另一个我发现无关紧要的是printf中lf和f没什么区别,scanf却不一样。
3.scanf的另一个问题是当出现空格是,读取的字符串就不完整了,在百度后,我找到了更好的gets函数,便可以读取空格,还有scanf的一一对应特性,不过空格不算。
4.++i和i++的使用问题。
很多时候并不在意这些,便会导致数据
的溢出,和结果总是偏差1,所以在使用时先得想好用哪个,如int k ; while(k--) ;printf(“%d”,k)结果是-1,因为在while判断过
程中还要减1。
5.Define 一个表达式时不爱每一层都加括号。
导致运算时优先级
使运算和目的不符。
我记不下那么多的运算符的优先级,所以我解决
的方法便是每个运算都加上括号。
6.总是按照自己的思维做事,像是想把一个数组复制给另一个数
组就直接用=赋值了,事实证明并不可行,而是需要用for循环一个
一个赋值,而字符串则用strcpy,但结构体却可以直接赋值。
7.条件语句if,while,for等加括号和在哪加括号的的问题,常常
因为内容少所以不加括号经常导致错误,尤其在嵌套语句和连续多个
条件语句时,总是会出错,所以以后我学会了每句话都加上大括号。
并且尽量使格式工整。
8.忘记添加头文件。
或者忘了头文件的名字,像是
stdlib,malloc……这样函数就变得没有了意义。
这个得靠记忆和多练。
9.函数要求的实参的格式忘记了,这时候总是会报格式不符,比
如malloc.calloc.recalloc,对参数的要求的区别,qsort函数里,compare函数指针参数,compare的实际参数需要强制转换。
10.Switch用法,switch只能用于char和int,且不用break就
会一直执行下去,我就会忘掉这个,还有给a加引号
11.数组的声明问题,数组是c语言里比较让人头大的问题了。
其中,让我不能理解的便是为什么二维数组不能a[][]={},a[][N]={}而必须至少a[N][]={},这就让我栽过跟头,还有字符数组为什么加’
\0’就变成字符串了,当然这都是要求,在声明时需要谨慎再谨慎。
12.指针的运用中,在参数调用和返回也时常出现格式不符,值传
递改变不了实参,址传递有时候也改变不了比如返回局部变量的地址,这时就需要static静态变量延长存储时间,而extern在函数中仅是
对之前的变量的声明,并不能在其中定义一个外部变量,static也
只能定义一次,这类问题时常困扰着我,以为经常不知道错在哪里。
另外还有一种方法也能改变指针的地址而改变实参指针的指向,那便
是通过双重指针,**p
13.对于指针运用中另外很让人困惑的是二级指针的指向问题,而
他们常常又和二维数组结合,例如a,&a[0],a[0],&a[0][0],a[0][0],他们乍一看都分别不出来,需要仔细的考虑,实际上
a=&a[0],&*(a[0]+0)=a[0]=&a[0][0],实际上他们都是逐级递增的,
例如对*(a[0]+i)就是对确定一行的列的选择,*(a+i)则是对行数
的选择,常常用指针指向这一行,然后进行操作,然而经常&a,&a[0]
和&a[0][0]却是相同的地址,但他们的跨度却不一样,这样常常在实
验的过程中就是对数组格式的写错导致根本不知道哪出的错,也无从
修改。
所以还是得多理解透彻他们的含义,否则只会在写代码时犯懵。
14.指针运用的另一个问题就是,指针并不具有空间,需要进行空
间的开辟,这类问题也常常出现在想要声明一个未知大小的数组,这
时候就需要用malloc来开辟了,而malloc还不能放置在main函数
体外,经常在scanf后放置。
15.在上机过程中我曾不理解为什么char*p=”ashjkhasljk”可
以成功,而已定义的数组a,就不能a=“adfadsad”;char*p,p=”dasaf”可以,但是用scanf输入”dasaf”就不对,查阅资料我才得知,“”表达式的值就是一个地址,p=””,开辟了空间。
而scanf直接把址
给指针,并没有申请空间。
其次程序把字符串放到了常量区,所以不
容修改其值,这里的p[0]也不得修改,p开辟了一段常量空间把字符
串放进去,其值也不得修改,但可以改变P的指向,所以相当于const char*p
16.关于函数,要记住函数不能嵌套定义,但可以调用。
这也是我
犯过的错误。
17.结构体的声明和联合还有枚举的声明经常搞混,查书才知道有
两种方法来声明结构类型名,一种结构标记,一种typedef,第一种
直接可以在其后写变量,另一种需要再换行再声明。
还有其后}要加
分号会忘,主要是还是对结构名和变量搞不清楚,比如struct student new在实验中出现引用其中的元素不知道是是应该
student.new.还是new. 除此,不明白Union为什么经常没有标记,直接就是变量。
最后便是结构数组的初始化总是掌握的不好,可能因为用的少。
由于没有保留上机报告的原稿,所以以上是我暂时能回忆起来我所遇到的问题和我的想法。
经历了9次的实验我的收获当然不仅仅是这些问题,重要的是编程的思维,不是一上来就立马开始打代码,而是构建一个清晰的流程图就如《上机实验报告》所写,然后逐步实现,有时候有多个函数时需要先写一个大的框架,然后再完善。
另外,还有程序的调试,如果都写在函数里,则,注释部分函数然后进行调试。
或者单步调试部分代码,观察值的变化。
总之收获很大就对了!。