C程序员实习日记(通用8篇)
试题1:分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)
解答:
BOOL型变量:if(!var)
int型变量: if(var==0)
float型变量:
const float EPSINON = 0.00001;
if ((x >= – EPSINON) && (x <= EPSINON)
指针变量: if(var==NULL)
剖析:
考查对0值判断的“内功”,BOOL型变量的0判断完全可以写成if(var==0),而int型变量也可以写成if(!var),指针变量的判断也可以写成if(!var),上述写法虽然程序都能正确运行,但是未能清晰地表达程序的意思,
一般的,如果想让if判断一个变量的“真”、“假”,应直接使用if(var)、if(!var),表明其为“逻辑”判断;如果用if判断一个数值型变量 (short、int、long等),应该用if(var==0),表明是与0进行“数值”上的比较;而判断指针则适宜用if(var==NULL),这是一种很好的编程习惯。
浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。如果写成if (x == 0.0),则判为错,得0分。
试题2:以下为Windows NT下的`32位C++程序,请计算sizeof的值
void Func ( char str[100] )
{
sizeof( str ) = ?
}
void *p = malloc( 100 );
sizeof ( p ) = ?
解答:
sizeof( str ) = 4
sizeof ( p ) = 4
剖析:
Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
数组名的本质如下:
(1)数组名指代一种数据结构,这种数据结构就是数组;
例如:
char str[10];
cout << sizeof(str) << endl;
输出结果为10,str指代数据结构char[10]。
(2)数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;
char str[10];
str++; //编译出错,提示str不是左值
(3)数组名作为函数形参时,沦为普通指针。
Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof ( p ) 都为4。
试题3:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?
least = MIN(*p++, b);
解答:
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
MIN(*p++, b)会产生宏的副作用
剖析:
这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换,
程序员对宏定义的使用要非常小心,特别要注意两个问题:
(1)谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:
#define MIN(A,B) (A) <= (B) ? (A) : (B)
#define MIN(A,B) (A <= B ? A : B )
都应判0分;
(2)防止宏的副作用。
宏定义#define MIN(A,B) ((A) <= (B) ? (A) : (B))对MIN(*p++, b)的作用结果是:
((*p++) <= (b) ? (*p++) : (*p++))
这个表达式会产生副作用,指针p会作三次++自增操作。
除此之外,另一个应该判0分的解答是:
#define MIN(A,B) ((A) <= (B) ? (A) : (B));
这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清,只能被无情地判0分并被面试官淘汰。
试题4:为什么标准头文件都有类似以下的结构?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern “C” {
#endif
/*…*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */
解答:
头文件中的编译宏
#ifndef __INCvxWorksh
#define __INCvxWorksh
#endif
的作用是防止被重复引用。
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在symbol库中的名字与C语言的不同。例如,假设某个函数的原型为:
void foo(int x, int y);
该函数被C编译器编译后在symbol库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C++就是考这种机制来实现函数重载的。
为了实现C和C++的混合编程,C++提供了C连接交换指定符号extern “C”来解决名字匹配问题,函数声明前加上extern “C”后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C++的函数了。
试题5:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”
函数头是这样的:
//pStr是指向以’′结尾的字符串的指针
//steps是要求移动的n
void LoopMove ( char * pStr, int steps )
{
//请填充…
}
解答:
正确解答1:
一周没有写东西了,今天上校内的时候有个好友分享了这篇帖子,深有感触,以后坚决不用TC了,去下个VC++来学习C,哈哈~~还说我们用的教材太LJ了,这个我倒不怎么清楚,因为没学懂啊。。
看文章结尾的链接就知道是CSDN上的了,以下是原文:
=================T5K5的学习分割线=================
学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文的主题。请注意,即使是“最小的代价”,也绝不是什么捷径,而是以最短的时间取得最多的收获,同时也意味着你需要经历艰苦的过程。
一、要读就读好书,否则不如不读
所有初学者面临的第一个问题便是:如何选择教材。好的开始是成功的一半,选择一本优秀的教材是事半功倍的关键因素。不幸的是,学校通常会帮你指定一本很差劲的C语言课本;而幸运的是,你还可以再次选择。
大名鼎鼎的谭浩强教授出了一本《C语言程序设计》,据说发行量有超过400万,据我所知,很多学校都会推荐这本书作为C语言课本。虽然本人的名字(谭浩宇)跟教授仅仅一字之差,但我是无比坚定地黑他这本书的。这本书不是写给计算机专业的学生的,而是给那些需要考计算机等级考试的其它专业学生看的。这本书的主要缺点是:例子程序非常不专业,不能教给你程序设计应该掌握的思考方式;程序风格相当地不好,会让你养成乱写代码的恶习;错误太多,曾经有人指出过这本书的上百个错误,其中不乏关键的概念性错误。好了,这本书我也不想说太多了,有兴趣大家可以百度一下:)
Kernighan和Ritchie的《The C Programming Language》(中译名《C程序设计语言》)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标准C语言相去甚远,大家一定要看最新的版本,否则不如不看。另外,即使是最经典最权威的书,也没有办法面面俱到,所以手边常备一本《C语言参考手册》是十分必要的。《C语言参考手册》就是《C Reference Manual》,是C语言标准的详细描述,包括绝大多数C标准库函数的细节,算得上是最好的标准C语言的工具书。顺便提一句,最新的《C程序设计语言》是根据C89标准修订的,而《C语言参考手册》描述的是C99标准,二者可能会有些出入,建议按照C99标准学习。还有一本《C和指针》,写得也是相当地不错,英文名是《Pointers on C》,特别地强调指针的重要性,算是本书的一个特点吧。不过这本书并不十分适合初学者,如果你曾经学过C语言,有那么一些C语言的基础但又不是很扎实,那么你可以尝试一下这本书。我相信,只要你理解了指针,C语言便不再神秘。
如果你已经啃完了一本C语言教材,想要更进一步,那么有两本书你一定要看。首先是《C Traps and Pitfalls》(中译名《C陷井与缺陷》),很薄的一本小册子,内容非常非常地有趣。要注意一点,这本书是二十多年前写成的,里面提到的很多C语言的缺陷都已被改进,不过能够了解一些历史也不是什么坏事。然后你可以挑战一下《Expert C Programming》(中译名《C专家编程》),书如其名,这本书颇具难度,一旦你仔细读完并能透彻理解,你便可以放心大胆地在简历上写“精通C语言”了。
切记一个原则,不要读自己目前还看不懂的书,那是浪费生命。如果你看不懂,那你一定是缺失了某些必需基础知识。此时,你要仔细分析自己需要补充哪些内容,然后再去书店寻找讲述的这些内容的书籍。把基础知识补充完毕再回头来学习,才会真正的事半功倍。
二、Unix/Linux还是Windows,这是个很大的问题
不同的编程环境会造就出不同思维的程序员。Windows的程序员大多依赖集成开发环境,比如Visual Studio,而Unix程序员更加钟爱Makefile与控制台。显而易见,集成开发环境更容易上手,在Windows上学习C语言,只需要会按几个基本的Visutal C++工具栏按钮就可以开始写Hello, World!了,而在Unix下,你需要一些控制台操作的基本知识。有人也许认为Unix的环境更简洁,但习惯的力量是很大的,大家都很熟悉Windows的基本操作,而为了学习C语言去专门装一个Unix系统,似乎有点不划算。
对于一个只懂得Windows基本操作、连DOS是什么都不知道的新手而言,尽快做一些有趣而有意义的事情才是最重要的。用C语言写一个小程序远比学习ls、cat等命令有趣,况且我们要专注于C语言本身,就不得不暂时忽略一些东西,比如编译链接的过程、Makefile的写法等等等等。
所以我建议初学者应该以Visual C++ 6.0(不是VisualC++.NET)或者Dev C++作为主要的学习环境,而且千万不要在IDE的使用技巧上过多纠缠,因为今后你一定要转向Unix环境的。Visual C++ 6.0使用很方便,调试也很直观,但其默认的编译器对C标准的支持并不好,而Dev C++使用gcc编译器,对C99的标准都支持良好。使用顺带提一下,很多大学的C语言课程还在使用Turbo C 2.0作为实验环境,这是相当不可取的,原因其一是TC 2.0对C标准几乎没有支持,其二是TC 2.0编译得到的程序是16位的,这对今后理解32位的程序会造成极大的困扰(当然,用djgpp之类的东西可以使TC 2.0编译出32位程序,不过那过于复杂了)。
等你学完一本C语言的教材,你一定要转向Unix平台继续学习,几乎所有的C语言高级教程都是基于Unix平台的(比如《C专家编程》)。转变的过程是痛苦的,你需要面对的是各种纷繁复杂的命令,完全不同于Windows平台的思考方式,但是这种痛苦是值得的。Unix与C是共生的,Unix的思考方式和习惯更加符合C语言的思考方式和习惯。在Unix下,你可以找到无数优秀的源代码供你尽情阅读,你可以方便地查看某个库函数的联机手册,还可以看到最优秀的代码风格(说到代码风格,我会专门写一篇文章详细叙述)。
归结起来就是一句话:初学C语言,建议使用Windows系统和集成开发环境,在准备向“高手”方向努力时,请先转向Unix平台。
三、万事俱备,你就是东风
书已选定,环境配置完成,正所谓万事俱备,只欠你自己的努力了。请从书的前言开始,仔细地阅读手头的教材,很多人看书喜欢直接从第一章开始看,这是错误的做法。前言是作者对整本书的大体介绍,作者一般会告诉你需要什么基础才能够顺利阅读本书,这可以帮助你检验自己的基础知识是否已经具备。看完前言,还要浏览一下目录,了解一下书的整体结构,顺便给自己安排一下学习计划。
学习C语言,必需注意每一个细节,书上的例子代码一定要自己亲自敲一遍,编译执行输出都跟书上说的一致才能算是学完了一个例子,如果不一致,就要仔细找原因。出了书本上有的例子,自己还要“创造”一些例子,比如学习运算符优先级的时候,可以写几个相同的表达式,在不同的位置加上括号,看看有哪些不同的行为,比如*p++和(*p)++,又比如a = b == c、(a = b)== c和a =(b == c)等等。自己抄的书上的例子以及改造之后的例子,还有自己“创造”的例子,都应该仔细地归类保存,并且要在源代码中写上简短的注释,阐述这个例子的意图。
例子之后就是习题了,我建议初学者把所有的习题都独立做一遍,然后对照答案的代码,看看自己的代码有那些不足,再试着修改自己的代码。很多人不重视习题,这是极大的错误,因为作者通常会在习题中说明一些重要的道理,而不是单纯地检验前面的知识。
也许你认为这样学习太慢,其实不然。学得细致就不用走回头路,等你学到后面才发现自己前面没搞清楚,那才是真的得不偿失。一般说来,整本书读完,你应该完成数千行乃至上万行的代码,无论是原封不动照抄书上的,还是自己心血来潮写就的,都是今后继续学习的一笔财富。以我自己举例,阅读《Windows核心编程》时(我只阅读了3/4的内容),除了抄书上的代码,还自己写了很多例子,一共有5574行(用unix下的wc工具统计),时隔多日,我早已记不清Windows的系统编程了,但只要花几分钟翻出以前的代码看看,便会重新了然于胸。所谓好记性不如烂笔头,就是这个道理。
仔细读书、认真抄写源代码、独立完成习题外加更进一步的实验,最后将所有的代码留下,成为自己的经验和财富,绝对的辛苦,也绝对的事半功倍。当然,这种方式只适合学习需要精通的技术,如果不是学习C语言,你还要具体情况具体分析。
--在Where语句中使用子查询
-----雇员中最高薪水的人员名称--1,先求出最高薪水
--2,再求雇员中最高薪水的人员名称
select ename from emp where sal=(select max(sal)from emp)
--有哪些人的薪水是在整个雇员的平均薪水之上的
select ename,sal from emp where sal >(select avg(sal)from emp)
-----雇员中哪些人是经理人
--1,首先查询mgr中有哪些号码--2,再看有哪些人员的号码在此出现
select distinct mgr from emp where mgr is not null order by mgr
select ename from emp where empno in(select distinct mgr from emp where mgr is not null)--where in 中不让写orderby select ename from emp where empno in(select distinct mgr from emp where mgr is not null order by mgr)
-----在From子句中使用子查询
----
--部门平均薪水的等级
--1,首先将每个部门的平均薪水求出来
--2,然后把结果当成一张表,再用这张结果表和salgrade表做连接,以此求得薪水等级
select deptno,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;
-----每个部门最高薪水的人员名称
--1,首先将每个部门的最高薪水求出来
--2,然后把结果当成一张表,再用emp和这张结果表做连接,以此求得每个部门最高薪水的人员名称
select deptno,max(sal)from emp where deptno is not null group by deptno
select ename from emp e join(select deptno,max(sal)max_sal from emp where deptno is not null group by deptno)t on sal = max_sal and e.deptno = t.deptno
-----哪些人的薪水在部门的平均薪水之上--1,首先将每个部门的平均薪水求出来
--2,然后把结果当成一张表,再用emp和这张结果表做连接,以此求得哪些人的薪水在部门的平均薪水之上
select deptno,avg(sal)avg_sal from emp group by deptno
select * from emp join(select deptno,avg(sal)avg_sal from emp group by deptno)t on(sal>avg_sal and emp.deptno=t.deptno)-----求部门中(所有人的)平均的薪水等级,形式如:--deptno avg_grade--10 3.67--20 2.8--30 2.5--1,先求每个人的薪水等级--2,再按照部门分组,求平均数
select deptno,sal,grade from emp join salgrade on sal between losal and hisal select deptno,avg(grade)from(select deptno,sal,grade from emp join salgrade on sal between losal and hisal)t group by deptno
------------------------------使用伪字段:rownum,----------------------------------------------------用来标识每条记录的行号,行号从1开始,每次递增1
select rownum,emp.* from emp;--oracle下rownum只能使用 <<=,不能使用 = >>= 等比较操作符,select rownum,emp.* from emp where rownum<5;--当rownum和order by 一起使用时,会首先选出符合rownum条件的记录,然后再排序
--(错误的写法)例如,当我们要求薪水最高的前5个人时,最直接的想法可以这样写: select * from emp where rownum<5 order by sal desc--(正确的写法)可以这样写
在数据库操作中,经常需要查找特定的数据,例如:当执行“select * from student where id = 10000”语句时,MySQL数据库必须从第一条记录开始遍历,直到找到id为10000的数据。这样的效率非常低。为此,MySQL允许建立索引来加快数据表的查询和排序。
索引的概念
数据库的索引好比字典的目录,是对数据库表中一列或者多了的值进行排序后的一种结构,其作用就是提高表中的数据查询速度。MySQL中的索引分为很多种,具体如下。
1.普通索引
普通索引是由key或index定义个索引,它是MySQL中的基本索引类型,可以创建在任何数据类型中。其值是否唯一和非空有字段本身的约束条件所决定。例如,在student表的id字段上建立一个普通索引,查询记录时,就可以根据该索引查询,从而提高效率。
2.唯一性索引
唯一性索引是指由unique定义个索引,该索引所在字段的值必须是唯一的。例如,在grade表的stu_id字段上建立唯一性索引,那么stu_id字段的值就必须是唯一的。
3.全文索引
全文索引是由fulltext定义的索引,它只能创建在char、varchar或text类型的字段上。并且现在只有MyISAM存储引擎支持全文索引。
4.单列索引
单列索引指的是在表中单个字段上创建索引,它可以是普通索引、唯一索引或者全文索引,只有保证该索引只对应表中一个字段即可。
5.多列索引
多列索引是指在表的多个字段上创建索引,只有在查询条件中使用了这些字段中的第一个字段时,该索引才会被使用。如,在student表的id、name和score字段上创建一个多列索引,那么只有查询条件中使用了id字段时,该索引才会被使用。
相较于单列索引,当我们频繁的需要同时检索表中多列时,多列索引的效率会高很多。6.空间索引
空间索引是由spatial定义的索引,它只能创建在空间数据类型的字段上。MySQL中的空间数据类型有4种:geometry、point、linestring和polygon。需要注意的是,创建空间索引的字段,必须将其声明为NOT NULL,并且空间索引只能在存储引擎为MyISAM的表中创建。
需要注意的是,虽然索引可以提高数据的查询效率,但索引会占用一定的存储空间。并且创建和维护索引所消耗的时间,是随着数据量的增加而增加的。因此,使用索引时,应综合考虑其优缺点,不能肆意创建。
创建索引
要想使用索引提高数据表的访问速度,首先要创建一个索引。创建索引的方式大致可分为三种。
创建表的同时创建索引
创建表的时候可以直接创建索引,这种方式最简单、方便,其基本语法格式如下所示:
create table 表名(字段名数据类型 [完整性约束条件],字段名数据类型 [完整性约束条件], „„);
字段名数据类型
[unique|fulltext|spatial] index|key [别名](字段名1 [(长度)])[asc|desc] 关于上述语法相关解释具体如下: 1)unique:可选参数,表示唯一索引。2)fulltext:可选参数,表示全文索引。3)spatial:可选参数,表示空间索引
4)index和key:用来表示字段的索引,二者选一即可。5)别名:可选参数,表示穿件的索引名称。6)字段名1:指定索引对应字段的名称。7)长度:可选参数,用于表示索引的长度。
8)asc和desc:可选参数。asc表升序,desc表降序排列。
MySQL中的6种索引类型,如下: 1)创建普通索引
【例】在t1表中id字段上创建索引,SQL语句如下:
create table t1(id int, name varchar(20), score float,);index(id)可使用explain语句查看索引是否被使用,SQL语句如下:
explain select * from t1 where id = 1;2)创建唯一性索引
【例】创建一个表名为t2的表,在表中的id字段上建立索引名为unique_id的唯一性索引,并按升序排列,SQL语句如下:
create table t2(id int not null,);name varchar(20)not null, score float, unique index unique_id(id asc)这样,便在id字段上建立了一个名为unique_id的唯一性索引。3)创建全文索引
【例】创建一个表名为t3的表,在表中的name字段上建立索引名为fulltext_name的全文索引,SQL语句如下:
create table t3(id int not null,name varchar(20)not null, score float, fulltextindex fulltext_name(name))engine=MyISAM;这样,即可在name字段上建立一个名为fulltext_name的全文索引。
需要注意的是,由于目前只有MyISAM存储引擎支持全文索引,默认的InnoDB存储引擎不支持全文索引。因此,在建立全文索引时,一定要注意表存储引擎的类型,对于经常需要索引的字符串、文字数据等信息,可以考虑存储到MyISAM存储引擎的表中。
4)创建单列索引
【例】创建一个表名为t4的表,在表中的name字段上建立索引名为single_name的单列索引,SQL语句如下:
create table t4(id int not null,);name varchar(20)not null, score float, index single_name(name(20))这样,即可在name字段上建立一个名称为single_name的单列索引,并且索引的长度为20。
5)创建多列索引
【例】创建一个表名为 t5的表,在表中的id和name字段上建立索引名为multi的多列索引,SQL语句如下:
create table t5(id int not null,);name varchar(20)not null, score float, indexnulti(id, name(20))这样,即可在id和name字段上建立一个名为multi的多列索引。
需要注意的是,在多列索引中,只有查询条件中使用了这些字段中的第一个字段时多列索引才会被使用。
为了验证这个说法是否正确,将id字段作为查询条件,通过explain语句查可看索引的使用情况,SQL语句如下:
explain select * from t5 where id = 1;但是,如果只使用name字段作为查询条件,multi索引不会被使用。6)创建空间索引
【例】创建一个表名为t6的表,在空间类型为geometry的字段上创建空间索引,SQL语句如下:
create table t6(id int,space geometry not null, spatial index sp(space))engine=MyISAM;这样,即可在t6表中的space字段上建立名称为sp的空间索引了。
需要注意的是,创建空间索引时,所在字段的值不能为空值,并且表的存储引擎为MyISAM。
使用 create index 语句在已经存在的表上创建索引
若想在一个已经存在的表上创建索引,可以使用 create index语句,其创建索引的具体语法格式如下所示:
create [unique|fulltext|spatial] index 索引名 on表名(字段名 [(长度)] [asc|desc]);在上述语法格式中,unique、fulltext和spatial都是可选参数,分别用于表示唯一性索引、全文索引和空间索引;index用于指明字段为索引。
为了更好的展示如何使用create index语句在已经存在的表上创建索引,接下来创建一个book表,该表中没有建立任何索引,创建book表的SQL语句如下:
create table book(bookid int not null, bookname varchar(255)not null, authors varchar(255)not null, info varchar(255)null, comment varchar(255)null, publicyear year not null);创建好数据表book后,通过具体案例演示如何使用create index语句在已经存在的数据表中创建索引,具体如下:
1)创建普通索引
【例】在book表中的bookid字段上建立一个名称为index_id的普通索引,SQL语句如下:
create index index_id on book(bookid);这样,即可在book表中,为bookid字段建立一个名称为index_id的普通索引。2)创建唯一性索引
【例】在book表中的bookid字段上建立一个名称为uniqueidx的唯一性索引,SQL语句如下:
create unique index uniqueidx on book(bookid);这样,即可在book表中,为bookid字段建立一个名称为uniqueidx的唯一性索引。3)创建单列索引
【例】在book表中的comment字段上建立一个名称为singleidx的单列索引,SQL语句如下所示:
create indexsingleidx on book(comment);这样,即可在book表中,为comment字段建立一个名称为singleidx的单列索引。4)创建多列索引
【例】在book表中的authors字段和info字段上建立一个名称为mulitidx的多列索引,SQL语句如下所示:
create index mulitidxon book(authors(20), info(20));这样,即可在book表中,为authors和info字段建立一个名称为mulitidx的多列索引。5)创建全文索引
【例】删除表book,重新创建表book,在book表中的info字段上建立全文索引。首先删除book表。SQL语句如下所示:
drop table book;然后重新创建表book,SQL语句如下所示:
create table book(bookid int not null, bookname varchar(255)not null, authors varchar(255)not null, info varchar(255)null, comment varchar(255)null, publicyear year not null)engine=MyISAM;接下来使用create index 语句在book表的info字段上创建名称为fulltextidx的全文索引,SQL语句如下所示:
create fulltext indexfulltextidx on book(info);这样,即可在book表中,为info字段建立一个名称为fulltextidx的全文索引。6)创建空间索引
【例】创建表t7,在表中的g字段上创建名称为spatialidx的空间索引。首先创建数据表t7,SQL语句如下所示:
create table t7(g geometry not null)engine=MyISAM;使用create index 语句在t7表的g字段上,创建名称为spatialidx的空间索引,SQL语句如下所示:
create spatial index spatialidx on t7(g);这样,即可在t7表中,为g字段建立一个名称为spatialidx的空间索引。
使用alter table语句在已经存在的表上创建索引
在已经存在的表中创建索引,除了可以使用create index语句外,还可以使用alter table语句来完成。其语法格式:
alter table 表名 add [unique|fulltext|spatial] index 索引名(字段名 [(长度)] [asc|desc])在上述语法格式中,unique、fulltext和spatial都是可选参数,分别用于表示唯一性索引、全文索引和空间索引;add表示向表中添加字段。
接下来,同样以book表为例,对不同类型的索引进行说明,为了使book表不包含任
何索引,首先删除book表,SQL语句如下:
drop table book;然后重新建立book表,SQL语句如下:
create table book(bookid int not null, bookname varchar(255)not null, authors varchar(255)not null, info varchar(255)null, comment varchar(255)null, publicyear year not null);创建好数据表book后,就可以使用alter table语句在已存在的数据表中创建索引了,具体如下:
1)创建普通索引
【例】在表中的bookid字段上创建名称为index_id的普通索引,SQL语句如下:
alter table book add index index_id(bookid);这样,即可在book表中,为bookid字段建立一个名称为index_id的普通索引。2)创建唯一性索引
【例】在book表中的bookid字段上建立一个名称为uniqueidx的唯一性索引,SQL语句如下:
alter table book add unique uniqueidx(bookid);这样,即可在book表中,为bookid字段建立一个名称为uniqueidx的唯一性索引。3)创建单列索引
【例】在book表中的comment字段上建立一个名称为singleidx的单列索引,SQL语句如下所示:
alter table book add indexsingleidx(comment(50));这样,即可在book表中,为comment字段建立一个名称为singleidx的单列索引。4)创建多列索引
【例】在book表中的authors字段和info字段上建立一个名称为mulitidx的多列索引,SQL语句如下所示:
alter table book add indexmultidx(authors(20), info(50));这样,即可在book表中,为authors和info字段建立一个名称为mulitidx的多列索引。
5)创建全文索引
【例】删除表book,重新创建表book,在book表中的info字段上建立全文索引。首先删除book表。SQL语句如下所示:
drop table book;然后重新创建表book,SQL语句如下所示:
create table book(bookid int not null, bookname varchar(255)not null, authors varchar(255)not null, info varchar(255)null, comment varchar(255)null, publicyear year not null)engine=MyISAM;接下来使用alter table语句在book表的info字段上创建名称为fulltextidx的全文索引,SQL语句如下所示:
alter table book add fulltext indexfulltextidx(info);这样,即可在book表中,为info字段建立一个名称为fulltextidx的全文索引。6)创建空间索引
【例】创建表t8,在表中的space字段上创建名称为spatialidx的空间索引。首先创建数据表t8,SQL语句如下所示:
create table t8(space geometry not null)engine=MyISAM;使用alter table语句在t8表的space字段上,创建名称为spatialidx的空间索引,SQL语句如下所示:
alter table t8 add spatial index spatialidx(space);这样,即可在t8表中,为space字段建立一个名称为spatialidx的空间索引。
删除索引
由于索引会占用一定的磁盘空间,因此,为了避免影响数据库性能,应该及时删除不再使用的索引。删除索引的方法有两种,如下:
使用alter table删除索引
使用alter table删除索引的基本语法格式如下所示:
alter table 表名 drop index 索引名
【例】删除表book中名称为fulltextidx的全文索引
alter table book drop index fulltextidx;上述SQL语句执行后,可以使用show create table语句查看表结构,来确认索引是否已经成功被删除。
show create talbe book;使用dropindex删除索引
使用dropindex删除索引的基本语法格式如下所示:
drop index 索引名 on表名;【例】删除表t8中名称为spatialidx的空间索引,SQL语句如下:
drop index spatialidx on t8 使用show create table 语句查看表结构
c1=97;
c2=98;
printf(“c1=%c,c2=%cn”c1,c2);
printf(“c1=%d,c2=%dn”,c1,c2);
return 0;}(1)运行时会输出什么信息?为什么?(2)如果将程序第4,5行改为
c1=197;c2=198;运行时会输出什么信息?为什么?(3)如果将程序第3行改为
int c1,c2;运行时会输出什么信息?为什么?
答:(1)程序运行不了,因为程序存在错误。正确的程序为:
#include
char c1,c2;
c1=97;
c2=98;
printf(“c1=%c,c2=%cn”,c1,c2);
printf(“c1=%d,c2=%dn”,c1,c2);
return 0;}
(2)如果将程序第4,5行改为
c1=197;c2=198;
运行时会输出:
(3)如果将程序第3行改为
int c1,c2;运行时会输出:
因为int表示整型,%c是输出字符,a的ASCLL代码是97,b的是98,所以输出c1=a,c2=b.%d是表示输出十进制整型,所以输出c1=97,c2=98
2、用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’。问在键盘上如何输入?
#include
int a,b;
float x,y;
char c1,c2;
scanf(“a=%db=%d”,&a,&b);
scanf(“%f%e”,&a,&y);
scanf(“%c%c”,&c1,&c2);
return 0;} 答:输入如图:
系统需求
1、内存需求: – 1 GB
2、磁盘空间需求: swap 区需要1.5BG
3、/tmp 目录需要400 MB 的磁盘空间
4、Oracle软件需要 1.5 GB 到 3.5 GB
5、准备1.2 GB 用来重装数据库(可选)
6、为快速恢复区准备2.4 GB(可选)
7、操作系统: 根据手册文档而定
注意点:
Oracle 数据库是一个庞大的软件.启动它会占有大量的内存和 CPU 资源.如果不想让 Oracle 数据库自动启动.可做如下设置:
Oracle Database客户机
要从局域网内的一台计算机上访问另一台计算机上的 Oracle 服务.需要在此计算机上安装能通过局域网访问另一台计算机上的 Oracle 服务的客户机.Oracle 客户机安装方法(1)
Oracle 客户机安装方法(2)
Oracle 客户机安装方法(3)
Oracle 客户机安装方法(4)
Oracle 客户机安装方法(5)
Oracle 客户机安装方法(6)
Oracle 客户机安装方法(7)
Oracle 客户机安装方法(8)
Oracle 客户机安装方法(9)
Oracle 客户机安装方法(10)
Oracle 客户机安装方法(11)
Oracle 客户机安装方法(12)
Oracle 客户机安装方法(13)Oracle 客户机安装方法(14)
Oracle 客户机安装方法(15)
Oracle 客户机安装方法(16)
Oracle 客户机安装方法(17)
Oracle 客户机安装方法(18)
课题:
教学目的: 教学重点: 教学难点: 第五章 选择结构程序设计
1、掌握三种循环语句的语法结构
2、灵活运用循环语句
三种循环语句while、do-while、for 三种循环语句的区别
步骤一 引入新课
问题1:假如全班41人,欲从键盘上输入每人的数学成绩,然后计算出平均成绩; 问题2: 编程计算n!。
重复执行一组语句是程序设计要求的基本功能之一。在C语言中可以用以下语句来实现循环:(1)if 和 goto
(2)while
(3)do-while
(4)for
步骤二 讲授新课
一、goto语句及用goto构成循环 语法:goto label; 其中:label是语句标号,它命名的规则同变量名; 语义:使程序无条件地转向标号为label的语句去执行; 如:用if语句构成循环,求sum=1+2+…+100
main()
{ int i=1,sum=0;
loop:
if(i<=100)
{sum+=i;i++;goto loop;}
printf(“%d”, sum);
} 说明:
1)标号不必进行类型说明;
2)程序中的任何一个语句均可带上标号,但标号必须以冒号结束; 3)不提倡使用goto语句。
二、while语句
语法:while(exp)
循环体语句;
语义:当exp为真时,执行循环体;为假时,执行循环语句的后续语句; 如:用while语句构成循环,求sum=1+2+…+100
程序如下:main(){ int i=1, sum=0;
while(i<=100)
{ sum+=i;
i++;}
printf(“%d”,sum);} 说明:
1)循环体可以用复合语句;
2)在while语句前应有为测试表达式(exp)中的循环控制变量赋初值的语句,以确保循环的正常开始;
3)循环体内应有改变循环控制变量的语句,以确保循环进行有限次后正常结束;
如:i=1;
while(i<=100)
sum=sum+1;(死循环)
4)while 循环的特点是先判断后执行,故循环有可能一次都不被执行;
如:
i=3;
while(i<3)
printf(“i=%dn”, i);
三、do-while语句 语法:do
循环体语句;
while(exp);语义:当exp为真时,执行循环体;为假时,执行循环语句的后续语句; 如:用do-while语句构成循环,求 sum=1+2+…+100 程序如下:main(){ int i=1,sum=0;
do
{ sum+=i;
i++;}
while(i<=100);
printf(“%d”,sum);}
说明:
1)循环体可以用复合语句;
2)循环控制变量在执行do前必须赋初值;循环体内应有改变循环控制变量的语句; 3)do-while 循环的特点是先执行后判断,故循环至少被执行一次;
如:i=3;
do
{ sum+= i;
i++;
} while(i>10);例1:用公式求π的近似值,直到最后一项的绝对值小于10-6为止。π/4≈1-1/3+1/5-1/7+……
# include
while((fabs(t))>1e-6)
{ pi=pi+t;n+=2;
s=-s;t=s/n;
}
pi=pi*4;
printf(“pi=%10.6fn”,pi);}
例2:求整数a和b的最小公倍数。#include
i=0;while(1)
{ i++;
if(i%a= =0)
if(i%b= =0){printf(“%dn”, i);break;}
} }
思考:有一张足够大的纸,厚0.09毫米,问将它对折多少次后可以达到珠穆朗玛峰的高度(8848米)?
四、for 语句
语法:for(表达式1;表达式2;表达式3)
循环体语句; 语义:
1、先求表达式1;
2、求解表达式2,若其值为真,则执行第三步;若为假,则结束循环;
3、执行循环体中的语句;
4、求解表达式3;
5、转回第二步继续执行 如: for(i=1;i<=100;i++)sum=sum+i;可看成:
for(循环变量赋初值;循环条件;循环变量增值)语句;
说明:
(1)显然for循环更简洁,更灵活;(2)循环体可以是复合语句;(3)for语句中的三个表达式均可以是逗号表达式,故可同时对多个变量赋初值及修改。如:for(i=0, j=1;j (4)for语句中三个表达式可省: 省exp1;如:i=1;for(;i<5;i++) printf(“%dn”,i); 等价于for(i=1;i<5;i++)printf(“%dn”,i); 省exp2;如: for(i=1;;i++) { printf(“%dn”, i); if(i>5)break; } 省exp3;如:for(i=1;i<5;) { printf(“%dn”,i); i++;} 等价于 for(i=1;i<5;i++) printf(“%dn”,i); 表达式 1、表达式3可省略 i=1;sum=0;for(;i<=100;){ sum+=i;i++;} 三个表达式全省时,如: for(;;)语句; 等价于while(1)语句; 三个表达式可包含与循环变量无关的语句 for(;(c=getchar())!=„n‟;printf(“%c”,c)); (5)for语句中的循环体可以是空语句;如: int n=0;for(;n++ <=2;);printf(“%d”,n); 该程序段的输出结果为:4 步骤三 课堂小结 1、while、do-while、for语句的语法结构,特别是for语句中三个表达式的作用 2、whie与do-while区别 3、注意循环控制的范围 通过本次教师发展在线的C语程培训中,我受益匪浅,几位教授的精彩演讲,让我找到了自己的不足和日后教学中的改革方向和内容。同时,也让我感觉到了,有今天各位教授的良好教学效果,这其中包含了他们的艰辛、背后的大量付出和无私奉献。 我是一直从事C类语言的教学工作,对C语言的教学已有5年教龄,在这几年的教学过程中,我们也一直在寻找好的教学方法和新的教学理念。通过本次学习,我总结要教好《C语言程序设计》这门课,最基本要把握好以下几个方面: (一)要重视实践环节,上机调试成绩非常重要。 学习一门语言,就是要按照它的语法来编程。要编程,当然就要上机操作来验证你程序的正确性。所以上机非常重要,通过执行你所写的程序,完成你所写程序的目标,最终达到你的目的。而且通过执行程序,你会发现程序中的错误,从而使你了解你所学知识中的不足,同时,要学会根据编译时提示的错误来改正程序中发生的错误,以便下次不会再犯同样的错误。 (二)基本语法学习虽然枯草乏味,但是它相当于高楼大厦的一砖一瓦,一定要下硬功夫让学生掌握熟练。 C语言的语法部分。这部分内容是学好C语言的基础,只有学好了这些语法,才会写程序,看程序。所以对一个初学者来说,这部分内容是非常重要的,所以要扎实地熟悉每一个语法,并能根据这些语法来编程。 (三)学习要抓住重点,难点部分要多讲、多学、多练。 通过这次学习使得我对C语言的重点,难点,以及易出错的地方把握的更精准了。当然,这只是针对我个人而言。在C语言学习过程,重点就是数组,指针,以及结构体了。难点也是它们了,不过数组和结构体还是挺简单,所以在此主要就指针方面谈谈自己的看法。 下面谈谈通过这次学习,结合我们学校的教学情况,打算对该课程的教学进行如下几个方面的改革: (一)理论教学内容的组织 C语言的重点知识包括:结构化程序设计方法、流程图的组织、三种程序设计结构、三种基本数据类型和三种自定义数据类型;难点包括:结构程序设计方法、算法的分析、流程图的组织与设计、函数、指针等。 根据知识内容和每年的新学时安排,我们将理论教学内容分为授课内容和自学内容两大模块。 (1)授课内容 C语言的授课内容分为两阶段:①基础准备阶段 这部分内容确保学生“实用、够用”,主要包括三种基本数据类型(只要求掌握常用的int,float,char);三种常用运算符及其表达式(赋值、算术、逻辑(包括关系));三种程序设计结构(顺序、选择、循环)。②实训项目驱动阶段 这部分内容主要是“实训实战”,主要包括数组、函数、指针和结构体。通过第一阶段的学习,学生已经具备了一些程序设计的基础知识,在这一阶段将通过一个实训项目的完成来熟悉主要内容,同时巩固第一阶段的成果。 (2)自学内容 课本中的内容上课没重点介绍或者说就是没提到的,划为自学内容。但这些内容,我们并不是在课堂要求学生回去自学:要求过高,规矩过多,这样效果不佳。而是让学生在实验中发现问题后,带着问题去学习,去找答案。 例:整型 我们只介绍int基本类型,当学生想计算n!时,学生测试5!=120时,他可能会去测试20!、50!,这时,存放阶乘的变量Factorial再定义为int,结果就是0了,这时问题就来了,他就会去寻找正确的处理方法(long int)。 (二)实验教学的安排与设计 教学改革方案确定后,我们对本课程实验教学上从多方面进行了教学更新。我们考虑到学生处于了解计算机语言及编程的初级阶段,有许多最基础的内容有待掌握,所以本课程的实验教学不太适合完全以项目开发的形式进行,注重的是加强模块化实训。 (1)上好第一节实验课 我们常说“上好第一节课”,那么第一节实验节的重要性也不言而喻。这节课对培养学生的学习兴趣、增强学生的学习信心、锻炼学生的自主学习等多方面影响很大。 第一次实验项目是—熟悉Turbo C的运行环境,主要是掌握一些在TC中的一些键盘操作方式。一般是教师给学生提供程序代码(三个),但我们在学生不知情的情况下,给学生两个有语法错误的和一个正确的程序。这样,当学生运行正确的程序时,知道计算机可以帮我们处理问题,原来程序就是这样写的;当学生运行错误的程序,首先他会诧异(老师给的程序原来是错的),于是要求他们自己修改,尤其是有时一个致命错误导致的10多个errors,被学生修改后,没有了errors或所剩无几,这时学生表现的很兴奋、很有成就感,从而加强了本课程的学习兴趣和信心。 (2)分两阶段进行 实验内容与理论教学内容相互应,在基础准备阶段,这方面教学方法上主要是加强操练。通过各种大小程序、多重训练和一个问题的多种解法来加强语法知识点的掌握和训练,开阔学生编程的思路,掌握编程基础。同时,在这过程中我们严格把关,让学生课后认真准备,每次进实验室时,应有写好的完整代码,上机调试,发现问题同时解决问题,要求认真完成实验内容,并在课后书写实验报告。鼓励学生多写程序,要加强实践环节,首先要从量上有个划分。在实训项目驱动阶段。本阶段实训项目的设计非常重要,原则是既要使学生有切入点能够动手又要使各章的内容之间有联系点。 (三)案例教学法 C语言的教学,教师一般受传统应试教育的影响,狠抓理论考试,忽略了程序设计能力的培养,把授课重点放在程序设计语言的基本语法的讲授和掌握上,所选的编程实例大多用于语法规则的验证和说明,仅从程序设计语言的使用这个单一的角度进行教学,而使得大多数学生在学完本课程后,“吃不透、用不活”,表现为学生在程序调试时,对程序中出现的逻辑错误经常不知所措,在开发较大的应用程序时,不知道如何入手。 采用案例教学法,以程序设计为主线,以编程应用为驱动,通过案例和问题引出教材内容,重点讲解程序设计的思想和方法,穿插讲解相关的语言知识。使教学效果既有深度又有广度,学生实际动手能力大为增强。 【C程序员实习日记】推荐阅读: c程序设计实习报告112-11 C程序个人总结10-11 c语言递归程序11-06 c语言设计程序11-11 黑马程序员:IOS面试宝典之c语言07-20 c语言源程序10-03 c程序设计作业10-13 汉诺塔c语言程序07-15 c语言程序期末试卷09-22 《C程序设计》重点总结09-26C语言程序设计心得 篇8