篇一:C语言基础知识实例讲解
C语言基础知识:实例讲解
这篇文章旨在让各位对 C 有个总体的认识,有看不懂的地方请不必太在意,只要记住就可以了,继续往下学下去就会明白的。
首先请看下面这个简单的 C 程序,猜猜它会做些什么。猜不出来也没关系,后面会有详细的解说。
#include <stdio.h>
int main( void )/* 一个简单的程序 */
{
intnum;/* 声明一个名叫num的变量 */
num = 1;/* 将 1 赋值给num*/
printf( "This is a simple C program. " ); /* 调用printf函数 */
printf( "My favorite number is %d because it is first. ", num );
return 0;
}
在对这个程序进行详细说明之前,我想先请您用编译器把它编译成可执行文件,并且运行,看看运行结果和您的猜想是否一致。如果不懂如何进行编译,请参考以下文章:
下面,我将分两步对这个程序进行详细的讲解。第一步是概要说明,也就是对程序中每一行代码的含义作简单讲解,以帮助您对这个程序有一个大致的理解。第二步是详细说明,也就是程序中的每一行代码进行详细的讲解,以加深您的理解。
一、概要说明
#include <stdio.h><-把另外一个文件包含进来
这行代码命令编译器把头文件(.h 文件)stdio.h中的内容包含到我们的
程序中。stdio.h是C语言的标准头文件之一,提供对键盘输入和显示输出等的
支持。要使用printf函数,就应该包含这个头文件。顺带一提,stdio代表
standard input/output,也就是标准输入输出的意思。
int main(void) <-函数头
C 程序由一个或多个函数组成。我们的这个程序只有一个函数:main 函数。 圆括号 () 表明 main 是一个函数;int表明 main 函数返回一个整数;void 表明 main 函数不接受任何参数。在此,请您紧记,int main(void) 是 ISO/ANSI C
标准中定义的 main 函数定义方法之一。
/* a simple program */ <-注释
/* 和 */ 用于对程序进行注释说明,帮助读者更快更好地理解程序。编译器 会忽略 /* 和 */ 之间的内容(包括 /* 和 */),不会对它们进行编译。
{ <-函数体的开端
这个开大括弧 { 标志着函数体开始。函数体以闭大括弧 } 结束。在 { 和 }
之间的语句都属于这个函数。
intnum; <-声明变量num
这个语句表明我们声明了一个名叫num的变量。int表明这个变量为
整型变量。
num = 1; <-赋值语句
这个语句将 1 赋值给变量num。执行这个语句后,num的值等于 1 。
printf( "This is a simple C program. " ); <-函数调用语句
printf函数是 C 语言标准函数库里的函数。这个语句调用printf函数在
屏幕上显示“This is a simple C program.”,并且换行。是换行符,它提示
printf开始新的一行,也就是将光标移动到下一行的开端。如果上面的语句中没有 ,那就不会换行,而且光标会紧跟在“This is a simple program.”后面。
printf( "My favorite number is %d because it is first. ", num );
%d 告诉printf用num的值替换掉 %d ,并且以整数形式显示num的值。 因为num的值为 1 ,所以这个语句在屏幕上显示“My favorite number is 1
because it is first.”,并且换行。
return 0; <-返回语句
C 程序应该返回一个数值给它的调用者。0 代表程序无误退出;而其它数字的含义
则由系统决定。通常,非零(如 -1)代表程序运行中遇到某种错误而退出。
} <-函数体结束
函数体以闭大括弧 } 结束。
二、详细说明
现在,让我们进一步来了解每一行代码的含义。下面的内容很基础,也很重要, 必须认真弄懂,牢牢掌握。
1. #include 预处理指令和头文件
在编译器对我们写的源程序进行编译之前,预处理器会对我们的写的源代码
进行必要的处理,称为预处理。#include 就是一个预处理指令,它命令预处理器 进行的预处理是:把特定的头文件包含到我们的源代码里。
#include <stdio.h>的作用是将头文件stdio.h里的内容包含进我们的程序, 产生的结果是将stdio.h里的内容一字不漏地插入 #include <stdio.h>出现的
地方,并且删除 #include <stdio.h>。换句话说,就是用stdio.h里的内容替换
#include <stdio.h>。这个过程是在预处理阶段完成的。C 语言的这种包含文件的 机制为多个程序共享相同信息提供了极大的方便。
stdio.h是 C 语言标准中定义了的头文件,它包含着输入输出函数的信息。
所有 C 编译器都应该有这个头文件,这是 ANSI/ISO C 标准中规定的。当然,
ANSI/ISO C 规定的编译器必须提供的头文件可不止这么一个。标准还规定了许多 别的头文件,那些我们会在以后慢慢学到。
有些程序需要包含stdio.h,而有些不需要。如果上面这个例子中没有使用
printf函数,那就不需要包含stdio.h。
头文件中包含着编译器进行编译时所需的信息。头文件中可能指明了函数名和
函数调用方法,但是这些函数的实现代码并不在头文件中,而是在预先编译好了的 库文件里。
链接器负责在库文件中寻找我们的程序所需的代码,并且把那些代码和我们写的 程序进行链接,从而将我的写的程序链接成可执行文件。一句话,头文件用于指导 编译器正确地将我们写的源程序编译成可执行文件。
2. main 函数
在 C 语言中,main 函数是主函数。每个 C 程序都必须有且只能有一个
main 函数(主函数)!C 程序从 main 函数开始执行,并且在 main 函数中结束。 int是 main 函数的返回值类型,它表明 main 函数应该返回一个整数给程序的
调用者(如操作系统)。
如果您想了解更多关于 main 函数的东西,请点击下面的链接:
C/C++ 误区一:void main
3. 注释
/* a simple program */
/* */ 之间的内容都是注释。对程序进行适当的注释可以帮助读者(包括您自己)
更快更好地理解您写的代码。注释可以在源程序中的任何地方书写。/* 和 */ 之间的 任何内容(包括 /* 和 */)都会被编译器忽略掉。注意:/ 和 * 必须紧挨在一起, 它们之间不能有空格。
/* 我是注释 *//*我是
跨行注释*/
/*
我也是注释
*/
以上的注释都是合法的;但下面的注释是非法的,因为没写注释结束标记 */。
/* 非法,没有注释结束标记
下面这个注释可能会出乎你的意料:
/* 我是注释开始标记
/* 哦哦,我不是注释开始标记
我是注释结束标记,我和第一个 /* 匹配,而不是和第二个 /* 匹配。*/
上面这个注释中,注释结束标记 */ 和第一个 /* 匹配,它们之间的内容
都被视为注释。
C99 中增加了另外一种注释方式,这种注释方式使用 // 作为注释符,和 // 处于同一行,并且在 // 右边的内容都被当作注释。/ 和 / 之间不能有空格。
// 我是注释
intrigue;//注释放在这里也是合法的
上面的注释在 C99 中是合法的,但是在 C89 中是非法的。也就是说,老旧的
编译器可能不支持 // 注释符。VC6 支持 //,TC2 不支持。
4. 大括号与函数体
C 语言中,所有函数都以大括弧({ })作为界定符。函数体从开大括弧 { 开始,以闭大括弧 } 结束。在后续教程中,我会对函数进行更详细的讲解。
5. intnum;
这个语句声明了变量num。这一行末尾的分号(;)表明这一行
是一个语句。; 是语句的一部分,单独一个 ; 也是一个合法的 C 语句。
int是 C 语言中的一个关键字,它代表 C 语言里的一种基本数据类型:整型。
关键字是语言的保留字,不能用作其它用途。例如:我们不能关键字来做变量名或者 函数名。
标识符是指我们为变量或函数等取的名字。在这个语句中,num就是标识符。
C 语言中,所有变量在使用前都必须声明。C89 中,变量的声明必须位于 函数体或者程序块的开端。例如:
int main( void ) /* C89 */
{ /* 函数体开始 */
int doors;
int dogs;
doors = 5;
dogs = 3;
{ /* 程序块开始 */
int dig;
int dug;
dig = 6;
dug = 8;
} /* 程序块结束 */
return 0;
} /* 函数体结束 */
而在 C99 中,声明可以位于函数体或者程序块的任何地方。但是,变量仍然 需要在声明之后才可使用。例如:
int main( void ) /* C99 */
{ /* 函数体开始 */
int doors;
doors = 5;
{ /* 程序块开始 */
int dig;
dig = 6;
int dug;
dug = 8;
} /* 程序块结束 */
int dogs;
dogs = 3;
return 0;
} /* 函数体结束 */
上面的程序在 C99 中是合法的,但是在 C89 中却是非法的。当前支持C99 的 编译器不多,所以上面的代码您的编译器很有可能编译不了。故而,为了使我们的 代码具有良好的可移植性,我们应该尽可能少用,甚至不用 C99 中的新特性。
6. 赋值
num = 1;
赋值是 C 语言中的一种基本操作。上面的语句是一个赋值语句,它的含义 是:将 1 赋值给变量num。赋值操作完成后,num的值等于 1 。
7. printf函数
printf( "This is a simple C program. " );
printf( "My favorite number is %d because it is first. ", num );
这两行代码都调用了printf函数。printf是一个标准 C 函数,也就是说,
它是 C 语言标准函数库里定义了的函数。圆括号 () 表明printf是一个函数,
篇二:C语言程序设计基础教程
C语言程序设计
谢利东
目录
绪论 .................................................................................................................................................. 2
第01讲 C语言概述 ..................................................................................................................... 2
第02讲 基本数据类型 ................................................................................................................... 3
第03讲 运算符 ............................................................................................................................. 6
第04讲 流程控制 ....................................................................................................................... 10
第05讲 数组 ............................................................................................................................... 18
第06讲 函数 ................................................................................................................................. 21
第07讲 算法设计范例 ................................................................................................................. 24
第08讲 自我检测(含答案) ..................................................................................................... 28
绪论
一、 课程简介
课程内容:C语言程序设计基础知识
适用对象:程序设计初学者
二、 课程目标
1、 了解程序设计的相关知识
2、 掌握C编程
3、 理解程序设计语言的基本构成要素
4、 掌握算法设计
第01讲 C语言概述
一、 程序设计语言的发展
1、 机器语言:是唯一能被计算机直接解释和执行的语言
2、 汇编语言:与机器语言相似,但加入了助记符 Add a,b a+b
3、 面向过程的语言:自助游,需理解细节;Basic、C
4、 面向对象的语言:找旅行社,无需理解细节;C++、Java、C#
二、 C语言简介
三、 编写实例:Hello
main()
{
printf( “Hello,C! ”);
}
四、 在Turboc中编写运行C程序的步骤
1、 启动TC
2、 执行Alt+F,进入File菜单,执行New,新建源文件
3、 输入代码并保存 ——编辑
执行Alt+F,进入File菜单,执行Save,保存源文件
4、 执行Alt+C,进入Compile菜单,执行“Compile to OBJ”
若代码有错,需纠错 ——编译
5、 执行Alt+C,进入Compile菜单,执行“Make EXE File” Ctrl+F9 若代码有错,需纠错 ——连接
6、 执行Alt+R,进入Run菜单,执行“Run”——执行
7、 执行Alt+F5,查看运行结果,查看完后按下Enter,返回编辑环境 说明:
(1) 编写C程序的步骤:P4
(2) 实际运行中,可通过快捷键简化一些操作
五、 C程序的基本构成
第02讲 基本数据类型
一、 数据类型简介
1、 什么是数据类型?
对数据的“抽象”12、13、45、1.2、1.56、0.4e6、RuiLi、DaLi
2、 为什么要有数据类型
20040102 可以代表学号,属于字符
可以代表整数,属于数值
可以代表日期,属于日期时间
3、 C语言中有哪些数据类型?
P16
4、 基本数据类型
数值型、字符型、枚举型
二、 变量和常量
1、 变量:程序运行期间,值可能改变的量(Variation)
2、 常量:程序运行期间,值不会改变的量(Const)
例如:计算机出10道加法练习题
形式:7+5=?、8+9=?
第1个加数 加号 第2个加数 等号
op1+op2=result
第1次:op1=6,op2=7:6+7
第2次:op1=5,op2=8:5+8
??
控制题目数量:OPNUM=10
3、 常量类型
符号常量:通过#define 定义的常量
字面常量(直接常量):与变量相似,字面常理有整型、实型、字符型
3.14、3、RuiLi
三、 整型类型
1、 整型常量
形如3、4、67、890、5632的数据,可以赋给整型变量
2、 整型变量
(1) 短整型(short)
声明: short a ;
声明一个变量的格式:“ 数据类型 变量名 ;”
范围:占16位,范围为-32768—32767
(2) 整型(int)
声明:int a;
范围:占16位,范围为-32768—32767
(3) 长整型(long)
声明:long a;
范围:占32位,范围为-2147483648——2147483647
3、 实例练习1 Main函数 { 声明3个整型变量,a、b、sum 让a的值等于312 a=312;
让b的值等于789 b=789;
计算a加b的结果 printf(“ The sum of a add b is : %d \n”,sum); 将结果显示到屏幕上 }
4、 实例练习2——对上例的改进
main()
{
int a,b,sum; -----------------声明整型变量a,b,sum
printf (“ Please input two integers(a and b):\n”); ----------------提示输入两个整数 scanf(“%d,%d”,&a,&b); ---------要求输入两个整数,分别给a、b,两数间用逗号隔开,例如3,5 sum=a+b; -------------计算a、b之和
printf(“Sum=%d\n”,sum); -----------将结果输出到屏幕上
}
四、 实型类型
1、实型常量
形如1.2、0.5、0.0023、1.0、2.0的数据,可以赋给实型变量
2、实型变量
(1) 单精度(float)
声明:float a;
范围:占32位, -3.4*10-38— 3.4*1038 ,6位精度
(2) 双精度(double)
声明:double a;
范围:占64位,-1.7*10-308—1.7*10308 ,16位精度
3、实型常量的表示
十进制小数:如 .123、123.、0.123、123.0、0.0
指数形式(规范化):1.23e6或1.23E6——1.23*106
0.123e7或0.123E7 非规范化
12.3e5或12.3E5非规范化
4、 实例练习——输入3个数(整数或小数均可),求平均
分析:输入的3个数可以是整数,也可是小数,故只能声明为实型整数:1.0
代码:
main()
{
float x1,x2,x3,average; -------------------声明4个实型变量,分别输入的3个数和平均值printf(“Please input three float data:\n”); -----------提示输入3个实型数据scanf (“ %f , %f , %f”,&x1,&x2,&x3); ------输入3个实型数据,分别给x1、x2、x3,逗号隔开average=(x1+x2+x3)/3;-------求平均值
printf(“Average=%f\n”,average); --------输出结果
}
五、 字符型
1、字符常量
表示:?x?(用单引号,不能是双引号;只能有一个字符)
例如:?a?、?b?表示字符常量a和b
转义字符:系统定义,有特殊含义的字符
\n——换行;\b——退格,前移一列
\t——下跳一制表位,后移8列
2、字符串常量
表示:”a dog” (用双引号,不能用单引号;可以放多个字符) 例如:”a dog” 表示字符串a dog,由5个字符组成
3、字符变量
声明:char c;
注意:一个字符变量只能存放一个字符常量,即
c=?a? ,正确;
c=”a dog”,错误
4、实例1——字符常量及转义字符的使用
main()
{
printf(“\n\n”); --------------将当前屏幕换行2次,以方便查看结果 printf(“no break:a dog”); ------------不加\n的效果
printf(“\n”); ------------换行,以便比较结果
printf(“ a break:a \n dog”); ------加\n的效果
printf(“\n”); ------------换行,以便比较结果
printf(“no reback:a dog ”); -------不加\b的效果
printf(“\n”); ------------换行,以便比较结果
printf(“a reback:a\bdog ”); -------加\b的效果
printf(“\n”); ------------换行,以便比较结果
printf(“a tab:a \t dog”)-----------------加\t 的效果
}
5、 实例2——字符变量的使用
main()
{
篇三:C语言基础知识重点和难点
C语言基础知识重点和难点
一、数组
1. 一维数组的定义与初始化
1) 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。 例如:
#define FD 5
main()
{
int a[3+2],b[7+FD];
……
}
是合法的。
但是下述说明方式是错误的。
main()
{
int n=5;
int a[n];
……
}
2) C语言对数组的初始化赋值还有以下几点规定:
(1) 可以只给部分元素赋初值。
当{ }中值的个数少于元素个数时,只 给前面部分元素赋值。
例如:
int a[10]={0,1,2,3,4};
表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。
(2) 只能给元素逐个赋值,不能给数组整体赋值。
例如给十个元素全部赋1值,只能写为:
int a[10]={1,1,1,1,1,1,1,1,1,1};
而不能写为:
int a[10]=1;
(3) 如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。 例如:
int a[5]={1,2,3,4,5};
可写为:
int a[]={1,2,3,4,5};
2. 一维数组元素的引用
1) 在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。 例如,输出有10个元素的数组必须使用循环语句逐个输出各下标变量: for(i=0; i<10; i++)
printf("%d",a[i]);
而不能用一个语句输出整个数组。
下面的写法是错误的:
printf("%d",a);
2) 引用数组元素时一定注意下标不能越界
例如,int i=4, n[]={0,0,0,0,0};,
则可以引用n[0],n[4],n[!5],n[i++],但不能引用n[5], n[++i]
例1:若有定义语句:int m[ ]={5,4,3,2,1},i=4; ,则下面对m数组元素的引用中错误的是___C___。
A、m[--i] B、m[2*2] C、m[m[0]] D、m[m[i]]
3. 一维数组的典型算法
1)
2)
3)
4)
5)
6) 查找指定的元素,返回其下标。比如,要求查找数值5是否数组中 查找数组的最大(最小)值,并返回最大(最小)值及其对应的下标 数组的排序(升序或降序),包括冒泡排序和选择排序两种算法 在有序数组中插入一个元素,使得数组仍然有序 数组的逆序 在数组中删除满足某条件的元素
4. 二维数组的初始化
二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。
例如对数组a[5][3]:
1)按行分段赋值可写为:
int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} };
2) 按行连续赋值可写为:
int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};
对于二维数组初始化赋值还有以下说明:
1) 可以只对部分元素赋初值,未赋初值的元素自动取0值。
例如:
int a[3][3]={{1},{2},{3}};
是对每一行的第一列元素赋值,未赋值的元素取0值。 赋值后各元素的值为:1 0 0
2 0 0
3 0 0
int a [3][3]={{0,1},{0,0,2},{3}};
赋值后的元素值为:
0 1 0
0 0 2
3 0 0
2) 如对全部元素赋初值,则第一维的长度可以不给出。
例如:
int a[3][3]={1,2,3,4,5,6,7,8,9};
可以写为:
int a[][3]={1,2,3,4,5,6,7,8,9};
例1:以下不能正确定义二维数组的选项是___D___。
A、
B、int a[][2]={1,2,3,4}; C、int a[2][2]={{1},2,3}
D、
5. 二维数组元素的引用
和一维数组一样,一定要注意下标不越界。
例1:若有定义
int a[2][3];
以下选项中对a数组元素正确引用的是A)a[2][!1] B)a[2][3]
C)a[0][3] D)a[1>2][!1]
6. 字符数组的初始化
1) 字符数组也允许在定义时作初始化赋值。
例如:
char c[10]={‘c’, ‘ ’, ‘p’, ‘r’, ‘o’, ‘g’, ‘r’, ‘a’,’m’};
赋值后各元素的值为:
数组C c[0]的值为‘c’
c[1]的值为‘ ’
c[2]的值为‘p’
c[3]的值为‘r’
c[4]的值为‘0’
c[5]的值为‘g’
c[6]的值为‘r’
c[7]的值为‘a’
c[8]的值为‘m’
其中c[9]未赋值,由的值为‘p’系统自动赋予0值。
当对全体元素赋初值时也可以省去长度说明。
例如:
char c[]={`c`,` `,`p`,`r`,`o`,`g`,`r`,`a`,`m`};
这时C数组的长度自动定为9。
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。
2) C语言允许用字符串的方式对数组作初始化赋值。
例如:
char c[]={'c', ' ','p','r','o','g','r','a','m'};
可写为:
char c[]={"C program"};
或去掉{}写为:
char c[]="C program";
用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。上面的数组c
‘\0'是由C般无须指定数组的长度, 而由系统自行处理。
7. 字符串处理函数
用于输入输出的字符串函数,在使用前应包含头文件"stdio.h",使用其它字符串函数则应包含头文件"string.h"。
1) 输出函数 puts
2) 输入函数gets:gets读入字符串时,可以读入其中的空格,直到回车。而用scanf读入字
符串时,遇到空格即停止。
3) 连接函数strcat:格式为strcat (字符数组名1,字符数组名2),一定注意,字符数组1
一定要足够大,否则将越界。
4) 拷贝函数strcpy:格式为strcpy (字符数组名1,字符数组名2)。注意,字符数组赋
值,不能用等于号,而要用strcpy函数
5) 比较函数strcmp:格式为strcmp(字符数组名1,字符数组名2)。注意,字符数组的比
较不能用大于、小于号比较。
测字符串长度函数strlen:测字符串的实际长度(不含字符串结束标志‘\0’) 并作为函数返回值。
二、函数
1. 形式参数和实际参数
1) 函数的形参和实参具有以下特点: 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
2) 3) 4)
下例可以说明这个问题。
int s(int n)
{
int i;
for(i=n-1;i>=1;i--)
n=n+i;
printf("n=%d\n",n);
}
main()
{
int n;
printf("input number\n");
scanf("%d",&n);
s(n);
printf("n=%d\n",n);
}
2. 数组作为函数参数
1) 数组元素作函数实参
数组元素就是下标变量,它与普通变量并无区别。 因此它作为函数实参使用与普通变