本文目录一览:
- 1、C语言怎么学?
- 2、求一份C语言课程设计报告要求包括:系统需求分析,总体设计,详细设计,程序调试分析。
- 3、对于一个C语言程序,我们应该怎样去写需求分析?
- 4、C语言有什么发展前景?
- 5、C语言学不会怎么办?
- 6、求C语言学生信息管理系统的需求分析和设计小结
C语言怎么学?
浅谈C语言学习方法
本人是一名windows程序写作员,使用的语言是C语言.其他语言了解一点点,但并不擅长.可能对于初学者来说,首先就是选择一门程序设计语言.当然,今天我将要说的不是这方面.每种语言都有它所擅长的领域与层面.当然对于其他非C语言我是一名门外汗,我也不会站在C语言的立场去谈论其他任何一门语言.好了,在开始进入正题之前,我想谈谈个人对C的一些看法:
C语言是一种早期的计算机语言,最初诞生目的是为了提供一种基于UNIX系统的工作语言.但是,后来却被越来越多的人发现它的优点与潜力.C本身比较接近底层,适合开发系统软件甚至是操作系统.我个人也认为它是界于高级语言与汇编语言之间的中级语言.C语言是一门结构化语言(我认为主要是指它的控制结构如:if if-else while for等等).C程序设计上有提到"自顶向下,逐步深入".以函数为原子功能模块.对于大型的程序来说模块化是很重要的,有一句话说的很好"优质的程序首先就是便与人们之间的相互讨论与交流,其次才是执行效率".当然我个人认为任何一名程序写作者,都应该养成一种特定的思维方式,以程序的思维方式来思考程序的实现.前提就是要足够的来了解计算机底层技术.要不我想就连学习都是很困难的,凡事都是一个思路的问题嘛.标准的来衡量,C应该算是高级语言阵营的一份子.可很多有C语言开发经验的程序写作者.通常亲切的称C为界于底级语言与高级语言之间的中级计算机语言.当然不是因为C比高级语言要差,之所以这么认为是因为C既具有高级语言的结构化与可理解性又具有低级语言的高效率.同时C的移植性也是非常不错的,大家应该知道,越是接近硬件,接近底层的语言就越加的依赖硬件环境,也就是我们所说的设备相关性.C这一点做的是非常棒的.说了这些,在从另一个角度去分析C语言.当然每种语言都有它自身的优缺点,C也一样.比如在现在高级语言与顶层技术的角度来看的话,C最大的缺陷就是Data与算法的分离.举一个例子: 对于一个拥有几千行甚至上万行Code的程序来说,如果修改Data,比如我在Structure中增加一个字段,可能为此我的整个程序都要改动,这使得程序的可重用性大大降低.开发周期也大大的延长.但是在底层的角度来看这也正是C的优点.我为什么要这么说呢?我个人认为在求解与实现一个小问题的时候,我们可以写出一个通用的模块处理不同的Data.当然比如某些经常用到的,基于数据结构的一些常用算法我们可以写出来在开发的时候我们可以直接把预先编写的模块插入到我们的程序中去,这不也是大大低了开发周期吗?初学者完全可以根据自己的需求来编写一个自定义库.好了,说了这些,有些地方我理解错了,还请各位指出来,交流是很重要的,前提是要把自己的心态放平.下面我将谈论本问的重点,也就是如何来学习C语言,是给那些初学者读的.
正题部分:
有人可能会说:学习还用你教啊,谁没上过学啊.其实我今天要说的只是,站在一个过来人的角度,来分析与解释学习C语言的过程中比较困难的地方.当然我个人也会对比较具体的问题进行解释(个人看法).我一直在强调个人看法,我是想让大家明白,对于同一个问题大家可能都很难达成统一的意见,希望批评的时候客气点就好喽!
初学者该看哪些书来入门:
在学习C语言之前,首先就要选择一本教材,对于初学者,我个人并不建议去读电子书籍,最好是买纸质书来学习.比如比较有名的"C程序设计"就很不错,尤其是第二版.我也看过,比较适合中国人来初学.整本书都在全面系统的讲解C的语法结构,构成C的语言元素包括:数据类型,支持的运算符,标识符(是由程序员按照命名规则起的名字,用于变量名,函数名,宏名等等),关键字(编译系统用于实现C内部功能的词,比如:转向goto和中断break等等)等.看完这本书你基本上可以写一些简单的小程序,当然是DOS下的程序.如果你想在进一步深入学习C的话,可以看"C陷阱与缺陷"这本书.写这本书的作者是在Bell工作对C是非常精通的,应该算是大师级的人物了.如果你暂时不想深入C的话,也没问题,因为此时你完全可以把C当作一种编程工具来使用,你要做的就是多写Code来让自己熟悉C语言.经验是非常重要的,"经验是检验真理的唯一方法".当然你不会纸上谈兵,如果你有过多的开发经验的话,就知道在纸上或最初的设想的Code拿到计算机上来实现,最终会发现有很多地方都是不合理的,之前是没有办法想象到的.在初学C的过程中,比如你会看"C程序设计"来初学C,当你学完每一章的时候要把习题来完成,这里就是考验你学到的知识了,看看你应用能力怎么样?尤其是程序设计题目,比较有意思.哪里不懂了.可以翻回去看书中的解释.如果没有解释或你还是不明白,可以去问别人,与其他人交流. bbs,QQ或Google.直到你弄明白为止.当你把问题最终解决的时候,我敢打赌,此时你一定很兴奋,或者是比较兴奋.这个时候知识已经在你的大脑里了.
下面我为你推荐几本不错的关于C语言籍:
C编程规范
C语言大全第四版 (个人感觉不错,里面有提及C标准方面的东西)
C和指针
The C programming Language (经典著作)
如果你要看电子书的话,以上几本书在Google上很容易就可以找到.
关于C语言的初步理解:
对于初学者,会有太多的疑问,原因是你的知识面太小.现在我为你解释一些C相关的东西.目的是让你能够有一个大致清晰的方向,来给自己安排学习计划.专业的来说,我们是或将是一名程序员,程序员当然就是要开发程序了.对于软件开发方面我来解释下术语:
C,C++,ASM,Basic,Java 这些是计算机语言.计算机语言很多,我就不多说了.
Visual C++,Visual Basic, Microsoft研发的开发环境,开发环境包括:编译器,库函数(每种C语言编译器都支持标准库,同时它们也会扩展自己的库,所以很多比较以来库函数实现的程序员,在转向不同的开发环境的时候最初总是不使用的,会遇到很多问题),一些资源模板等等.Visual 就是可视的意思,后面的就是语言.Visual C++支持C与C++2种语言,是根据文件的扩展名来判断采用哪种编译内核.
什么是"面向对象"与"面向过程"? 其实是2种完全不同的程序设计思想,C语言是面向过程语言,而C++是面向对象语言.在面向对象的语言中有"类(Class)"这个东西.C中没有.对象是由类来派生的一个实例,相反类就象是一个模板.
什么是SDK? SDK就是软件开发工具包(Software Development Kit).指的范围比较广,通俗的说,凡是能够与软件开发过程占上边的东西都属于.比如:库文件,参考资料,接口函数,当然语言也应该属于.
DDK就是设备驱动程序开发工具包.
Turbo C: 这是一个比较精致的C语言编译器.
理论上来说任何一门语言都可以在任何一种操作系统上运行,前提是操作系统要支持.也就是我们所说的应用程序接口,比如Window API(Application Programming Interface),其实是Microsoft内部定义的接口函数用于实现一些Windows内部的功能.一些对象的描述术语,在不同平台上是不同的,比如:Windows下的"调用",经常被称为"呼叫","返回"被称为"传回".
什么是"算法"? 你最初只需要知道算法实际上就是对特定的Data进行运算的一段代码而已.也可以认为在求解一道题目的时候,采取的方法与步骤的总称.对于基本的C程序来说,实际上就是由Data与算法来组成的.
什么是"数据结构"? 如果要是系统的讲解,还需要一本书"数据结构",简单的说:是程序要处理的数据在内存中的存储与组织的方式,分为:物理结构与逻辑结构.逻辑结构就是我们抽象化以后得到的大脑影象.
什么是"函数库"? 它们以文件的形式存储,是预先定义好的函数的集合,我们的程序可以直接调用.当然前提是要包含它的头文件(库函数的原型声明).这些函数是在静态连接期间组成到.exe文件中去的.Windows又存在另一种库,叫做动态连接库(DLL).
GUI: 也就是"图形用户界面",就是我们在Windows上看到的,存在:菜单栏,滚动条与显示区域的窗口.
GDI: 图形设备接口,从程序写作者的角度来看,其实GDI就是由上百个函数与数据形态和一些相关的数据结构所组成的.
学习C语言的全过程:
仔细想想,实际上学习C语言,最初是应该先学习C语言的基础语法.也就是学习C语言的组成部分.一部分一部分的向下学.知识要一点一点的巩固的.本人假设你学习C语言是看"C程序设计".我认为你应该先把C程序设计仔细的看一便,这样你应该可以对整本书和C语言的整体组成结构有个大致的清晰了解.不要认为学习只是在看书,看一便就可以了.你应该学会记笔记,在记笔记的过程中,其实你就是在学习,从知识的分析,理解,归纳,到最后以自己的思维方式记下来,这整个过程就是把书中的知识抽象到你自己的脑袋里.个人感觉学习效果非常好,不懂就问,要多多与人交流,要多思考,遇到问题自己先多想想,实在找不到问题出在哪,在去请教别人,不要有不懂的地方就直接去问别人,那样对你没太大的好处.其实要学会给自己安排适合自己的学习计划,我大致来估计了一下,如果你每天能花4个小时安静的,用心去学习的话,30天之内你应该可以掌握C语言了.其实在整个学习过程中你大多数时间都在看书,而不是面对电脑.在调试你的代码之前,先在纸上把核心代码大致写出来,分析一下:程序的组成模块(可以是一个函数或多个),由几个函数来实现,接口的封装.采用哪种数据结构更适合一些.关键在于算法.在你的最终程序发布之前,最好把你的代码行数减到最少.不要只想着把代码写多.过多的代码对程序来说是负担.你可以在Internet上下载一个文件(C语言经典例题.chm),里面大致包含了上百个经典的例题.每一个例题都是C语言某部分的典型应用.花时间把这个文件中的所有例题代码研究一下,最好能自己把代码改善,以自己的方式来求解.以后你会发现你在写一些应用程序的时候经常会有一些算法.会涉及到我之前提到的例题.最后我认为你可以自己来写C语言标准函数,比如strcpy(); strlen();strcat();最好不要过分依赖库函数.
C语言学习的难点:
现在应该是已经讲到一个重点的环节.很多网友都说学习C语言很难,我认为C中有些部分是比较复杂,难理解的.当然在你具有了丰富的开发经验以后,这以不在是问题了.下面我个人会对我认为学习C的时候比较难学的地方进行我自己的阐述,如果哪里不正确,还请各位指出:
指针的出现:
我想有很多初学者学习到指针那一章都感觉很难,下面我就以自己的想法来解释下指针这个特殊的数据类型,
基本变量大家可能并不难理解,因为基本变量其内部存储了同类型的常量,事实上指针也是变量,不过呢,这个变量和基本变量有点不一样,那你又问了:是哪里不一样呢? 我告诉你,简单的来理解其实普通的变量内部存储了同类型的常量,而指针变量内部存储的则是"同类型变量的首地址".这样你能够理解吗,是很简单的解释,但不失本质.事实就是这样的.如果你不理解"同类型变量的首地址"的话,我可以给你形象的来描述一下:
float Variable; //声明一个单精度实型的变量
此时,编译器已经给Variable分配了内存空间,结构如下:
__________
| |1001
|---------
| |1002
|---------
| |1003
|---------
| |1004
|---------
以上便是Variable的内存结构了,16位下的float占用4个字节,内存地址是线性编码的,我们可以很容易的看出Variable的首地址就是他第一个单元的地址1001,好的,继续向下看:
float *Pointer=Variable; //声明一个指向Variable的指针Pointer
_________
|1001 | 这是Pointer的内存结构
|_______|
我们的程序可以这样来执行:
Variable=1.0;
直接给Variable赋值,我们称为直接访问.
也可以这样执行:
*Pointer=1.0;
也可以通过指针变量来赋值,前面的*是间接运算符号,意思是求Pointer内部存储地址所标识的内存单元.也就是Variable.此时,是赋值是通过间接访问来实现的.可以这样形象的描述:
________ (指向Variable) __________
|Pointer|------------------------------------|Variable|
--------- ----------
以上应该是指针实现的基本解释,很多优秀的程序写作者都说指针是C语言中的精华,的确如此,很多优秀的程序写作者写程序都非常依赖指针,因为它很方便,实际上指针所访问的对象是没有限制的,他可以指向任何类型的变量,前提是只要我们知道内存地址.因此指针也并不安全,在开发网络程序的时候,尽量要少使用指针.下面我们在来看一下指针在数组中的使用.
数组中的指针:
简单的来解释下数组,数组结构在C中使用比较普遍,其实最常用的就是char 类型的数组,主要是用于字符串操作.实际上数组是"同类型变量的有限集合".我想这应该不难理解吧.数组在内存中占用连续的内存单元(地址连续),来存储数组中的每一个元素.数组是预先分配好指定长度的内存单元,供数组元素使用.它并不支持动态内存分配.在内存中想要唯一的确定数组,需要2个标识:入口地址(函数名)和结束标记('\0').有些语言并不向C语言这样支持字符串结束标记,它们必须要另外声明一个变量来标识尾元素的下标.那数组名其实就是这一组内存单元的首单元,他的地址就是整个数组的入口地址.此时应该明白了,数组名是一个指针,这样理解没有问题.不错在具体操作的时候不允改变数组名的地址,也不符合实际要求.这样就可以明白数组名是一个什么 const Pointer(指针常量).我们可以这样做:
int Array[10];
int *Pointer;
Pointer=Array;
for(i=0;i10;++i)
Pointer==i;
以上代码应该是没问题吧,同类型的指针,完全可以胜任数组名的任务.一点问题没有而且可以运行的很好.当然,我们可以进一步把代码这样来写:
把
for(i=0;i10;++i)
Pointer=i;
改成
for(i=0;i10;++i,Pointer++)
*Pointer=i;
不好意思,我记不清了,指针的++运算是地址+1还是向后移动一个元素的位置,如果是地址+1的话,以上代码在改成这样:
for(i=0;i10;++i,Pointer+sizeof(int))
*Pointer=i;
如果数组类型是char的话,那就更方便了,因为字符串存存在一个在尾元素之后的结束标记('\0'),下面给出一个简单的代码,应用char Pointer:
char * my_strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ ); // 注意运算符的优先级与结合性
return( dst ); //返回新传的指针
}
以上代码实现字符传Copy功能,代码是不是很简洁啊.如果不需要移动内存块的话,我们完全可以通过交换指针(内存地址)来实现排序操作,其效率应该是很客观的.补充一句:千万要弄清楚,指针本身与指针所指向的变量不是一个单元.
求一份C语言课程设计报告要求包括:系统需求分析,总体设计,详细设计,程序调试分析。
C语言课程设计任务书
一、题目: 学生成绩管理
二、目的与要求
1. 目的:
(1)基本掌握面向过程程序设计的基本思路和方法;
(2)达到熟练掌握C语言的基本知识和技能;
(3)能够利用所学的基本知识和技能,解决简单的程序设计问题
2. 要求
基本要求:
1. 要求利用C语言面向过程的编程思想来完成系统的设计;
2. 突出C语言的函数特征,以多个函数实现每一个子功能;
3. 画出功能模块图;
4. 进行简单界面设计,能够实现友好的交互;
5. 具有清晰的程序流程图和数据结构的详细定义;
6. 熟练掌握C语言对文件的各种操作。
创新要求:
在基本要求达到后,可进行创新设计,如系统用户功能控制,对管理员级和一般级别的用户系统功能操作不同
三、信息描述
输入一个班10个学生的学号和每个学生考试三门功课(数学、英语、计算机基础)的成绩。编程计算出每个学生的总分和平均分,并按学生成绩优劣排序,最后打印一张按高分到低分名次排序的成绩单。要求:
1)排序用一个函数实现。
2)打印的成绩单表项包括:序号,学号、数学、英语、计算机、总分、平均分。
3)按实验报告电子模板格式填写实验内容。
四、功能描述
1. 学生基本信息及成绩所选科目成绩的录入。
2. 基本信息的查询(分系、班级;分科目)与修改。
3. 对每系或每班各科成绩进行分析(即求单科平均成绩、及格率和优秀率);
4. 对所开课程的成绩分析(求其平均成绩,最高分和最低分);
5. 对学生考试成绩进行排名(单科按系别或班级进行排名,对每一个班级,同一学期学生总体成绩进行排名,并显示各科成绩信息)
五、解决方案
1. 分析程序的功能要求,划分程序功能模块。
2. 画出系统流程图。
3. 代码的编写。定义数据结构和各个功能子函数。
4. 程序的功能调试。
5. 完成系统总结报告以及使用说明书
六、进度安排
此次课程设计时间为两周,分四个阶段完成:
1. 分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确设计要求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。
2. 编码调试阶段:根据设计分析方案编写C代码,然后调试该代码,实现课题要求的功能。
3. 总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、总体设计、详细设计、编码、测试的步骤和内容。
4. 考核阶段。
#include stdio.h
#include stdlib.h
#define STU_NUM 10 /*宏定义学生的数量*/
struct student /*定义一个结构体用来存放学生学号、三门课成绩、总分及平均成绩*/
{
char stu_id[20]; /*学生学号;*/
float score[3]; /*三门课成绩;*/
float total; /*总成绩;*/
float aver; /*平均成绩;*/
};
/*排序用一个函数来实现*/
void SortScore(student *stu,int n)
{
student stud;
for(int i = 0; i n-1; i++)
for(int j = i+1 ; j n; j++)
{
if(stu[i].total stu[j].total)
{
stud = stu[i];
stu[i] = stu[j];
stu[j] = stud;
}
}
}
int main( )
{
student stu[STU_NUM]; /*创建结构体数组中有10个元素,分别用来保存这10个人的相关信息。*/
/*输入这十个学生的相关信息*/
for(int i = 0; iSTU_NUM; i++)
{
printf("请输入第%d个学生的学号:",i+1);
scanf("%s",stu[i].stu_id);
printf("输入第%d个学生的数学成绩:",i+1);
scanf("%f",stu[i].score[0]);
printf("输入第%d个学生的英语成绩:",i+1);
scanf("%f",stu[i].score[1]);
printf("输入第%d个学生的计算机成绩:",i+1);
scanf("%f",stu[i].score[2]);
stu[i].total = stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
stu[i].aver = stu[i].total/3;
}
printf("\n");
SortScore(stu,STU_NUM);/*调用排序函数*/
/*输出排序后的各学生的成绩*/
for(i = 0 ; i STU_NUM; i++)
{
printf("序号: %d\t",i);
printf("学号:%s\t",stu[i].stu_id);
printf("数学:%f\t",stu[i].score[0]);
printf("英语:%f\t",stu[i].score[1]);
printf("计算机:%f\t",stu[i].score[2]);
printf("平均成绩:%f\t",stu[i].aver);
printf("总分:%f\t",stu[i].total);
printf("\n\n");
}
return 0;
}
注:(源程序中主要标识符含义说明)
#define STU_NUM 10 /*宏定义学生的数量*/
struct student /*定义一个结构体用来存放学生学号、三门课成绩、总分及平均成绩*/
{
char stu_id[20]; /*学生学号;*/
float score[3]; /*三门课成绩;*/
float total; /*总成绩;*/
float aver; /*平均成绩;*/
}
实验结果:
输入 :(只输入后面的数字,前面的文字是自己产生的)。
请输入第1个学生的学号:001
输入第1个学生的数学成绩:1
输入第1个学生的英语成绩:1
输入第1个学生的计算机成绩:1
请输入第2个学生的学号:002
输入第2个学生的数学成绩:2
输入第2个学生的英语成绩:2
输入第2个学生的计算机成绩:2
请输入第3个学生的学号:003
输入第3个学生的数学成绩:3
输入第3个学生的英语成绩:3
输入第3个学生的计算机成绩:3
请输入第4个学生的学号:004
输入第4个学生的数学成绩:4
输入第4个学生的英语成绩:4
输入第4个学生的计算机成绩:4
请输入第5个学生的学号:005
输入第5个学生的数学成绩:5
输入第5个学生的英语成绩:5
输入第5个学生的计算机成绩:5
请输入第6个学生的学号:006
输入第6个学生的数学成绩:6
输入第6个学生的英语成绩:6
输入第6个学生的计算机成绩:6
请输入第7个学生的学号:007
输入第7个学生的数学成绩:7
输入第7个学生的英语成绩:7
输入第7个学生的计算机成绩:7
请输入第8个学生的学号:008
输入第8个学生的数学成绩:8
输入第8个学生的英语成绩:8
输入第8个学生的计算机成绩:8
请输入第9个学生的学号:009
输入第9个学生的数学成绩:9
输入第9个学生的英语成绩:9
输入第9个学生的计算机成绩:9
请输入第10个学生的学号:010
输入第10个学生的数学成绩:10
输入第10个学生的英语成绩:10
输入第10个学生的计算机成绩:10
输出:
序号: 0 学号:010 数学:10.000000 英语:10.000000 计算机:10.000000
平均成绩:10.000000 总分:30.000000
序号: 1 学号:009 数学:9.000000 英语:9.000000 计算机:9.000000
平均成绩:9.000000 总分:27.000000
序号: 2 学号:008 数学:8.000000 英语:8.000000 计算机:8.000000
平均成绩:8.000000 总分:24.000000
序号: 3 学号:007 数学:7.000000 英语:7.000000 计算机:7.000000
平均成绩:7.000000 总分:21.000000
序号: 4 学号:006 数学:6.000000 英语:6.000000 计算机:6.000000
平均成绩:6.000000 总分:18.000000
序号: 5 学号:005 数学:5.000000 英语:5.000000 计算机:5.000000
平均成绩:5.000000 总分:15.000000
序号: 6 学号:004 数学:4.000000 英语:4.000000 计算机:4.000000
平均成绩:4.000000 总分:12.000000
序号: 7 学号:003 数学:3.000000 英语:3.000000 计算机:3.000000
平均成绩:3.000000 总分:9.000000
序号: 8 学号:002 数学:2.000000 英语:2.000000 计算机:2.000000
平均成绩:2.000000 总分:6.000000
序号: 9 学号:001 数学:1.000000 英语:1.000000 计算机:1.000000
平均成绩:1.000000 总分:3.000000
七、撰写课程设计报告或课程设计总结
课程设计报告要求:
总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。
C语言常见错误
书写标识符时,忽略了大小写字母的区别
main()
{
int a=5;
printf("%d",A);
}
编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。
2.忽略了变量的类型,进行了不合法的运算。
main()
{
float a,b;
printf("%d",a%b);
}
%是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。
3.将字符常量与字符串常量混淆。
char c;
c="a";
在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a'和‘\',而把它赋给一个字符变量是不行的。
4.忽略了“=”与“==”的区别。
在许多高级语言中,用“=”符号作为关系运算符“等于”。如在BASIC程序中可以写
if (a=3) then …
但C语言中,“=”是赋值运算符,“==”是关系运算符。如:
if (a==3) a=b;
前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。
5.忘记加分号。
分号是C语句中不可缺少的一部分,语句末尾必须有分号。
a=1
b=2
编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。
{ z=x+y;
t=z/100;
printf("%f",t);
}
对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。
6.多加分号。
对于一个复合语句,如:
{ z=x+y;
t=z/100;
printf("%f",t);
};
复合语句的花括号后不应再加分号,否则将会画蛇添足。
又如:
if (a%3==0);
I++;
本是如果3整除a,则I加1。但由于if (a%3==0)后多加了分号,则if语句到此结束,程序将执行I++语句,不论3是否整除a,I都将自动加1。
再如:
for (I=0;I5;I++);
{scanf("%d",x);
printf("%d",x);}
本意是先后输入5个数,每输入一个数后再将它输出。由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它。
7.输入变量时忘记加地址运算符“”。
int a,b;
scanf("%d%d",a,b);
这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“a”指a在内存中的地址。
8.输入数据的方式与要求不符。①scanf("%d%d",a,b);
输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:
3,4
输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。
②scanf("%d,%d",a,b);
C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。下面输入是合法的:
3,4
此时不用逗号而用空格或其它字符是不对的。
3 4 3:4
又如:
scanf("a=%d,b=%d",a,b);
输入应如以下形式:
a=3,b=4
9.输入字符的格式与要求不一致。
在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。
scanf("%c%c%c",c1,c2,c3);
如输入a b c
字符“a”送给c1,字符“ ”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。
10.输入输出的数据类型与所用格式说明符不一致。
例如,a已定义为整型,b定义为实型
a=3;b=4.5;
printf("%f%d\n",a,b);
编译时不给出出错信息,但运行结果将与原意不符。这种错误尤其需要注意。
11.输入数据时,企图规定精度。
scanf("%7.2f",a);
这样做是不合法的,输入数据时不能规定精度。
12.switch语句中漏写break语句。
例如:根据考试成绩的等级打印出百分制数段。
switch(grade)
{ case 'A':printf("85~100\n");
case 'B':printf("70~84\n");
case 'C':printf("60~69\n");
case 'D':printf("60\n");
default:printf("error\n");
由于漏写了break语句,case只起标号的作用,而不起判断作用。因此,当grade值为A时,printf函数在执行完第一个语句后接着执行第二、三、四、五个printf函数语句。正确写法应在每个分支后再加上“break;”。例如
case 'A':printf("85~100\n");break;
13.忽视了while和do-while语句在细节上的区别。
(1)main()
{int a=0,I;
scanf("%d",I);
while(I=10)
{a=a+I;
I++;
}
printf("%d",a);
}
(2)main()
{int a=0,I;
scanf("%d",I);
do
{a=a+I;
I++;
}while(I=10);
printf("%d",a);
}
可以看到,当输入I的值小于或等于10时,二者得到的结果相同。而当I10时,二者结果就不同了。因为while循环是先判断后执行,而do-while循环是先执行后判断。对于大于10的数while循环一次也不执行循环体,而do-while语句则要执行一次循环体。
14.定义数组时误用变量。
int n;
scanf("%d",n);
int a[n];
数组名后用方括号括起来的是常量表达式,可以包括常量和符号常量。即C不允许对数组的大小作动态定义。
15.在定义数组时,将定义的“元素个数”误认为是可使的最大下标值。
main()
;
printf("%d",a[10]);
}
C语言规定:定义时用a[10],表示a数组有10个元素。其下标值由0开始,所以数组元素a[10]是不存在的。
16.初始化数组时,未使用静态存储。
int a[3]=;
这样初始化数组是不对的。C语言规定只有静态存储(static)数组和外部存储(exterm)数组才能初始化。应改为:
static int a[3]=;
17.在不应加地址运算符的位置加了地址运算符。
scanf("%s",str);
C语言编译系统对数组名的处理是:数组名代表该数组的起始地址,且scanf函数中的输入项是字符数组名,不必要再加地址符。应改为:
scanf("%s",str);
18.同时定义了形参和函数中的局部变量。
int max(x,y)
int x,y,z;
{z=xy?x:y;
return(z);
}
形参应该在函数体外定义,而局部变量应该在函数体内定义。应改为:
int max(x,y)
int x,y;
{int z;
z=xy?x:y;
return(z);
}
C语言心得体会
通过这次实训,增加了我学习软件技术的兴趣,虽然还不明确软件技术包含的具体内容,但从C语言这门课程开始,已发现程序设计的乐趣,在学习C语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。
这次实训是老师给了范例程序,经过自己的改写,实现要求。先做简单的输出,一步步的再做其它图案,在实际操作过程中犯的一些错误还会有意外的收获,感觉实训很有意思。在具体操作中对这学期所学的C语言的理论知识得到巩固,达到实训的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机实训的重要作用,特别是对数组和循环有了深刻的理解。
通过实际操作,学会 C语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。深刻体会到“没有做不到的,只有想不到的”,“团结就是力量”,“实践是检验真理的标准”,“不耻下问”……的寓意。
计时在此希望以后应多进行这样的实训,加长设间,培养学生独立思考问题的能力,提高实际操作水平。
八、参考资料 :《C语言程序设计教程》
对于一个C语言程序,我们应该怎样去写需求分析?
1、对要解决的问题进行需求分析时,是不用考虑用什么语言来实现的。2、需求分析只是要回答你所要开发的系统要向用户提供什么服务,即系统应该具有什么功能。并且还要分析系统的非功能性需求,即系统的可用性、可靠性,可维护性、可支持性等。3、在充分分析了系统的功能性需求和非功能性需求后,才开始设计如何实现系统,在这个阶段也不用过多的考虑如何用具体的语言来实现。4、当软件的设计写成后,就进入了系统构造的阶段,此时才考虑如何用编程语言来实现设计。
C语言有什么发展前景?
作为最底层的语言,使用非常广泛,深受广大工程师的喜好,它无处不在。所以前景越来越好。
作为老牌编程语言,虽说没有就ja va语言应用广泛,但是未来依然具有较多的就业机会,随着物联网的全面发展,未来 C语言的应用场景依然比较多,而且由于 C语言有健全的语言生态和较快的运行速度,未来很长一段时间内依然是开发人员重要的选择。
目前 C语言主要的应用场景集中在三个领域,其一是操作系统领域;其二是容器开发领域;其三是物联网开发领域,目前物联网相关领域的开发场景还是比较多的,主要原因是物联网领域涉及到的行业比较广泛,需求量也比较大。
选择C语言的学习对自己的帮助很大。
其实做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C语言C++交流群583650410,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。免费的公开课供你学习!
对于C语言程序员来说,如果想提升自身的岗位竞争力,最好走研发级程序员路线,因为随着Java、Python等编程语言的崛起,在应用级开发领域(Web开发、移动互联开发等),C语言的应用场景还是比较少的,所以相应的岗位需求量也并不大。当然,随着工业互联网的发展,未来传统产业领域应该会释放出一定数量的C语言开发岗位,但是由于Python目前也可以从事嵌入式开发,所以单纯掌握C语言的程序员往往并不会具有较强的岗位竞争力。
要想走研发级程序员路线,需要做好三方面技术的积累,其一是基础学科知识,重点在于数学和物理知识;其二是计算机基础知识,重点在于操作系统知识和计算机网络知识;其三是行业领域的专业知识,涉及到各种设备。
从当前行业发展的趋势来看,C语言程序员往智能装备方向发展是不错的选择,比如数控领域、车联网领域就有大量的机会。
C语言学不会怎么办?
?️作为一名计算机专业大三的学生,我对C语言之前也十分的头痛。C语言主要是用于编写电脑操作系统和其中大多数最底层部件的语言之一,因而很难理解,了解这种语言的难度比较大,但学习这类系统性很好地语言能使我们的编程能力更加牢固。
?️此外,因为电子计算机程序的执行流程很复杂,所以C语言的关键特点就是精确而繁杂,但是其执行效率很高,所以用这类语言开发设计底层系统,而且应用领域十分广泛。
?️C语言作为最典型的高级语言,并且对于初学者短期内难以掌握。掌握了这个语言以后,对于程序员的程序编写也会变得非常容易,越来越熟练。换句话说,这类语言给程序员一种思维模式,理解了这门语言就比较容易结合和学习别的语言,可以采用以下几个方面来学习C语言。
⭐克服思想上的畏惧
⭐在C语言的学习中,我们作为初学者具有一种畏惧心理。往往学不好,是由于一开始很困惑就轻易放弃。我跟我身边的许多同学都交流过C语言学习的问题,但他们的回应也都是听不明白,不想听,坚持不下去。
⭐我就思考了这个问题,这门课程我用心听了吗?回答是否定的。我在感觉到很难之后,也没认真上课,怎能说自己听不明白?根本就没有认真学习,又何谈能够学习好呢?
⭐因此,我们必须将这种对C语言未知的恐惧转化成学习C语言的驱动力,并慢慢能够克服它。在课下能够消化吸收听到这些内容,能够探有疑必问地探讨问题,每一节课都需要克服心不在焉的情况去用心听,慢慢养成良好的学习习惯性。
?做好课下的复习和预习
?如果要学习C语言,务必牢记“千金难买回头看”这话,这是学习C语言技巧与方法。换句话说,学习后面的专业知识时,请别忘记要回望并找寻曾经留下来的难题和知识点,增强对前面所学到知识的应用,就比如后面学习到的算法设计与分析、数据结构等,都需要C语言的基础。虽然说这是对学生而言是最为困难的,但也是很重要的学习方式。
?比如C语言里面讲的是结构化程序设计的最典型的内容。不管是哪一种教材,从一开始就注重用这种方法。在开始学习的时候,你可能会都还没了解这种编程思想,但在学习函数的时候,回过头再次体会,你会有一种很惊讶的感觉。因此学习C语言是一个反复的过程,只有我们始终如一地学习,才能啃下这块硬骨头。
?加强实践以及共享编码学习
?“实践出真知”在C语言学习中是非常有道理的。因此在学习的过程当中,有不断增加自己在电脑上训练、写题的机会,充分利用课后的时间进行编写程序以及程序调试,而且在碰到程序错误的时候,也可以坦然面对,不再焦心烂额。
?此外,在学习C语言的过程当中,建议大家可以加入开源社区,为其中的某一项目作出自己微弱的贡献。开源系统也代表着能够免费试用、拷贝、程序研究和优化很多源代码。
?在初步掌握C语言的基础知识后,就可以考虑加入开源社区了。在开源社区中,我们可以获得、学习许多免费的源代码。这种源代码能给我们许多启迪和指导,帮助自己能够迅速编写源代码。自然,还可以在开源社区中展现出自己出色的源代码,并且能和大家一起讨论和共享自己的作品和问题。
?结束语
?总的来说,C语言课是一门理论性以及实践性都极强的课程内容,不但必须掌握相关概念,还需要把握程序编写并在电脑上能够成功调试运行,并且能对代码进行优化。
?真真正正能够学好C语言,不是一朝一夕的事。考量真正学会这门语言的标准,应当看我们能不能做出程序项目,而非看我们是不是了解到对应的知识点。我们要把学习的重点放到上机实验,编译程序和调试程序,只有这样才能真真正正学精C语言。
求C语言学生信息管理系统的需求分析和设计小结
一、需求分析
当代大学生是一个特殊的团体,他们具有较高知识修养和较强综合素质,但是他们中的大部分却不具有与他们能力相符的动手能力与就业竞争能力。大学毕业生是新兴劳动力的组成部分,提高大学毕业生就业工作发展水平,事关我国经济社会可持续发展的进程 ,高校作为培养大学生的摇篮,必须责无旁贷地承担起提高大学生就业能力的重任。提高大学生的就业能力,不仅需要教师付出辛勤的劳动,还需要一套科学完善的制度作为保障,而高校毕业生基本情况数据库管理系统无疑是一个很好的尝试。本文设计的这套数据库管理系统,是综合日常管理、实践考核、科目成绩统计、就业管理等等的综合性数据库系统。设计学生管理这样一个系统,可以涉及到大多数与c数据库的重要数据库对象、重要功能和特性,例如:视图、触发器和存储过程等。由此,通过这个课程设计可以加深学生对与C数据库知识的学习、理解,使学生掌握使用应用软件开发工具开发数据库管理系统的基本方法。在实用性方面,学生管理系统是很普遍的一种应用,选择该系统作为课程设计也可以为学生以后可能遇到的实际开发提供借鉴。
课程设计小结
以前,我对计算机方面的了解少之甚少,而且对编程没有什么兴趣,认为它十分的枯燥乏味。但是自从接受了C语言这门课程的学习之后,我的态度大有改观。不仅从中了解到了C语言是国内外广泛使用的语言,而且还知道了它的功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高等特点。特别的适合于编写系统软件。通过独立自主的完成每一次作业,我从中体会到了程序调试成功后的喜悦,并且对已学知识有了进一步的了解。总之,我正在改变,从不感兴趣向喜欢这门课程有了很大的改变。
在编此程序的过程中,我遇到了一些问题,在刚刚编完时,出现了许多错误,其中最主要的便是函数的形参和实参类型不匹配,经过几次改写,最终将形参——结构体指针改为了结构体数组,使得错误减少了许多。同时还出现了一些因马虎而产生的错误,不过最后经过仔细检查都解决了。最难找的的要数逻辑错误了,在对成绩进行计算的时候,忘了对数组进行处理,结果进行完运算后并没有得到预期结果。还有,在编写删除和添加函数时对覆盖前面的成绩没有把握,但经过参考一些资料后,确定了我的想法还是行的通的。总体而言,程序编写中遇到的错误还是比较小的,经过自己的努力还是给克服了。