c语言个人总结

2024-08-19

c语言个人总结(精选6篇)

1.c语言个人总结 篇一

4.static有什么用途?(请至少说明两种)1.限制变量的作用域 2.设置变量的存储域

7.引用与指针有什么区别? 1)引用必须被初始化,指针不必。

2)引用初始化以后不能被改变,指针可以改变所指的对象。2)不存在指向空值的引用,但是存在指向空值的指针。

8.描述实时系统的基本特性

在特定时间内完成特定的任务,实时性与可靠性

9.全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈 10.什么是平衡二叉树?

左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1 11.堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源

12.什么函数不能声明为虚函数? constructor 13.冒泡排序算法的时间复杂度是什么? O(n^2)14.写出float x 与“零值”比较的if语句。if(x>0.000001&&x<-0.000001)16.Internet采用哪种网络协议?该协议的主要层次结构? tcp/ip 应用层/传输层/网络层/数据链路层/物理层

17.Internet物理地址和IP地址转换采用什么协议? ARP(Address Resolution Protocol)(地址解析協議)18.IP地址的编码分为哪俩部分?

IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分 哪些是网络位哪些是主机位。

2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出

C程序。

循环链表,用取余操作做

3.不能做switch()的参数类型是: switch的参数不能为实型。

華為

1、局部变量能否和全局变量重名?

答:能,局部会屏蔽全局。要用全局变量,需要使用“::” 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不 会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环 体内

2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在 头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用ex tern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错

3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初 值,此时连接不会出错

4、语句for(;1 ;)有什么问题?它是什么意思? 答:和while(1)相同。

5、do„„while和while„„do有什么区别?

答:前一个循环一遍再判断,后一个判断以后再循环

6、请写出下列代码的输出内容 #include main(){ int a,b,c,d;a=10;b=a++;c=++a;d=10*a++;printf(“b,c,d:%d,%d,%d”,b,c,d);return 0;} 答:10,12,120

1、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么 区别?static函数与普通函数有什么区别?

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就 是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文 件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作 用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可 以避免在其它源文件中引起错误。

从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的 生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明 为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以 外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其 他文件单元中被引用;static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依 据上一次结果值;

static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调 用中维持一份拷贝

2、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存 在于(堆)中。

3、设有以下说明和定义:

typedef union {long i;int k[5];char c;} DATE;struct data { int cat;DATE cow;double dog;} too;DATE max;则语句 printf(“%d”,sizeof(struct date)+sizeof(max));的执行结果是:___52____ 答:DATE是一个union, 变量公用空间.里面最大的变量类型是int[5], 占用20个字节.所

以它的大小是20 data是一个struct, 每个变量分开占用空间.依次为int4 + DATE20 + double8 = 32.所以结果是 20 + 32 = 52.当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20

4、队列和栈有什么区别? 队列先进先出,栈后进先出

5、写出下列代码的输出内容 #include int inc(int a){ return(++a);} int multi(int*a,int*b,int*c){ return(*c=*a**b);} typedef int(FUNC1)(int in);typedef int(FUNC2)(int*,int*,int*);void show(FUNC2 fun,int arg1, int*arg2){ INCp=&inc;int temp =p(arg1);fun(&temp,&arg1, arg2);printf(“%dn”,*arg2);} main(){ int a;show(multi,10,&a);return 0;} 答:110

7、请找出下面代码中的所以错误

说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”

1、#include“string.h”

2、main()

