C语言程序设计(基础篇)
本文并非教程,仅用于个人复习
文章目录
C语言程序设计(基础篇)1. 基本信息2.算法简单算法举例 3. 数据类型,运算符与表达式3.1 C语言中的数据类型3.2 常量与变量**常量** 4. 顺序程序设计4.1 赋值语据4.2格式输入输出4.2.1 printf 输出4.2.2 scanf 函数 输入 5.分支结构1.if..else..2. switch 6.循环结构1.while语句2 do-while语句3 for语句 7 数组1.一维数组c2.二维数组3.字符数组 8.函数函数定义的一般形式函数的递归调用数组作为函数参数用static声明局部变量register变量用extern声明外部变量 9. 预处理命令宏定义无参宏定义带参宏定义1. 基本信息
1.1 C语言完全面向过程,只包含三种结构顺序结构,选择结构,循环结构
1.2 C语言区分大小写
1.3 基本例子:
#include<math.h> //#include 文件包含命令(预处理),.h头文件 该文件包含sin()函数#include<stdio.h>//包含scanf()和printf()函数。可省去main() //主函数{double x,s; //定义两个double型变量,记得写;printf("input number:\n"); //输出字符串scanf(%1f,%x); //从控制台获得值赋给xs =sin(x); //调用math.h提供的sin()函数printf("sine of %1f is %1f\n",x,s); //输出结果}
2.算法
简单算法举例
例1 求1x2x3x4x5
例2 有50个学生,要求将他们的中成绩在80分以上者打印出来
例3 判定2000 - 2500年中的每一年是否是闰年,将结果输出
闰年条件:1)能被4整除,但不能被100整除
2)能被100整除,且能被400整除
例4 求1-1/2+1/3-1/4+…+1/99+1/100
例5 对一个大于或等于3的整数,判断它是否是一个素数。
3. 数据类型,运算符与表达式
3.1 C语言中的数据类型
数据类型:基本数据类型,构造数据类型,指针类型,空类型四大类
基本数据类型:其值不可以再被分解为其他类型。
构造数据类型:根据已经定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造数据类型可以分解成若干个“成员”或“元素”的值。每个成员都可以是一个基本数据类型或构造数据类型。
举例:
数组类型
结构体类型
共用体类型
指针类型:其值用来表示某个变量在内存储器的地址。
空类型:调用函数后不需要向调用者返回函数值,这类函数可以定义为“空类型”。其类型说明符为void
3.2 常量与变量
常量
定义:在程序执行过程中,其值不发生改变的量称为常量
使用方法: #define 标识符 常量
#define PRICE 30 //不需要分号,一般全部大写,#define也是预处理命令main(){int num,total;num = 10;total = num*PRICE;printf("total = %d",total);}
变量
整型:short, int(-32768~+32768) ,long, unsigned
浮点型:float,double,long double
字符变量:char (单引号’‘) 由于字符值十一ASCII码的形式存放在变量的内存单元之中,C语言允许对整型变量赋予字符值,也允许对字符变量赋予整形变量。
字符串常量:C语言中没有字符串变量,但可以用一个字符数组来存放一个字符串常量。
4. 顺序程序设计
4.1 赋值语据
在变量说明中,不允许给多个变量赋初值
int a=b=c=5 ; //错误int a=5,b=5,c=5; //正确
但是赋值语句允许连续赋值
int a,b,c;a= b =c =5 //允许
4.2格式输入输出
4.2.1 printf 输出
一般形式:[][][标志] [输出最小宽度] [.精度] [长度] 类型
标志:- 左对齐,右边填空格,+输出符号,空格 输出值为正时冠以空格,为负时冠以负号,#对o类,在输出时加前缀o,对x类输出时加前缀0x。
输出最小宽度:用十进制正是来表示输出的最少位数。若实际位数多以定义的宽度,则按是几位数输出,若实际位数少于定义的宽度则补已空格或0
精度:精度格式符以’ .‘开头,后跟十进制证书。本项的意义是如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
长度:长度格式符为h,l两种,h表示按照短整型输出,l表示按照长整型输出。
4.2.2 scanf 函数 输入
一般形式: scanf(“格式控制字符按”,地址表列)
main(){int a,b,c;printf("input a,b,c\n");scanf("%d%d%d",&a,&b,&c);printf("a=%d,b=%d,c=%d",a,b,c);}
格式字符串:%[*] [输入数据宽度] [长度]类型
*****符号:用以表示该输入项读入后不赋予相应的变量,即跳过该输入值
如:
scanf("%d %*d %d",&a,&b);//当输入为1 2 3 时,把1赋给a,2被跳过,3赋予b
宽度:用十进制整数指定的输入的宽度(即字符数)
如:
scanf("%5d",&a);//当输入12345678时只把12345赋给变量a,其余部分被截去。
长度:长度格式符号为l和h,l表示输入的长整型数据和双精度浮点数据。h表示输入短整数据。
scanf函数注意事项:
scanf没有精度控制,如scanf(”%5.2f“,&a)非法。scanf要给出变量地址,如scanf(“%d”,a)非法
5.分支结构
1.if…else…
main(){int a=1;int b=2;if (a>b){printf("cool");}else{printf("not cool");}}
2. switch
main(){int a;scanf("%d",&a);switch (a){case 1:printf("1");break;case 2:printf("2");break;default:printf("error");break;}}
6.循环结构
1.while语句
用while语句求1-100所有数字的和
main(){int a;int sum;a = 1;sum = 0;while(a<=100){sum = sum+a;a++;}printf("sum=%d",sum);}
2 do-while语句
用do-while语句求1-100所有数字的和
main(){int a,sum;a= 1;sum =0;do{sum = sum+a;a++;}while(a<=100)printf("%d\n",sum);}
3 for语句
for(int i=0;i<100;i++){}
7 数组
1.一维数组c
定义方式:类型说明符 数组名[常量表达式] (定义时方括号中的常量表达式不能用变量)
初始化:
int a[3] ={1,2,3};int b[] ={1,2,3,4}//如果给出全部元素,可以不给出数组元素的个数
2.二维数组
定义方式:类型说明符 数组名[常量表达式1] [常量表达式] ;
二维数组在概念上是二维的,但在实际的硬件存储器中却是连续编址的。
初始化:
int a[2][3] = {{1,2,3},{4,5,6}};//分段初始化int a[2][3] = {1,2,3,4,5,6};//连续赋值int a[3][3]={{1},{2},{3}};//未赋值部分自动取0int a[][3]={1,2,3,4,5,6,7,8,9}; //如果对全部元素赋初值,则一维的长度可以不给出
3.字符数组
定义方式: char c[5] [10] ;
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以’\0’作为串的结束符,因此当把一个字符串存入一个数组时,也罢结束符‘\0’存入数组。
char c[] = "C program";//用字符串赋值比逐个符值要多占一个字节用于存放'\0'
字符数组的输入输出
main() //输出{char c[]="BASIC\nBASE";printf("%s",c);//%s表示输出的是一个字符串,输出列表给出数组名则可,不能写成c[]}
main()//输入{char st[15];printf("input string\n");scanf("%s",st); //输入长度必须小于15,以留出一个字节存放'\0'printf("%s\n",st);//字符串中不能含有空格,否则会将空格视为结束标志}
在C语言中数组的数组名就代表了该数组的首地址,因此scanf("%s",st) 中st不需要加&取地址符号
8.函数
函数定义的一般形式
void hello() //无参函数定义{printf("hello,world \n");}int max(int a,int b) //有参函数定义{if(a>b) return a ;eles return b;}//被调函数出现在主调函数之前也可不在主调函数中声明main() //主函数调用{int max(int a,int b); //函数声明,如果为返回值为整型函数可以不用生命int x,y,z;printf("input two numbers:\n");scanf("%d%d,&x,&y");z = max(x,y);printf("maxnum = %d,z")}
可以在主函数外对函数进行声明,这样就不要在调用时再在主调函数中额外声声明
函数的递归调用
一个函数在它的函数体内调用它自身称为递归调用。
数组作为函数参数
数组可以作为函数的参数使用,进行数据缠讼。
数组用作函数参数有两种形式,一种是把数组元素(下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。
当数组名作为参数时所进行的传送只是地址的传送,因此形参数组获取该首地址后,也就有了实在的数组。实际上形参数组和实参数组为同一数组,共同拥有一段内存空间。
//数组a中存放了一个学生5门课程的成绩,求平均成绩float aver(float a[5])//可以不显式给出数组a的长度,而用a[]{float s=a[0];for(int i=0;i<5;i++){s = s+a[i];}s =s/5;return s;}main(){float averGrade,a[5];printf("please enter the grades");for(int i =0;i<5;i++){scanf("%f",&a[i]);}averGrade = aver(a);printf("average grade is :%5.2f",averGrade);}
多维数组也可以作为函数的参数。在函数定义时对形参数组可以指定每一维的长度,也可省去第一维的长度。
用static声明局部变量
有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该制定局部变量为“静态局部变量”,用关键字static进行声明。
静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在整个程序运行期间都不释放。而自动变量(auto)属于动态存储类别,占动态存储空间,函数调用结束后即释放。
register变量
为了提高效率,c语言允许将局部变量的值放在CPU寄存器中,这种变量叫“寄存器变量”,用关键词register作声明。
说明:
只有局部变量和形式参数可以作为寄存器标量一个计算机系统的寄存器数目有限,不能定义任意多个寄存器变量局部静态变量不能定义为寄存器变量
用extern声明外部变量
外部变量(即全局变量)实在函数的外部定义的,它的作用域从变量定义处开始i,到程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前函数想引用该外部变量,就应该用关键字extern对该变量作“外部变量声明”
int max(int x,int y){int z;z = x>y?x:y;}main(){extern A,B;//使用处用extern关键字进行声明printf("%d\n",max(A,B));}int A =13,b=-8; //定义处
9. 预处理命令
宏定义
在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这成为“宏代换”或“宏展开”
在c语言中,“宏”分为有参数和无参数两种。下面分别讨论这两种“宏”的定义和调用。
无参宏定义
定义:
#define 标识符 字符串
字符串可是常数,表达式,格式串等。
#define M (y*y+3*y)//编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)替换M
宏定义不是说明或语句,在行末不必加分号,如加上分行则连分号也一起置换宏定义必须写在函数外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef符号宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换
带参宏定义
定义:
#define 宏名(形参表)字符串
#define M(y) y*y+3*y //宏定义K = M(5); ///宏使用
带参宏定义宏名和括号不能分开