黑马程序员C语言教程:C语言基础之#define详解(精选9篇)
理命令详解
作为一枚C/C++程序猿,在我们编写和查看C/C++源代码的过程中会遇到各种编译指令,这些指令称为预处理命令。预处理命令虽然不是C/C+的一部分,但却扩展了C程序的设计环境,下面传智播客C/C+培训专家将向大家介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。
ANSI标准定义的C语言所有预处理命令均以符号#开头,比如我写程序时常用的:
#define,#undef,#include,#if,#else,#elif,#endif,#ifdef,#ifndef, #error 1.#define和 #undef 宏定义命令的一般形式为:
#define[MacroName][MacroValue],示例如下: #defineITHEIMA 传智播客黑马程序员
在源程序中每次遇到ITHEIMA时,均以定义的值传智播客黑马程序员代换它。
在使用该宏时,有以下几点注意事项:
该语句没有分号。在标识符和串之间可以有任意个空格。 定义宏的时候,可以使用之前已经定义好的宏。
如果串长于一行,可以在该行末尾用一反斜杠续行。
#defineLONG_STRING“good good study,day day up!” 在定义宏标识符时,字母一般需要大写。 预处理运算符的使用:
#--该符号是“字符串化”的意思,出现在宏定义中的#是把跟在后面的参数转换成一个字符串
#define ERROR_LOG(module)
fprintf(stderr, “error: ”#module“n”)ERROR_LOG(“add”);转换为 fprintf(stderr,“error: ”add“n”);ERROR_LOG(devied =0);转换为 fprintf(stderr,“error: devied=0n”); ##--是连接符号,将多个串连接到一起。char *szStr = “传播播客_黑马程序员”;#define ITCAST(exp)cout < 2.#include 命令#i nclude使编译程序将另一源文件嵌入带有#include的源文件,被读入的源文件必须用双引号或尖括号括起来。例如: #include“stdio.h”或者#include 这两行代码均使用C编译程序读入并编译用于处理磁盘文件库的子程序。将文件嵌入#i nclude命令中的文件内是可行的,这种方 式称为嵌套的嵌入文件,嵌套层次依赖于具体实现。 如果显式路径名为文件标识符的一部分,则仅在那些子目录中搜索被嵌入文件。 例如: #include “../include/head.h” 如果文件名用双引号括起来,则首先检索当前工作目录。如果未发现文件,则在命令行中说明的所有目录中搜索。如果仍未发现文件,则搜索实现时定义的标准目录。例如: include “head.h” 如果文件名被尖括号括起来,则首先在编译命令行中的目录内检索。如果文件没找到,则检索标准目录,不检索当前工作目录。 例如: include
它与#endif之间的代码,否则跳过这些代码。命令#endif标识一个#if块的结束。
跟在#if后面的表达式在编译时求值,因此它必须仅含常量及已定义过的标识符,不可使用变量。表达式不许含有操作符sizeof(sizeof也是编译时求值)。
#else命令的功能有点象C语言中的else;#else建立另一选择(在#if失败的情况下)。注意,#else属于#if块。
#elif命令意义与ELSE IF 相同,它形成一个if else-if阶梯状语句,可进行多种编译选择。#elif 后跟一个常量表达式。如果表达式为true,则编译其后的代码块,不对其它#elif表达式进行测试。否则,顺序测试下一块。
4.#error 命令#error强迫编译程序停止编译,主要用于程序调试。该指令使预处理器发出一条错误消息,该消息包含指令中的文本.这条指令的目的就是在程序崩溃之前能够给出一定的信息。
5.#ifdef 和 #ifndef 条件编译的另一种方法是用#ifdef与#ifndef命令,它们分别表示“如果有定义”及“如果无定义”。# ifdef的一般形式是:
# ifdef macroname statement sequence
#endif #ifdef与#ifndef可以用于#if、#else,#elif语句中,但必须与一个#endif。
define MAX 91 #include
关键词:C语言程序设计,缜密思维,选择结构
《C语言程序设计》是大学几乎所有理工科学生一入学必学的课程。由于C语言既能编写系统软件又能编写应用软件, 在计算机行业中有着的特殊重要的地位, 同时, 学好C语言又能为学习其他学科培养严密的逻辑思维, 所以C语言的重要性不言而喻。
1 学生学习C语言的实际状况
因为大部分学生头一次接触程序设计类课程, 对程序的架构、设计思想、设计理念等等一概一片空白, 更别说什么编程技巧了。加之若干零零碎碎的语法细节, 真是让学生云里雾里, 等稍微回过神来、刚刚有点感觉的时候, 课程可能已经过了大半, 此时在指针处再“摔个跟头”, 还没等“爬起来”又“碰”上了看上去代码一堆一堆的结构体、共用体、文件, 得!这一路, 真是跌跌撞撞, 没准很多人上了考场还是“鼻青脸肿”呢!
针对初学者的这种状况, 结合多年的教学经验, 我认为在《C语言程序设计》的教学过程中应着重贯彻以下几点。
2 几个教学观点
2.1 从“过去”到“现在”
每每看到学生被C语言“折磨”的心力交瘁的样子, 就会联想起当初自己学习C语言时的“迷茫”、“无助”。此时我就愈发体会到教师的作用有多么重要, 如果教师在教学中多注意学生的感受, 多反思自身的教学[1], 多换位思考, 多回忆一下“当初自己学习C语言时处在什么样的知识结构状态?对课程存在哪些疑虑?”, 那么你可能就会给出他们心坎上的答案, 及时消除了他们的困惑。因此, 经常从“过去”的自己联想到“现在”的学生, 备课时教师就会自然地多想想自己第一次学习C语言时存在什么疑惑?如何从学生目前所学的知识出发引出新的教学内容?用什么样的例子能形象说明重点、难点?诸如此类的问题我们想得越多, 上课时就越游刃有余。
2.2 从“宏观”到“微观”
没有学过任何编程语言的人刚接触入门时, 可以说一点感觉没有, 他们不知道要学的是个什么东西, “长”成什么样, 有什么用。因此C语言教学之初, 先应该从全局上概述C程序的框架, 让学生能从宏观的角度把握即将学习的内容, 对新内容有个大体轮廓, 形成全局意识, 为以后有的放矢的学习作个良好的铺垫。等到所有内容学完之后, 一定再强化一下所有内容的内在联系, 为原来的框架“填血加肉”, 使其更加丰满、更加鲜活, 毕竟学活的知识才更加有意义。
所以教学中, 应把握以下几点: (1) C程序由若干函数组成, 函数无外乎三大类:主函数, 库函数和自定义函数; (2) 每个函数都可能涉及决定机器操作流程的三种结构 (其实也就是人解决问题的思维过程) ; (3) 机器干活时, 首先需解决原材料、加工过程中的中间产物和最终结果的存放空间问题, 即数据的存储问题, 通过定义不同类型的变量来解决。如果想长期存放数据, 用文件解决; (4) 在以上向机器下达指令的过程中, 需要一套完整的语言体系以达到让机器能“看懂命令”的目的, 这就是编程语言的基本语法。
2.3 从“看程序”到“编程序”
学习程序设计很大程度上要求学会编程思想, 能自己编出实用的程序来。不过一提到编程, 恐怕大部分学生就会头疼, 即使课程学完了, 能将典型程序独立编出来的也是凤毛麟角。
其实, 编程序跟写文章一样, 一开始谁都不会编。回想我们小学时写作文, 不都是先看很多优秀作文选里的文章, 然后慢慢自己模仿着写吗?所以在让学生自己动手编程前也应该鼓励学生多看书上写好的程序, 特别是经典的程序。看懂后自己一定试着编一遍, 然后与原程序比较, 看看自己有哪些地方没想到, 哪些地方有问题, 人家又是怎么处理的。
2.4 从“用程序”到“编程序”
很多学生看程序时总会感叹于编程人思维的缜密, “人家怎么就能想到, 我怎么就没想到呢?”, 于是有部分人就开始自怨自艾, 唉!我不是编程的料!其实, 人家的缜密思维除来自大量程序的积累外, 还有很重要一点就是编程人一定要站在用户的立场上看程序, 把自己想象成用户正在使用这个程序, 那么在程序运行过程中自己可能会有什么样的操作呢?比如选择结构部分有一道根据收入计算纳税的问题 (假设变量income存放收入) 。思路代码如下:
这个思路再正常不过, 但是如果自己操作时不小心将数据输错了, 可能输了负数, 那么程序应该有个信息提示告诉用户输错了。思路代码修改如下:
虽然有错误信息提示, 但是进一步思考, 光让计算机不再计算、用户知道自己输错了就万事大吉了吗?犯错在所难免, 总得给人家改正的机会吧, 鉴于此, 作如下修改:
这样改完之后, 即使输入有误, 计算机也不至于还“傻乎乎”地按错误输入进行计算, 同时屏幕上不但有错误信息提示, 还给用户改正机会, 而且机会还是无限次。瞧!如果编程人始终从用户的角度考虑问题, 那么缜密性思维不也就逐步形成了吗?
3 结束语
世上没有医治百病的灵丹妙药, 更没有医治教育百病的灵丹妙药, 所以不可能单凭几个教学经验总结就能解决所有学生的学习问题。因此, 我们教师应该在教学中不断地发现每个学生的特点, 具体问题具体分析, 在一些总的原则下因人而异, 因为教师的真正本领, 不在于他是否会讲述知识, 而在于是否能唤起学生的求知欲望, 让他们兴趣盎然地参与到教学过程中来[2]。
参考文献
[1]闫林, 刘慧.反思性教学在C语言教学中的应用研究[J].福建电脑.2007 (11) :211-212
--第二种解决办法:--1,先跨表查询自己,先求出的结果中,e1.sal不可能出现最大数--2,然后再not in select e2.sal from emp e1,emp e2 where e1.sal>e2.sal select sal from emp where sal not in(select e2.sal from emp e1,emp e2 where e1.sal>e2.sal)
-----求平均薪水最高的部门的部门编号--第一种解决办法:--1,先求出每个部门的平均薪水, select deptno,avg(sal)avg_sal from emp group by deptno--2,再求每个部门的平均薪水的最高值, select max(avg_sal)from(***1111111111)--3,最后再求第一步结果中avg_sal = 最高薪水的记录.select deptno from(111111111111)where avg_sal =(22222222)
select deptno from(select deptno,avg(sal)avg_sal from emp group by deptno)where avg_sal =(select max(avg_sal)from(select deptno,avg(sal)avg_sal from emp group by deptno))
--没法考虑并列第一的情况 select deptno from(select deptno,avg(sal)avg_sal from emp group by deptno order by avg(sal)desc)
where rownum<=1
--第二种解决办法:--1,将上面的第一步第二步合并,先求最高平均薪水,用max(avg(sal))的办法--不能写成select deptno,max(avg(sal))from emp group by deptno select max(avg(sal))from emp group by deptno--2,求出每个部门的平均薪水
select deptno,avg(sal)avg_sal from emp group by deptno--3,最后再求第二步结果中(即每个部门的平均薪水),avg_sal =(第一步结果)的记录.即avg_sal =最高薪水的记录.select deptno from(select deptno,avg(sal)avg_sal from emp group by deptno)where avg_sal =(select max(avg(sal))from emp group by deptno)
--第三种解决办法:--1,先求出每个部门的平均薪水, select avg(sal)avg_sal from emp group by deptno--2,求最高平均薪水,用max(avg(sal))的办法
select max(avg(sal))from emp group by deptno--3,再使用having语句, avg(sal)= 第二步的结果 注意:为组函数起的别名在having中不能用
select deptno from emp group by deptno having avg(sal)=(select max(avg(sal))from emp group by deptno)
-----求平均薪水最高的部门的部门名称--1,部门平均最高薪水
--2,得到部门编号列表,注意用group by deptno--3,再应用having子句, having avg(sal)=(第一步的结果)--4,得到平均最高薪水的那个部门的编号--5,再得到部门名称
select dname from dept where deptno in(select deptno from(select deptno,avg(sal)avg_sal from emp group by deptno)
where avg_sal =(select max(avg_sal)from(select deptno,avg(sal)avg_sal from emp group by deptno)))
-----求平均薪水的等级最低的部门的部门名称
--第一步:部门平均薪水的等级,分成两个小步骤,第一小步是求部门平均薪水
select * from(select deptno,avg(sal)avg_sal from emp group by deptno)t join salgrade on avg_sal between losal and hisal
--第二步:最低的等级值
select min(grade)from(***1111111111)
--第三步:等于最低值的部门编号------------有错误,应该是grade= select deptno from(111111111111)where grade =(22222222222222)--第四步:求名称
select dname from dept where deptno in(33333333333)select dname from dept where deptno in(select deptno from(select * from(select deptno, avg(sal)avg_sal from emp group by deptno)t join salgrade on avg_sal between losal and hisal)where grade =(select min(grade)from(select * from(select deptno, avg(sal)avg_sal from emp group by deptno)t join salgrade on avg_sal between losal and hisal)))
--也可以用视图的方式来解决--conn sys/bjsxt as sysdba--grant create table, create view, create sequence to scott--根据第一步的结果,建立一个view
create or replace view v1 as--必须明确定义列
select deptno, avg_sal, grade from(select deptno,avg(sal)avg_sal from emp group by deptno)t join salgrade on avg_sal between losal and hisal
--查看一下
select * from v1--查询一下
--带入view
16、要想共享初始化的过程,可以先定义一个共享成员函数,然后每个构造函数都调用之。
17、C++提供的默认构造函数是个无参构造函数,它仅负责创建对象,而不做任何初始化工作。只要一个类定义了一个构造函数,C++就不再提供默认的构造函数。(如果此时还想要无参构造函数,则需要自己定义)
与变量定义类似,在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的位模式全为0,否则对象值是随机的。创建对象的唯一途径是调用构造函数。
静态对象只被构造一次,所有全局对象都在主函数main()之前被构造。
18、面向对象程序设计主要是两方面:面向对象应用程序设计,类库的设计。面向对象程序设计的关键是如何抽象和分类。
19、全局变量、静态变量、常量存放在全局数据区,所有类成员函数和非类成员函数代码存放在代码区,为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区,余下的空间都被作为堆区。
void* malloc(size_t);和void free(void*);在头文件malloc.h中声明。而操作符new和delete是C++的一部分,无须包含头文件,它们都是从堆中分配和释放内存块,但是具体操作上两者有很大的区别。
操作堆内存时,如果分配了内存,就有责任回收它,否则运行的程序将会造成内存泄露,这与函数中栈区分配局部变量有本质的区别。
从C++来说,不使用malloc()函数一个原因是,它在分配空间的时候不能调用构造函数。
类对象的建立是分配空间,构造结构及初始化的三位一体,它们统一由构造函数来完成。而new和delete在创建对象和删除对象时,便同时调用构造函数和析构函数。
定义对象数组,在生成对象时,依次调用构造函数(如依次生成ps[0],ps[1],ps[2]......),由于分配数组时,new的格式是类型后面跟[元素个数](student* ps=new student[10]),不能再跟构造函数参数,所以从堆上分配对象数组,只能调用默认的构造函数,不能调用其它任何构造函数,如果该类没有默认的构造函数,则分配对象数组失败。Delete[] ps告诉C++将要该指针指向的是一个数组,如果在[]中填上了长度信息,C++将忽略。20、拷贝构造函数
当构造函数的参数为自身类的引用时,这个构造函数称为拷贝构造函数。拷贝构造函数的功能是用一个已有对象初始化一个正在建立的同类对象。拷贝构造函数定义形式如下: Student(student& s)
27、C++基础笔记(一)墨涵天地
Person p1;
p2=p1;
27、C++基础笔记(一)墨涵天地
27、C++基础笔记(一)墨涵天地
在创建对象p2时,对象p1被复制给了p2,同时资源也作了复制,此时p1和p2指向不同的资源,这称为深拷贝。
27、C++基础笔记(一)墨涵天地
如果你的类需要析构函数来析构资源,则它也需要一个拷贝构造函数。C++提供的默认函
数只是对对象进行浅拷贝复制。如果对象的数据成员包括指向堆空间的指针,就不能使用这种拷贝方式,要自己定义拷贝构造函数,为创建的对象分配堆空间。
21、静态成员
这种属于类的一部分,但既不适用于普通成员函数,也不适用于全局变量表示的数据,我们用静态成员来表示。
一般情况下,我们在类的内部实现中对静态数据成员进行定义(在类的内部实现中分配空间和初始化)。
Int student::noOfstudent=0;静态数据成员一般用于:
标志一个事件的发生与否,某个特定的指针,变化的对象等。
静态成员函数定义是类的内部实现,属于类的一部分,定义位置同一般成员函数。与静态数据成员一样,静态成员函数与类相联系,不与类的对象相联系,所以访问静态成员函数时,不需要对象。如果用对象去引用静态成员函数,只是用其类型。
#include
} protected: char name[40];static int noOfStudents;};int Student::noOfStudents=1;int main(){ Student s;cout< ********************************* class Sc { public: void nsfn(int a);//类同声明成Sc::nsfn(Sc* this,int a) static void sfn(int a);//无this指针 //...};void f(Sc& s){ s.nsfn(10);//C++编译成Sc::nsfn(&s,10)s.sfn(10);//C++编译成Sc::sfn(10)} f=f1+f2; printf(“%dt”,f); k++; if(k%5==0) printf(“n”); f1=f2; f2=f;} printf(“n”);return 0;} P124 3统计一个整数的位数 #include n/=10; k++;} printf(“%dn”,k);return 0;} P124 4求逆序数 #include n=a%10; printf(“%d”,n); a=a/10; } return 0;} P124 5输出回文数 #include m=0; t=n; while(t>0) { m=m*10+t%10; t=t/10; } if(n==m) { printf(“%dt”,n); k++; if(k%9==0) printf(“n”); } } printf(“n”);return 0;} 判断回文数 #include } printf(“请输入一个整数:”);scanf(“%d”,&n);t=n;while(t>0){ m=m*10+t%10;t=t/10;} if(n==m)printf(“%d是回文数n”,n);else printf(“%d不是回文数n”,n);return 0;实验指导书 P33 1求奇偶数和 #include printf(“请输入第%d个整数x=”,i);scanf(“%d”,&x);if(x%2==0){ n=n+x; i++;} else { m=m+x; i++;} } printf(“奇数之和m=%d,偶数之和n=%dn”,m,n); m=0,n=0,i=1,x;do { printf(“请输入第%d个整数x=”,i);scanf(“%d”,&x);if(x%2==0){ n=n+x; i++;} else { m=m+x; i++;} }while(i<=10);printf(“奇数之和m=%d,偶数之和n=%dn”,m,n); m=0,n=0,i,x;for(i=1;i<=10;i++){ printf(“请输入第%d个整数x=”,i); scanf(“%d”,&x); if(x%2==0) { n=n+x; } else { m=m+x; } } printf(“奇数之和m=%d,偶数之和n=%dn”,m,n); return 0;} P33 3求e值 #include m=m*1/i; e=e+m;} printf(“e=%lfn”,e); m=1,e=1,i=1;while(fabs(1/m)>=1e-7){ m=m*i; e=e+1/m; i++;} printf(“e=%lfn”,e); m=1,e=1,i=1;do { m=m*i; e=e+1/m; i++;}while(fabs(1/m)>=1e-7);printf(“e=%lfn”,e); return 0; P33 5求最大公约数和最小公倍数 #include printf(“please input two numbers:”);scanf(“%d %d”,&x,&y);m=x*y;if(x t=x; x=y; y=t;} while((r=x%y)!=0){ x=y; y=r;} n=m/y;printf(“最大公约数%d:n”,y);printf(“最小公倍数%d:n”,n);return 0; P38 2求第一个能被9整除且个位数是5的数 #include if(i%9==0&&i%10==5) break;} printf(“第一个能被9整除且个位数是5的数为:n%dn”,i);return 0;} P38 3百钱百鸡问题 #include { } for(y=1;y<=33;y++){ for(z=3;z<=99;z=z+3){ if((5*x+3*y+z/3==100)&&(x+y+z==100)) i++;} } printf(“共有%d种买法:n”,i); x,y,z,i=0; for(x=1;x<=20;x++){ for(y=1;y<=33;y++) { for(z=3;z<=99;z=z+3) { if((5*x+3*y+z/3==100)&&(x+y+z==100)) printf(“公鸡只数:%d,母鸡只数:%d,小鸡只数%dn”,x,y,z); } } } return 0;} P38 4 #include i++; if(i*i>=15) { printf(“%dn”,2*i-1); break; } } C语言讲座01 C语言讲座02 C语言讲座03 C语言讲座04 C语言讲座05 C语言讲座07 C语言讲座08 C语言讲座09 C语言讲座10 C语言讲座11 C语言讲座12 C语言讲座13 C语言讲座14 C语言讲座全集视频内容简介: C语言是一种面向过程的计算机程序设计语言,它是目前众多计算机语言中举世公认的优秀的结构程序设计语言之一。学习C语言始终要记住“曙光在前头”和“千金难买回头看”,“千金难买回头看”是学习知识的重要方法,就是说,学习后面的知识,不要忘了回头弄清遗留下的问题和加深理解前面的知识,这是我们学生最不易做到的,然而却又是最重要的。 C语言是Combined Language(组合语言)的中英混合简称。是一种计算机程序设计语言。它既具有高级语言的特点,又具有汇编语言的特点。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛,不仅仅是在软件开发上,而且各类科研都需要用到C语言,具体应用比如单片机以及嵌入式系统开发。 C语言是由美国贝尔研究所的D.M.Ritchie于1972年推出。1978后,C语言已先后被移植到大、中、小及微型机上。 结构化程序设计的优点是便于分工合作,便于调试、维护和扩充。这种程序设计方法是将一个大程序分成若千个模块,每个模块完成一个功能,由一个总控模块来控制和协调各个模块来实现总的功能;因此,这种程序设计方法又称为模块化程序设计方法。在C语言中,函数是构成C谙言程序的最小模块。实际上,C语言的程序是由一个或者多个文件组成的,每个文件叉是由一个或多个函数组成的。因此,一个程序是由一个或多个函数组成的,其中,须有且仅有一个主函数,生函数的名字规定为rnaino这样,组成一个程序的者干个文件中,仅有一个是主文件,只有主艾件中才含有main()函数。另外,函数是由若干条语句组成的,语句是由若干个单词组成的‘单词是由若干个字符组成的。字符是构成程序的最小单元。e语言程序的构成如下所示: 程序~文件~函数~语句~单词、字符。 C语言是结构化程序设计语言,它具有构成三种基本结构模式的语句,这种结构化程序设计应具有的三种基本结构模式如下: 顺序结构棋式 它将由若干条顺序执行的语句构成,这是程序设计的最基本形式。 分支结构模式 C语言中具有条件语句和开关语句,它将会构成各种需要的分支结构模式。 循环结构模式 C语言中提供了三种循环语句(for循环,whil。循环和do-while循环),用它们可以构成 各种循环结构模式 在讲述C语言是一种结构化程序设计语言的同时,还必须指出它与其他结构化程序设计语言(如PASCAL语言)相比较,还有一些不完全之处,因此,C语言是一种不完全的结构化程序设计语言。其表现如下: 第一,完全的结构化程序设计语言不允许使用goto语句,因为goto语句会破坏结构化。 但是。got。语句在某些时候会使得程序简练,因此,在C语言中原则上允许使用goto语句,为了减少它对结构化的影响,采取了限制使用的办法,即规定got。语句的转向范围只能在一个函数体内。不得使用gates语句从一个函数体内转向到另一个函数体中,这种限制性地使用goto语句会给编程带来一些方便,又不会影响棋块之间的结构化。但是,建议在G语言的程序中尽量少使用goto语句。 第二,完全的结构化程序设计语言要求一个模块只有一个入口和一个出口,这样便于结构化的管理。但是,C语言程序中允许函数使用多个返回语句(return语句),即允许函数有多个出口,返回到调用函数。这样做也是为了编程中的方便。在C语言程序中,可以使用条件语句来返回不同的函数值。 由此可见,C语言虽然是一个不够严格的结构化程序设计语言,但它是一个使用起来十分灵活的高级语言。 1.计算机二级C语言程序设计考点解析:C语言程序实例 2.计算机二级C语言程序设计考点:指针 3.计算机二级C语言程序设计考点:函数 4.计算机二级C语言程序设计考点:数组 5.计算机二级C语言考点:字符型数据 6.计算机二级c语言试题 7.计算机二级C语言程序设计考点解析:常用的输人函数 8.计算机二级C语言程序设计考点解析:常用的输出函数 9.计算机二级C语言程序设计考点:单词及词法规则 //定义学生结构体,st数组。 int score[5];float jqave;int rank;}st[27]; struct kecheng { int num;char kcname[20]; //定义课程结构体,course数组.float xuefen;float biaozhuncha;int youxiu;int lianghao;int zhongdeng;int jige;int bujige; }course[5]; void readdata1(){ int i,j; char str1[100]; FILE *f1; f1=fopen(“c:xinji110213.txt”,“r”); fgets(str1,100,f1);// printf(“%-s”,str1); for(i=0;i<27;i++) { fscanf(f1,“%d%s”,&st[i].num,st[i].name); // printf(“%-4d%-10s”,st[i].num,st[i].name); for(j=0;j<5;j++) { fscanf(f1,“%d”,&st[i].score[j]);// printf(“%-9d”,st[i].score[j]);} // printf(“n”);} fclose(f1);} void readdata2(){ int k; char str2[100]; FILE *f2; f2=fopen(“c:xj02kc.txt”,“r”); fgets(str2,100,f2);// puts(str2); for(k=0;k<5;k++) { fscanf(f2,“%d%s%f”,&course[k].num,course[k].kcname,&course[k].xuefen); // printf(“%-8d%-10s%2.1fn”,course[k].num,course[k].kcname,course[k].xuefen); } fclose(f2);} void jqave(){ int i,j;float s=0,sum=0;for(i=0;i<27;i++) { for(j=0;j<5;j++) { s+=course[j].xuefen; sum+=st[i].score[j]*course[j].xuefen; } st[i].jqave =sum/s; } } void ranking() { int i,j; for(i=0;i<27;i++){ st[i].rank=1; for(j=0;j<27;j++) if(st[i].jqave st[i].rank=st[i].rank+1;} } void paiminghoudechengji(){ int i,j;FILE *fp;fp=fopen(“c:MC110213.txt”,“w”);printf(“ 名次 学号 姓名 数学分析 高等代数 C语言 大学物理 大学艺术 加权平均分 n”);fprintf(fp,“ 名次 学号 姓名 数学分析 高等代数 C语言 大学物理 大学艺术 加权平均分 n”); for(i=0;i<27;i++) { printf(“%3d%5d%8s”,st[i].rank,st[i].num,st[i].name); fprintf(fp,“%3d%5d%8s”,st[i].rank,st[i].num,st[i].name); for(j=0;j<5;j++) { printf(“%10d”,st[i].score[j]); fprintf(fp,“%10d”,st[i].score[j]); } printf(“%12.2fn”,st[i].jqave); fprintf(fp,“%12.2fn”,st[i].jqave);} fclose(fp);} void xiechengji(){ int j;FILE *fp;fp=fopen(“c:xj1110213.txt”,“w”);fprintf(fp,“ 编号 课程名称 课程学分 标准差 优秀 良好 中等 及格 不及格 n”);printf(“ 编号 课程名称 课程学分 标准差 优秀 良好 中等 及格 不及格 n”);for(j=0;j<5;j++) { printf(“%3d%15s%10.2f”,course[j].num,course[j].kcname,course[j].xuefen);fprintf(fp,“%3d%15s%10.2f”,course[j].num,course[j].kcname,course[j].xuefen); printf(“%10.1f%8d%8d%8d%8d%6dn”,course[j].biaozhuncha,course[j].youxiu,course[j].lianghao,course[j].zhongdeng,course[j].jige,course[j].bujige); fprintf(fp,“%10.1f%8d%8d%8d%8d%6dn”,course[j].biaozhuncha,course[j].youxiu,course[j].lianghao,course[j].zhongdeng,course[j].jige,course[j].bujige); } fclose(fp);} void pingjunfen(){ int i,j; for(j=0;j<5;j++) { float zongfen=0,pingjunfen=0; for(i=0;i<27;i++) zongfen+=st[i].score[j]; pingjunfen=zongfen/27; } } void biaozhuncha(){ int i,j; for(j=0;j<5;j++){ float zongfen=0,pingjunfen=0,x=0; for(i=0;i<27;i++) zongfen+=st[i].score[j]; pingjunfen=zongfen/27; for(i=0;i<27;i++) x+=(st[i].score[j]-pingjunfen)*(st[i].score[j]-pingjunfen); course[j].biaozhuncha=(float)sqrt((x/27)); } } void count(){ int i,j; for(i=0;i<5;i++) { course[i].youxiu=0,course[i].lianghao=0,course[i].zhongdeng=0,course[i].jige=0,course[i].bujige=0; for(j=0;j<27;j++) { if(st[j].score[i]<60) course[i].bujige++; else if(st[j].score[i]<=69) course[i].jige++; else if(st[j].score[i]<=79) course[i].zhongdeng++; else if(st[j].score[i]<=89) course[i].lianghao++; else course[i].youxiu++; } } } void chengjitiao(){ int i,j;FILE *fp;fp=fopen(“c:cjt110213.txt”,“w”);do { printf(“请输入你要查询的编号 退出请按零”); scanf(“%d”,&i); fprintf(fp,“ 编号 姓名 数学分析 高等代数 C语言 大学物理 大学艺术 加权平均分 名次n”);printf(“ 编号 姓名 数学分析 高等代数 C语言 大学物理 大学艺术 加权平均分 名次n”);if(i>=0&&i<=26)fprintf(fp,“%3d%10s”,st[i-1].num,st[i-1].name); printf(“%3d%10s”,st[i-1].num,st[i-1].name);for(j=0;j<5;j++){ printf(“%9d”,st[i-1].score[j]); fprintf(fp,“%9d”,st[i-1].score[j]);} printf(“%12.2f%8dn”,st[i-1].jqave,st[i-1].rank);fprintf(fp,“%12.2f%8dn”,st[i-1].jqave,st[i-1].rank);fclose(fp);} while(i>0&&i<28); } void bujigexueshengmingdan(){ int i,j; printf(“不及格学生名单如下:n”);printf(“ 学号 姓名 不及格课程 分数 n”);for(i=0;i<27;i++){ for(j=0;j<5;j++) if(st[i].score[j]<60) {printf(“%3d%12s”,st[i].num,st[i].name); printf(“%15s%8dn”,course[j].kcname,st[i].score[j]); // printf(“ 平均分”); // printf(“%10.2f 名次%8dn”,st[i].jqave,st[i].rank); } } } void youdeng(){ int i,k;printf(“ 优等生名单如下n”);printf(“编号 姓名 数学分析 高等代数 C语言 大学物理 大学艺术 加权平均分 名次n”);for(i=0;i<27;i++){ // for(j=0;j<5;j++) if(st[i].jqave>=90||st[i].rank<=3) { printf(“%2d%10s”,st[i].num,st[i].name); for(k=0;k<5;k++) printf(“%9d”,st[i].score[k]); printf(“%10.2f%8dn”,st[i].jqave,st[i].rank); } else; } } void caidan() { loop: printf(“ &&简易教学管理系统&&n”); printf(“press 1 for 排名后的成绩表 !n”); printf(“press 2 for 各科成绩情况!n”); printf(“press 3 for 成绩条!n”); printf(“press 4 for 不及格学生名单!n”); printf(“press 5 for 优等生名单!n”); printf(“press 0 for 退出n”); int t; scanf(“%d”,&t); switch(t) { case 1: paiminghoudechengji();break; case 2: xiechengji();break; case 3: chengjitiao();break; case 4: bujigexueshengmingdan();break; case 5: youdeng();break; case 0: exit(0); } goto loop; } void main(){ readdata1(); readdata2(); jqave(); ranking(); pingjunfen(); biaozhuncha();count(); 实验二 循环结构程序设计 班级 2012196 学号 201219628 姓名 李明月 一、实验目的 (1)掌握用while语句,do-while语句和for语句实现循环的方法;(2)掌握循环结构的嵌套; (3)掌握break语句和continue语句的使用方法。 二、实验内容及步骤 1.相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着8×8共64格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第一个格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上的64个格子,我就感恩不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。国王能兑现他的许诺吗? 程序1:试编程计算舍罕王共要多少粒麦子赏赐他的宰相,这些麦子合多少立方米?(已知1立方米麦子约1.42e8粒)总粒数为:sum=1+2+22+23+„+263 程序代码: #include for(i=1;i<=63;i++)//用for循环语句实现循环运算 { t=t*2;sum+=t;//循环表达式 } printf(“总麦粒数为:%fn”,sum);v=sum/1.42e8;printf(“折合体积为: %f立方米n”,v);//对结果进行输出 return 0;} 运行结果: 2.求完数。 程序2:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程找出1000之内的所有完数,输出所有的完数(要求:一行显示6个数); 程序代码: #include sum=0;for(j=1;j if(i%j==0) { sum=sum+j; } } if(sum==i) { printf(“ %d”,i); n=n+1; if(n%2==0) printf(“n”); } } printf(“n”);return 0;} 运行结果: 3.打印九九乘法表 程序3:编程输出如下上三角形式的九九乘法表。2 3 4 5 6 7 8 9-------n“);for(i=1;i<10;i++)//i { for(j=1;j<=i;j++)// printf(” “);for(j=i;j<10;j++)//j printf(”%-2d “,i*j);// printf(”n“);} 代表行 输出空格达到来使得向右对齐代表列 输出行与列的乘积 3 1 2 3 4 5 6 7 8 9 运行结果: 三、问题讨论 break语句和continue语句在循环结构中使用时有何区别?举例说明。 break语句是跳出整个循环过程,不再判断执行循环的田间是否成立,并且break语句不能用于循环语句和switch语句之外的任何其他语句中。而continue语句则只是结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。 例子: #include printf(”%d“,i);} printf(”n");return 0;} 输出: 但是换成break之后: 四、实验心得 【黑马程序员C语言教程:C语言基础之#define详解】推荐阅读: 黑马程序员:IOS面试宝典之c语言07-20 【黑马程序员】Java基础总结05-30 c语言递归程序11-06 c语言设计程序11-11 c语言源程序10-03 c语言程序设计基础题10-28 汉诺塔c语言程序07-15 c语言程序期末试卷09-22 c语言程序设计实验11-19 c语言程序设计解析02-17黑马程序员C语言教程:C语言基础之#define详解 篇5
视频教程:C语言讲座全集视频 篇6
黑马程序员C语言教程:C语言基础之#define详解 篇7
C语言课程设计程序 篇8
黑马程序员C语言教程:C语言基础之#define详解 篇9