3、{

4、char*src=“hello,world”;

5、char* dest=NULL;

6、int len=strlen(src);

7、dest=(char*)malloc(len);

8、char* d=dest;

9、char* s=src[len];

10、while(len--!=0)

11、d++=s--;

12、printf(“%s”,dest);

13、return 0;

14、} 答: 方法1: int main(){ char* src = “hello,world”;int len = strlen(src);char* dest =(char*)malloc(len+1);//要为分配一个空间 char* d = dest;char* s = &src[len-1];//指向最后一个字符 while(len--!= 0)*d++=*s--;*d = 0;//尾部要加 printf(“%sn”,dest);free(dest);// 使用完,应当释放空间,以免造成内存汇泄露 return 0;} 方法2:

#include #include main(){ char str[]=“hello,world”;int len=strlen(str);char t;for(int i=0;i

(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;(3)将栈B的栈顶元素pop出;

这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好。3.在c语言

库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么? 函数名: atol 功 能: 把字符串转换成长整型数

用 法: long atol(const char *nptr);程序例: #include #include int main(void){ long l;char *str = “98765432”;l = atol(lstr);printf(“string = %s integer = %ldn”, str, l);return(0);} 2.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现? c用宏定义,c++用inline 3.直接链接两个信令点的一组链路称作什么? PPP点到点连接

4.接入网用的是什么接口? 5.voip都用了那些协议? 6.软件测试都有那些种类? 黑盒:针对系统功能的测试 白合:测试函数功能,各函数接口 7.确定模块的功能和模块的接口是在软件设计的那个队段完成的? 概要设计阶段 8.enum string { x1, x2, x3=10, x4, x5, }x;问x= 0x801005,0x8010f4;9.unsigned char *p1;unsigned long *p2;p1=(unsigned char *)0x801000;p2=(unsigned long *)0x810000;请问p1+5=;p2+5=;三.选择题: 1.Ethternet链接到Internet用到以下那个协议? A.HDLC;B.ARP;C.UDP;D.TCP;E.ID 2.属于网络层协议的是: A.TCP;B.IP;C.ICMP;D.X.25 3.Windows消息调度机制是: A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;4.unsigned short hash(unsigned short key){ return(key>>)%256 } 请问hash(16),hash(256)的值分别是: A.1.16;B.8.32;C.4.16;D.1.32 四.找错题: 1.请问下面程序有什么错误? int a[60][250][1000],i,j,k;for(k=0;k<=1000;k++)for(j=0;j<250;j++)for(i=0;i<60;i++)a[i][j][k]=0;把循环语句内外换一下 2.#define Max_CB 500 void LmiQueryCSmd(Struct MSgCB * pmsg){ unsigned char ucCmdNum;......for(ucCmdNum=0;ucCmdNum

3.以下是求一个数的平方的程序,请找出错误: #define SQUARE(a)((a)*(a))int a=5;int b;b=SQUARE(a++);4.typedef unsigned char BYTE int examply_fun(BYTE gt_len;BYTE *gt_code){ BYTE *gt_buf;gt_buf=(BYTE *)MALLOC(Max_GT_Length);......if(gt_len>Max_GT_Length){ return GT_Length_ERROR;}.......} 五.问答题: 1.IP Phone的原理是什么? IPV6 2.TCP/IP通信建立的过程怎样,端口有什么作用? 三次握手,确定是哪个应用程序使用该协议

3.1号信令和7号信令有什么区别,我国某前广泛使用的是那一种? 4.列举5种以上的电话新业务?

微软亚洲技术中心的面试题!!1.进程和线程的差别。

线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于 进程的资源.(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销 明显大于创建或撤消线程时的开销。2.测试方法

人工测试:个人复查、抽查和会审 机器测试:黑盒测试和白盒测试

2.Heap与stack的差别。Heap是堆,stack是栈。

Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。Stack空间有限,Heap是很大的自由存储区

C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。

程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传 递也在栈上进行

3.Windows下的内存是如何管理的? 4.介绍.Net和.Net的安全性。

5.客户端如何访问.Net组件实现Web Service? 6.C/C++编译器中虚表是如何完成的?

7.谈谈COM的线程模型。然后讨论进程内/外组件的差别。8.谈谈IA32下的分页机制

小页(4K)两级分页模式,大页(4M)一级

9.给两个变量,如何找出一个带环单链表中是什么地方出现环的? 一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方 10.在IA32中一共有多少种办法从用户态跳到内核态?

通过调用门,从ring3到ring0,中断从ring3到ring0,进入vm86等等

11.如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现?

用内存映射或全局原子(互斥变量)、查找窗口句柄..FindWindow,互斥,写标志到文件或注册表,共享内存。.12.如何截取键盘的响应,让所有的‘a’变成‘b’? 键盘钩子SetWindowsHookEx 13.Apartment在COM中有什么用?为什么要引入?

14.存储过程是什么?有什么用?有什么优点?

我的理解就是一堆sql的集合,可以建立非常复杂的查询,编译运行,所以运行一次后,以 后再运行速度比单独执行SQL快很多

15.Template有什么特点?什么时候用? 16.谈谈Windows DNA结构的特点和优点。

网络编程中设计并发服务器,使用多进程 与 多线程,请问有什么区别?

1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他 线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。两者都可以提高程序的并发度,提高程序运行效率和响应时间。

线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正 相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。思科

1.用宏定义写出swap(x,y)#define swap(x, y)x = x + y;y = xy;2.数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字

.时间复杂度必须为o(N)函数原型: int do_dup(int a[],int N)3 一语句实现x是否为2的若干次幂的判断 int i = 512;cout << boolalpha <<((i &(ib;a = a-b;or a = a^b;// 只能对int,char..b = a^b;a = a^b;or a ^= b ^= a;3.c和c++中的struct有什么不同?

c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。

c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而clas s默认为private 4.#include #include void getmemory(char *p){ p=(char *)malloc(100);strcpy(p,“hello world”);} int main(){ char *str=NULL;getmemory(str);printf(“%s/n”,str);free(str);return 0;} 程序崩溃,getmemory中的malloc 不能返回动态内存,free()对str操作很危险 5.char szstr[10];strcpy(szstr,“0123456789”);产生什么结果?为什么?

长度不一样,会造成非法的OS 6.列举几种进程的同步机制,并比较其优缺点。

原子操作 信号量机制

自旋锁

管程,会合,分布式系统

7.进程之间通信的途径 共享存储系统 消息传递系统

管道:以文件系统为基础 11.进程死锁的原因

资源竞争及进程推进顺序非法 12.死锁的4个必要条件

互斥、请求保持、不可剥夺、环路 13.死锁的处理

鸵鸟策略、预防策略、避免策略、检测与解除死锁 15.操作系统中进程调度策略有哪几种?

FCFS(先来先服务),优先级,时间片轮转,多级反馈 8.类的静态成员和非静态成员有何区别?

类的静态成员每个类只有一个,非静态成员每个对象一个 9.纯虚函数如何定义?使用时应注意什么? virtual void f()=0;是接口,子类必须要实现 10.数组和链表的区别

数组:数据顺序存储,固定大小

连表:数据可以随机存储,大小可动态改变

12.ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点? 应用层 表示层 会话层 运输层 网络层 物理链路层 物理层

tcp /udp属于运输层

TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。与 TCP 不同,UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单,UDP 头包含很少的字节,比 TCP 负载消耗少。tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好 udp: 不提供稳定的服务,包头小,开销小

1:(void *)ptr 和(*(void**))ptr的结果是否相同?其中ptr为同一个指针.(void *)ptr 和(*(void**))ptr值是相同的 2:int main(){ int x=3;printf(“%d”,x);return 1;} 问函数既然不会被其它函数调用,为什么要返回1?

mian中,c标准认为0表示成功,非0表示错误。具体的值是某中具体出错信息

1,要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234;那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? *((void(*)())0x100000)();首先要将0x100000强制转换成函数指针,即:(void(*)())0x100000 然后再调用它: *((void(*)())0x100000)();用typedef可以看得更直观些: typedef void(*)()voidFuncPtr;*((voidFuncPtr)0x100000)();2,已知一个数组table,用一个宏定义,求出数据的元素个数 #define NTBL #define NTBL(sizeof(table)/sizeof(table[0]))面试题: 线程与进程的区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆栈? 进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候 操作系统就帮你创建了一个主线程。每个线程有自己的堆栈。

DLL中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为DLL 中的代码是被某些线程所执行,只有线程拥有堆栈,如果DLL中的代码是EXE中的线程所调 用,那么这个时候是不是说这个DLL没有自己独立的堆栈?如果DLL中的代码是由DLL自己创

建的线程所执行,那么是不是说DLL有独立的堆栈?

以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的 内存,最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中

删除,很有可能导致程序崩溃

unsigned short A = 10;printf(“~A = %un”, ~A);char c=128;printf(“c=%dn”,c);输出多少?并分析过程

第一题,~A =0xfffffff5,int值 为-11,但输出的是uint。所以输出4294967285 第二题,c=0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是12 8,所以输出-128。

这两道题都是在考察二进制向int或uint转换时的最高位处理。分析下面的程序:

void GetMemory(char **p,int num){ *p=(char *)malloc(num);

} int main(){ char *str=NULL;

GetMemory(&str,100);

strcpy(str,“hello”);

free(str);

if(str!=NULL){ strcpy(str,“world”);}

printf(“n str is %s”,str);getchar();} 问输出结果是什么?希望大家能说说原因,先谢谢了 输出str is world。

free 只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL.此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储

空间是可能被重新分配给其他变量的, 尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出 world来。

这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用 内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你 是可以继续访问这块地址的,只不过。。。。楼上都说过了,最好别这么干。

char a[10],strlen(a)为什么等于15?运行的结果 #include “stdio.h” #include “string.h” void main(){ char aa[10];printf(“%d”,strlen(aa));} sizeof()和初不初始化,没有关系; strlen()和初始化有关。

char(*str)[20];/*str是一个数组指针,即指向数组的指针.*/ char *str[20];/*str是一个指针数组,其元素为指针型数据.*/ long a=0x801010;a+5=? 0x801010用二进制表示为:“1000 0000 0001 0000 0001 0000”,十进制的值为8392720,再加上5就是8392725罗

2.c语言个人总结 篇二

C语言是学习编程语言的基础, 它集合了很多语言的特点, 我们都知道语言之间是相同的, 而C语言能够把很多语言的特点集中起来, 有高级语言和低级语言的特点, 能够编辑系统软件和应用软件, 所以C语言是一个非常重要的语言。要想学好C语言, 首先要了解下它的历史, 1970年美国AT&T贝尔实验室的Ken Thompson以BCPL语言为基础设计出很简单很接近硬件的B语言, 但B语言过于简单, 功能有限, 继而在1972年—1973年期间美国贝尔实验室D.M在B语言的基础上设计出C语言, 所以C语言用起来非常的方便, 能够给程序带来自由和便利, 这也是很多软件用它的原因之一。在C语言的语法中, 运算和程序书写是非常丰富的, 在编写程序的过程中能够用到的运算方法有很多, 可以实现很多高级程序无法实现的功能, 使用起来灵活多样, 能实现各种复杂的数据结构的运算。C语言还能够直接的访问物理地址进行各种操作, 非常方便的对程序进行控制和编译。

2 学习枯燥乏味之理由

在学习C语言的过程中很多学生对C语言提不起任何的兴趣, 导致在上课的时候压力很大, 听不进去, 甚至无法理解。C语言的功能非常强大, 这是我们学习的最基本理由, 而且目前C语言的用途很广, 收到计算机方向的重视, 所以我们也必须对自己要重视起来, 大部分同学在学习起来觉得很枯燥, 理论的东西很难记住, 对C语言的认识也不够深入, 所以会造成一个学期学完之后反过来想想, 觉得一无所获。那究其缘由为何会出现这样的情况呢?

个人认为首先一个是教学方式上, C语言的理论东西偏多, 不能通过一些直接的感官方式给学生, 造成学生的理解困难, 如果能通过很直观的方式来呈现内容的话效果应该会比较好, 比如说多进行上机的操作, 让程序能够通过界面的方式反馈出来等等。

其次是在C语言中有很多的算法和结构让很多同学觉得眼花, 很多同学只是简单的靠记忆把他记忆下来, 这样效果就很低, 而且非常枯燥, 应该要通过更多的实践练习掌握它们的规律和方法。

最后就是教师在教学上应该要注重教学方法, 不能仅仅简单的理论教学和实践教学, 应该把学生放在第一位, 能够听懂才是关键, 否则一堂课下来内容讲完了, 学生收不到你的效果。教师在课堂讲解的过程中除了课程教授之外, 还要传达C语言在整个计算机学习中的重要性, 让学生更加深入的去理解和分析, 增强他们的学习兴趣, 这个才是关键。

3 编程技巧

同学们之所以学习的非常吃力, 觉得C语言很枯燥, 归根结底是没有掌握到C语言的学习技巧, 其实对于初学者来说觉得学习吃力是正常的, 学习任何一门语言都是有一个过程的, 关键问题在于你要掌握其精髓的地方, 只要掌握了重点一定能够学好语言。对于C语言我们应该要更加注重其编程技巧, 接下来就阐述几个比较有用的技巧。

⑴指针掌握。指针的掌握在C语言中是非常重要的, 也是C语言中一个非常重要的技巧之一。指针能够在运算的过程中提高速度, 让整个编程的语句变得更加简单, 不足的地方就是消耗的内存要大点, 但是和整个编程语言来说微不足道, 如果本身内存就有富裕的话那么就一点问题都没有了, 所以同学们在学习这一章的时候一定要加强自我的学习能力, 除了老师上课讲的知识之外, 可以多去网上找相关资料进行补充, 把指针这一章做好学习。

⑵数学知识掌握。数学知识在整个计算机学习的过程中是非常重要的, 能够解决C语言中的很多问题, IT界有句话叫“数学是计算机之母”, 由此可见数学在计算机学习中的重要地位。同时, 在整个C语言的学习中如果能够很好的用到数学思想的话也能够促进学习, 在编程之前首先进行分析, 通过什么样的算法能够更加简单, 这就是数学的一种运用, 所以数学知识对学习编程语言非常有作用。

⑶位运算的掌握。使用位运算可以使代码更简洁, 效率更高) 使问题得到解决。其实在所有的计算机程序中可以说位是最小的数据单位, 一般而言所有的运算和操作都可以通过“位运算”来解决, 这足见“位”在编程语言中的重要性。在C语言当中去应用能够提高效率, 解决更多的问题。

当然不管什么样的技巧, 应该具体问题具体分析, 上述只是个人的一些看法, 总体来说能够提高编程效率, 通过让同学们不会感到枯燥, 让C语言更加广泛的应用。

4 总结

总的来说, C语言的功能非常强大, 所以作为我们学生有责任要把它学好, 为今后的就业打下基础。C语言作为高校的一门公共基础课, 不仅仅是计算机专业开设了, 其他非计算机专业的同学也要进行学习, 所以学好C语言能够提高自己的编程效率和对编程语言的理解, 对整个计算机语言的学习是非常有作用的。希望通过我的个人拙见, 让更多的同学学习C语言, 而且能够掌握, 培养自己的编程能力, 这样才能更好的服务社会。

参考文献

[1]李自清.浅谈C语言编程中的常见错误和解决方法[J].科技信息 (科学教研) , 2007 (33) .

[2]李利国, 王磊.C语言编程风格之六大章法[J].成才之路, 2007 (20) .

3.C语言总结 篇三

1.C语言程序的基本结构

1.1添加stdio.h的引用

1.2添加一个main函数

1.3main函数的形式应该是

voidmain

{

}

2.C语言程序的编译运行过程

2.1编写源代码(CPU是不能直接执行C语言的)

2.2编译:将C语言的源代码翻译为机器语言的源代码

编译完成的结果一般是个exe文件

2.3运行:在DOS命令行中直接写exe文件的名称,就可以直接运行C语言编写的程序(exe)。

3.数据类型

数据类型的定义:存放数据的容器。

基础的数据类型有:

int:整型,一般的会占4个字节,32位

float:浮点类型(单精度),一般的会占4个字节,32位存储的数据应该是带小数的数据1.213.57.0

char:字符类型,一般的会占1个字节,8位,会存储单个字符。A,B,a,b,.,+,-,(,),’A’,’X’,’ ’’ ’

扩展的数据类型:

long:长整型,存储的数据量要多一点一般的应该是4个字节

short:短整型,一般的应该是2个字节

double:双精度的浮点类型,8个字节。

1.测量数据类型在内存中占多大的空间

使用sizeof运算符来测量

可以接受一个变量,也可以接受一个类型。

2.给变量赋值的时候,某种数据类型的常量

int:1,2,45%d

long:12l%ld

short:12,23%d

float:12.3f%f

double:12.3%lf

char:’A’%c

4.变量

4.1变量的定义:

定义完一个变量,没有初始化,这个时候变量中的值可能是一堆垃圾。如果要使用这种变量的话,那么必须对变量进行初始化过程:其实就是为变量赋值的过程。

变量的数据类型变量的名称;

定义完一个变量,立即对这个变量用初始值给其进行初始化。

变量的数据类型变量的名称=初始值;

定义变量必须在函数一开始。

intx;

x=123;

inty;//放在这个地方时错误的,应该放到和x变量定义一个地方。

4.2变量的使用

对于有累计过程的变量,必须对其进行初始化。

对于累加的变量应该初始化为0

对于累积的变量应该初始化为1

在程序运行的过程中可以对变量进行多次赋值。

变量可以在函数中定义:叫局部变量,只在当前定义的函数中使用,超出这个范围,将不再可用。

变量可以在函数外部定义:叫全局变量,在所有的函数中都可以使用

4.3变量的名称

变量的名称应该有明确的含义。

变量的名称应该采用英文单词的组合。

变量的名称如果采用了多个英文单词,那么第一个单词的首字符要小写,后续的单词的首字母要大写。这种命名方式叫骆驼命名法。

Pascal命名法:每个单词的首字母都必须大写。

Camel命名法:应用在局部变量中。

Pascal命名法:应用在全局变量,函数的名称。

应该类似于:userInput,computerNumber,compareResult

5.标识符:

变量的名称,函数的名称这些都叫标识符。

标识符的规范:

可以使用的字符:字母,数字,下划线。

对于标识符来说,第一个字符不能是数字,可以是字母或下划线。

一个标识符在同一个范围中只能应用在一个变量或一个函数名中。

变量名称的小规范:

i,j,k,m,n可以作为循环变量的名称。

x,y,z可以作为普通的变量使用。

除此之外,尽量不要使用单个字母来做变量的名称。

一般来说,变量的名称应该是一组名词的组合,修饰的词应该在变量名称的最前面。

函数名称:一般应该是动宾结构;动词+名词的形式。

GetUserInput()

GetMonthDays()

EatFood();

DrinkWater();

6.控制结构

总的控制结构有三种。

6.1顺序结构

一句接一句的顺序执行。

写在上面的语言应该先执行。

写在下面的语句应该后执行。

是使用最多的结构,因为顺序结构中没有关键字。

6.2分支结构

ifelseif

主要做范围匹配

if(条件表达式或者逻辑表达式)

因为条件表达式和逻辑表达式的结构都是真或假

对于ifelseif结构来说,一次只能匹配一个范围,只要有一个范围匹配成功,那么其他的分支将不会被执行。

分支结构可以嵌套。

switchcase

主要做单值匹配

switch:需要匹配的变量的名称

case:单个值

default:啥都不写

break:是结束这个switch

switch后面的变量的数据类型应该是整型或字符类型,浮点类型不可以。

case:表明匹配上这个值应该做的工作。

case后面应该有个块。

在case块的最后,应该是break语句,用来跳出switch。

default:所有的case都没匹配上的时候,应该执行的语句块。default块中也应该有break。

当一个case块中没有任何内容的时候,可以不写break,那么这时候,将会匹配下一个case块中的内容。

switchcase结构可以转换为ifelseif结构。

ifelseif不一定可以转换为switchcase结构

6.3循环结构

for循环

for(循环变量的初始化;循环执行的条件;循环变量变化的过程)//不能有分号

{

//循环体

//可能会执行多次

//循环执行的次数和for中的三个语句都有关系。

}

循环:

循环的种类:

1.确定次数的循环。

2.次数不确定,但是由程序来决定循环次数。

3.次数不确定,但是由用户来决定循环次数。

4.死循环。

循环的形式:

1.for(循环变量的初始化;循环执行的条件;循环变量变化的过程)

2.循环变量的初始化;while(循环执行的条件){循环变量变化的过程;}

3.循环变量的初始化;dowhile(循环执行的条件){循环变量变化的过程;}

数组:一组在内存中连续存放的变量的集合。

定义:

1.数组中元素的类型数组的名称[数组的大小];

intary[5];

2.数组中元素的类型数组的名称[数组的大小]={数值1,数值2,.....};

大括号中的数值的个数,不能比数组的大小还多。

intary[4]={1,2,3,4};

intary[4]={1,2,3};

//错误的

intary[4]={1,2,3,4,5};

3.数组中元素的类型数组的名称[]={数值1,数值2,.....};

数组的大小是大括号中元素的个数。

使用:

1.赋值

数组的名称[数组元素的下标]=值;

数组元素的下标从0开始,到数组的`大小-1结束。

2.取值

变量的名称=数组的名称[数组元素的下标];

算法

1.查找(在数组中查找最大数)

首先假设数组中的第一个元素是最大的;

将数组中的其他元素挨个与最大数进行比较。

2.查找(在数组中查找指定的元素)

返回的结果是指定的元素在数组中的位置(下标或索引)

3.排序(冒泡)

核心思想:大数下沉,小数上浮。

需要用到循环嵌套

外层循环的次数是数组的大小-1轮。

里层循环的次数是数组的大小-1-轮索引

在里层循环中要做比较,比较完成后,需要做两个数的交换。

进制的转换

10-10

应用的算法是碾除法。

核心思想是:每次都取一个数的个位,直到原始数变成零,就结束了。

项目:证明6174。

1.拆分

2.排序

3.组最大数,组最小数

4.用最大数-最小数,查看差值是否是6174

5.如果不是,那么将差值重新作为新的可拆分的数,回到1.

函数:

程序执行过程中的特定功能的块。

printf()//stdio.h

main():必须有,且仅有一个。

自定义的函数:

按返回类型分:

1.没返回值的函数

返回类型一律是void

在调用的时候,不需要一个变量来接受函数的返回值。

2.有返回值的函数

返回类型是除void之外的其他的类型。

intSum(intx,i以用一个变量来接受函数的返回值。

按函数的参数来分:

1.有参数的函数

voidSum(intx,inty);

intSum(intx,inty);

在调用的时候,必须传递参数。

2.无参数的函数

4.C语言精华总结 篇四

它的本质是地址的类型。在许多语言中根本就没有这个概念。但是它却正是C灵活,高效,在面向过程的时代所向披靡的原因所在。因为C的内存模型基本上对应了现在von Neumann(冯·诺伊曼)计算机的机器模型,很好的达到了对机器的映射。不过有些人似乎永远也不能理解指针【注1】。

注1:Joel Spolsky就是这样认为的,他认为对指针的理解是一种aptitude,不是通过训练就可以达到的

http:///wiki/APL_programming_language

下面有一段是这样的: APL is renowned for using a set of non-ASCII symbols that are an extension of traditional arithmetic and algebraic notation.These cryptic symbols, some have joked, make it possible to construct an entire air traffic control system in two lines of code.Because of its condensed nature and non-standard characters, APL has sometimes been termed a “write-only language”, and reading an APL program can feel like decoding an alien tongue.Because of the unusual character-set, many programmers used special APL keyboards in the production of APL code.Nowadays there are various ways to write APL code using only ASCII characters.在C++中有函数重载(overload)可以用来区别不同函数参数的调用,但它还是不能表示任意数量的函数参数。

在标准C语言中定义了一个头文件专门用来对付可变参数列表,它包含了一组宏,和一个va_list的typedef声明。一个典型实现如下【注14】: typedef char* va_list;#define va_start(list)list =(char*)&va_alist #define va_end(list)#define va_arg(list, mode)((mode*)(list += sizeof(mode)))[-1] 注14:你可以查看C99标准7.15节获得详细而权威的说明。也可以参考Andrew Konig的《C陷阱与缺陷》的附录A。ANSI C还提供了vprintf函数,它和对应的printf函数行为方式上完全相同,只不过用va_list替换了格式字符串后的参数序列。至于它是如何实现的,你在认真读完《The C Programming Language》后,我相信你一定可以do it yourself!使用这些工具,我们就可以实现自己的可变参数函数,比如实现一个系统化的错误处理函数error。它和printf函数的使用差不多。只不过将stream重新定向到stderr。在这里我借鉴了《C陷阱与缺陷》的附录A的例子。实现如下: #include #include

void error(char* format, …){ va_list ap;va_start(ap, format);

fprintf(stderr, “error: “);vfprintf(stderr, format, ap);va_end(ap);fprintf(stderr, “n”);exit(1);} 你还可以自己实现printf: #include

int printf(char* format, …){ va_list ap;va_start(ap, format);int n = vprintf(format, ap);va_end(ap);return n;} 我还专门找到了VC7.1的头文件看了一下,发现各个宏的具体实现还是有区别的,跟很多预处理(preprocessor)相关。其中va_list就不一定是char*的别名。typedef struct { char *a0;/* pointer to first homed integer argument */ int offset;/* byte offset of next parameter */ } va_list;其它的定义类似。

经常在Windows进行系统编程的人一定知道函数调用有好几种不同的形式,比如__stdcall,__pascal,__cdecl。在Windows下_stdcall,__pascal是一样的,所以我只说一下__stdcall和__cdecl的区别。

(1)__stdcall表示被调用端自身负责函数引数的压栈和出栈。函数参数个数一定的函数都是这种调用形式。

例如:int fun(char c, double d),我们在main函数中使用它,这个函数就只管本身函数体的运行,参数怎么来的,怎么去的,它一概不管。自然有main负责。不过,不同的编译器的实现可能将参数从右向左压栈,也可能从左向右压栈,这个顺序我们是不能加于利用的【注15】。注15:你可以在Herb Sutter的《More Exceptional C++》中的条款20:An Unmanaged Pointer Problem, Part 1:Parameter Evaluation找到相关的细节论述。

(2)__cdecl表示调用端负责被调用端引数的压栈和出栈。参数可变的函数采用的是这种调用形式。

为什么这种函数要采用不同于前面的调用形式呢?那是因为__stdcall调用形式对它没有作用,被调用端根本就无法知道调用端的引数个数,它怎么可能正确工作?所以这种调用方式是必须的,不过由于参数参数可变的函数本身不多,所以用的地方比较少。

对于这两种方式,你可以编制一些简单的程序,然后反汇编,在汇编代码下面你就可以看到实际的区别,很好理解的!重载函数有很多匹配(match)规则调用。参数为“„”的函数是匹配最低的,这一点在Andrei Alexandrescu的惊才绝艳之作《Modern C++ Design》中就有用到,参看Page34-35,2.7“编译期间侦测可转换性和继承性”。

后记:

5.C语言学习总结 篇五

学了一个学期的C语言,我只有一个感觉,那就是一个字:难。不过,我觉得对C语言已经有了一个初步的认识。能够做到利用C语言编织出一些非常简单的程序,和读懂大部分的程序代码,明白程序要表达的意思。

下面是对C语言中我理解的知识的总结:

1、一些基本的函数和基本数据类型的应用。其中,基本数据类型分为整

型、浮点型、字符型、枚举类型。基本函数包括输入输出函数。

2、把运算符的优先顺序排列清楚,要分清楚哪个先运算,哪个后运算。

3、在编程之前要考虑好程序的算法,写出流程图,这样才能更加快速的、有效的编程。

4、要分清楚各个变量的生存期和作用域,不能发生混淆,以致发生错误。

5、数组和指针是C语言的经典之处,可以通用,并且互相转换,具有非

常强大的功能,但是使用不当的话,会造成程序出错,打乱原有程序的规律,使可读性明显变差。

6、结构体也是常用的一种数据类型,它的功能也比较强大,相对于指针

而言,结构体掌握起来比较容易理解和使用。

7、对于文件的操作是非常关键的,把输入的数据保存起来,下次还能够

使用,这才是关键问题。所以对文件操作是否成功,使程序是否编制成功的重要因素。

6.C语言教学初探 篇六

为了改善C语言的教学状况,使学生能真正掌握这门课程的知识,有必要依据学生的层次及所选的专业对《C语言程序设计》的教学做出一定的改革和探索。

1 从基础做起,引导学生接触算法思想

C语言程序不是一门纯理论课程,所以应当注意培养学生分析问题、构造算法、编程和调试程序的能力,这些都是目前学生比较欠缺的。就拿我上课的班级来说,好些学生连题目都不能完全理解,根本抓不住题目的要求,更谈不上让他们去独立编写程序。这样的情况下如果我们只是一味的讲解,是根本不起什么作用的,有时你辛辛苦苦讲解了半天,换个题目,换个问法,学生又不会了。就算有些学生懂了,也是“迷迷糊糊”的。

针对这样的情况,我们切不可一开始就忙着去教授什么理论知识、讲解什么例题,这样只能让学生一头雾水。我们可以通过生活中生动的例子,培养学生的情感能力,让生活和程序设计结合起来,例如在讲解IF选择结构语句时,我们可以先让学生理解生活中一些判断的例子 :1、如果你在家,我去拜访你 ;(需要判断你是否在家)2、如果遇到红灯,要停车等待(需要判断是否为红灯)等等,这些例子都是学生生活中经常遇到的例子,不难理解,学生很快能做出判断。这时候老师可以引入本节课要讲解的语法知识IF(表达式) 语句1 else语句2。其中表达式的判断就类似于生活中需要做出的判断一样。我们在教学过程中引导学生去理解算法,因为算法是程序设计的灵魂,而算法可以结合生活中的例子,这样算法也就不枯燥,加入了算法思想,程序也不会再没有灵魂。在教学过程中,进行知识的迁移,顺带复习讲授用到的语言基础知识,比如什么是表达式,表达式的构成等等。

2 重点放在解题思路上,结合算法思想,解决编程问题

算法是灵魂,不掌握算法是无米之炊,语言是工具,不掌握语言,编程就成为空中楼阁,二者密不可分,作为中职、高职生来讲,我们不可能专门研究算法与逻辑的理论,毕竟学生还达不到这个层次,然而,算法是不是一点不讲,直接过渡到如何解题?通过对中职和高职两个班级的实验对比,发现,没有讲算法的高职班级和讲了算法的中职班级,在解决同一条题目的编程上,有很大的区别,讲解过算法思想的中职班级虽然能力基础不如高职班级,但是编写的程序,结构性,逻辑性要好很多,而没讲解过算法的班级,好多学生连简单的问题都编写不出来,或者编写出来的程序错误百出,无法运行。

由此可见,在教学过程中,介绍典型算法,引导学生思考构造算法是学习C语言的一个关键。当然算法也要从最简单的入手,切忌眼高手低,尤其对于初学C语言的中职,高职学生来说。

3 转变学习方式,采用“探究式”教学方式提高学生学习兴趣

转变学习方式,实际上是改变一种习惯,即由过去的传授式学习变为自主、合作、探究式学习。为了达到这个目的,就要求教师在讲授知识的时候根据教学内容和学生的实际情况采用多种教学方式进行教学,将教师的“主体”性逐渐削弱,向“主导”过渡,创设和谐的学习氛围。

“探究式”教学,是以探究为主的教学方法。具体说它是指教学过程是在教师的启发诱导下,以学生独立自主学习和合作讨论为前提,以现行教材为基本探究内容,以学生周围世界和生活实际为参照对象,为学生提供充分自由表达、质疑、探究、讨论问题的机会,让学生通过个人、小组、集体等多种解难释疑尝试活动,将自己所学知识应用于解决实际问题的一种教学形式。比如在讲解算法时,我采用了“小组探究式”教学。将学生分成若干小组,每一个小组作为一个独立的任务单位,然后给出一系列由浅入深的题目,让每一小组采取讨论的方式从最简单题目入手用N-S结构流程图将算法表示出来。通过这种方式,学生在两个小时的学习中很快掌握了算法的表示,学习效率得到了很大的提高。通过这种方式,学生在学习过程中不但体验到获得知识的乐趣,而且使学生在学习过程中加强了集体参与的能力及与他人沟通合作的能力。

4 注重上机实践,增强学生的动手能力

C语言程序设计本身是一门实践性很强的课程,上机实践也是整个教学的重要组成部分,因此必须抓好实验教学环节。对于中职学生来讲,他们大多还是比较喜欢动手操作的,但由于动手过程中不得要领,动手前没有很好的准备,导致上机实践的效果并不是很好,久而久之,上机实践课变成学生抄程序调试课。许多学生只是把书上的或者老师讲解的例题调试一下就完事了,根本没有动脑筋去自己编写。更不要说自己去解决问题了。

针对这一情况,首先教师在上机实验开始前要让学生对实验作充分的准备,预习实验内容,明白实验原理和实验目的。实验前应该将实验所涉及的知识点的重点和难点告知学生。在实验过程中针对不同的学生有侧重点的加以指导,在指导的过程中要注意锻炼学生独立思考问题的能力,启发学生的想象力。实验完毕后,每个学生都应对实验用到的知识点进行回顾,总结实验过程中遇到的问题和问题的解决方法。

5合理安排考试考核,注重学生知识的全方位掌握

C语言课程的考核应分为理论考试和上机考试,重点考核学生的程序阅读能力和编写能力。闭卷考试主要考查学生的基本知识、阅读程序和编程能力。

上机考试主要让学生在规定的时间内完成给定的上机题目,重点测试考生调试程序、程序改错、编写程序等综合能力,偏重实际应用性强的题型,重在考核典型算法的应用。平时成绩也要在总成绩中占一定的比例,这样有利于学生对平时作业的重视。

6结束语

上一篇:小学语文作文教学标准下一篇:偶尔做作又何妨的散文