C语言 1.初识C语言
什么是C语言
C语言是一门计算机语言
1,编写 2,编译 3,连接,4,.exe
什么是程序–编译调试 1.程序的作用是什么?
程序的作用是完成某种计算
2.新建代码及编译运行
#include <stdio.h> int main () { printf ("Hello, World!\n" ); return 0 ; }
每个C语句以分号结束
3.程序的编译过程及项目位置
4.断点及调试窗口设置
小虫子调试
观察值的值是否符合预期
1数据类型 基本类型:整型int , 浮点型float,字符型char,
构造类型:数组[],结构体struct
指针类型*
空类型void
关键字 不做要求
2常量 在程序运行过程中,其值不发生变化。
可分为整型 ,浮点型 ,字符型 (用单引号引起来,有且只有一个字符),字符串型 。
3变量 可以改变的值,在程序执行过程中。
标识符只能由字母,数字和下划线组成,并且第一个字符必须为字母或者下划线。
先定义后使用 ,变量名不能与关键字同名。
4整型数据 4.1符号常量 定义一个整型变量时要使用关键字int
变量i是4个字节
#include <stdio.h> #define PI 3+2 int main () { int i=PI*2 ; printf ("i=%d\n" ,i); return 0 ; }
最终输出结果是7,原因是符号常量PI是直接替换 的效果,3+2*2=7.
5浮点型数据 5.1浮点型常量
5.2浮点型变量 #include <stdio.h> int main () { float f=3e-3 ; printf ("f=%f\n" ,f); return 0 ; }
6字符型数据 6.1字符型常量
ASCII码表
7字符串型常量 用双引号引起来的。
多一个字节\0
混合运算 1强制类型转换 int main () { int i=5 ; float f=i/2 ; float k=(float )i/2 ; printf ("%f\n" ,f); printf ("%f\n" ,k); return 0 ; }
2printf函数介绍 输出各种类型的数据,标准输出函数。
printf几个%f对应几个数
%c,%d,%f,%s
%d,赋值是整数就行
%3d,占三个字符
%5.2f,小数点后表示两位
%-3d,左对齐,默认右对齐不加负号
整型进制转换 整型常量的不同进制表示
二进制,十进制,八进制,十六进制转换
1个字节byte,是8位,bit
int main () { int i=123 ; printf ("%d\n" ,i); printf ("%o\n" ,i); printf ("%x\n" ,i); return 0 ; }
scanf读取标准输入 常用的数据输入/输出函数
scanf函数原理 C语言通过scanf函数读取键盘输入
#include <stdio.h> int main () { int i; char c; float f; scanf ("%d" ,&i); printf ("i=%d\n" ,i); fflush(stdin ); scanf ("%c" ,&c); printf ("c=%c\n" ,c); scanf ("%f" ,&f); printf ("f=%f\n" ,f); return 0 ; }
scanf在读整型数,浮点数,字符串会忽略\n回车符,空格符等字符(忽略是指scanf函数执行时会首先删除这些字符,然后再阻塞。)
为什么会阻塞,缓冲区是空的,等你输入数
scanf一次读多种数据类型 %c前面加一个空格就行,
#include <stdio.h> int main () { int i,ret; float f; char c; ret=scanf ("%d %c%f" ,&i,&c,&f); printf ("i=%d,c=%c,f=%5.2f\n" ,i,c,f); return 0 ; }
OJ网站如何让使用 online judge的缩写,在线判题的意思
#include <stdio.h> int main () { int a,b; scanf ("%d %d" ,&a,&b); int sum=a+b; printf ("%d\n" ,sum); return 0 ; }
#include <stdio.h> int main () { int i; scanf ("%d" ,&i); char ch=i; printf ("%c\n" ,ch); return 0 ; }
#include <stdio.h> int main () { int i; scanf ("%d" ,&i); if (i>=65 && i<=122 ){ char ch=i; printf ("%c\n" ,ch); } return 0 ; }
算术运算符和关系运算符 13种类型运算符
算术运算符组成的式子叫算术表达式
先算乘除,后算加减
取余%,除/,
加号左边叫左操作数,右边叫右操作数
#include <stdio.h> int main () { int result=4 +5 *2 -6 /3 +11 %4 ; printf ("result=%d" ,result); return 0 ; }
关系运算符与关系表达式 关系表达式的值只有真假之分,真1,假0.关系运算符的优先级低于算术运算符。
#include <stdio.h> int main () { int a; while (scanf ("%d" ,a)) { if (3 <a && a<10 ){ printf ("a is between 3 and 10\n" ); }else { printf ("a is not between 3 and 10\n" ); } } printf ("Hello, World!\n" ); return 0 ; }
逻辑运算符与赋值运算符,求字节运算符 1逻辑运算符与逻辑表达式
逻辑表达式也只有真和假1和0.
一定要记住优先级
#include <stdio.h> int main () { int year,i,j=1 ; while (scanf ("%d" ,&year)) { if (year%4 ==0 &&year%100 !=0 || year%400 ==0 ){ printf ("%d is leap year\n" ,year); }else { printf ("%d is not leap year\n" ,year); } } i=!!j; printf ("i value=%d\n" ,i); return 0 ; }
短路运算 i为假时,不会执行逻辑与后面的表达式
i为真时,不会执行逻辑或后面的表达式
#include <studio.h> int main () { int i=0 ; i&&printf ("you cant' see me\n" ) ; i=1 ; i||printf ("you cant' see me\n" ); return 0 ; }
2赋值运算符 左值是出现在赋值符号左边的东西,右值是指出现在赋值符号右边的东西。
等号左边放变量,不能放表达式,否则会编译错误。
左值是变量
当左操作数和右操作数的变量一样,可以省略,写成 a+=6;
#include <stdio.h> int main () { int a=1 ,b=2 ; a=a+3 ; a+=3 ; printf ("%d\n" ,a); return 0 ; }
3求字节运算符sizeof sizeof是一个运算符,不是函数
第二优先级,比较高的
#include <stdio.h> int main () { int i=0 ; printf ("i sizeof is=%d\n" ,sizeof (i)); return 0 ; }
OJ作业 读取一行,写一个scanf即可
读取多行,用for循环
#include <studio.h> int main () { int year; scanf ("%d" ,&year); if (year%4 ==0 && year%100 !=0 || year%400 ==0 ){ printf ("yes\n" ); }else { printf ("no\n" ); } return 0 ; }
#include <stdio.h> int main () { int i; char j; float k; scanf ("%d %c%f" ,&i,&j,&k); printf ("%5.2f\n" ,i+j+k); return 0 ; }
选择 if-else 1关系表达式与逻辑表达式 算术运算符的优先级高于关系运算符,关系运算符的优先级高于逻辑与和逻辑或运算符。(重要)这些是双目运算符
双目运算符是有两个操作数 左操作数+右操作数
要考虑短路运算
2 if-else语句 #include <stdio.h> int main () { int i; while (scanf ("%d" ,&i)){ if (i>0 ){ printf ("i is bigger than 0\n" ); }else { printf ("i is smaller than 0\n" ); } } return 0 ; }
if else也可以多个使用,多分支语句,if-else也可以嵌套使用。大括号一定不要忘记
循环while,for,continue,break 1while循环 先判断表达式,后执行语句。当表达式的值非0时,就会执行语句,从而实现语句多次执行的效果。
while后面没有分号
#include <stdio.h> int main () { int i,total=0 ; while (i<=100 ){ total=total+i; i++; } printf ("%d\n" ,total); return 0 ; }
2 for循环 C语言中的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以替代while循环语句。其一般形式为
for(表达式1;表达式2;表达式3)语句;
for循环语句执行过程如下
(1)先求解表达式1.
(2)求解表达式2,若值为真(非0),则先执行for语句中指定的内嵌语句,后执行第(3)步。若其值为假(值为0),则结束循环,转到第(5)步。
(3)求解表达式3.
(4)转回第(2)步继续执行。
(5)循环结束,执行for语句下面的语句。
#include <studio.h> int main () { int i,total=0 ; for (i=1 ;i<=100 ;i++){ total+=i; } printf ("total=%d\n" ,total); return 0 ; }
3 continue语句 求1到100 奇数的和
#include <studio.h> int main () { int i,total=0 ; for (i=1 ;i<=100 ;i++){ if (i%2 ==0 ){ continue ; } total+=i; } printf ("total=%d\n" ,total); return 0 ; }
#include <stdio.h> int main () { int i=1 ,total=0 ; while (i<=100 ){ if (i%2 ==0 ){ i++; continue ; } total+=i; i++; } printf ("%d\n" ,total); return 0 ; }
while循环里面要慎重使用continue,他不像for循环的continue一样,跳出直接到i++,需要在while的if语句里面加上i++,才能执行。
4 break语句 break语句是结束整个循环过程的,从大括号跳出来。不再判断循环条件是否成立。
break语句也可以用在while循环和do while循环中,起结束对应循环的作用。
#include <studio.h> int main () { int i,total=0 ; for (i=1 ;i<=100 ;i++){ if (total>2000 ){ break ; } total+=i; } printf ("total=%d,i=%d\n" ,total,i); return 0 ; }
5循环嵌套 对于考研最常见的是,for循环,嵌套for循环,即两层for循环,
#include <studio.h> int main () { int i,j; for (i=0 ;i<5 ;i++){ printf ("i=%d\n" ,i); for (j=0 ;j<5 ;j++){ printf ("%d\n" ,j); } printf ("\n" ); } return 0 ; }
#include <studio.h> int main () { int i,j; for (i=1 ;i<=5 ;i++){ for (j=0 ;j<i;j++){ printf ("*" ); } printf ("\n" ); } return 0 ; }
OJ作业
#include <studio.h> int main () { int a,b=0 ,back_a;; scanf ("%d" ,&a); back_a=a; while (a){ b=b*10 +a%10 ; a=a/10 ; } if (b==back_a){ printf ("yes\n" ); }else { printf ("no\n" ); } return 0 ; }
#include <studio.h> int main () { int n; scanf ("%d" ,&n); int i,result=1 ; for (i=1 ;i<=n;i++){ result*=i; } printf ("%d\n" ,result); return 0 ; }
考察for循环
#include <studio.h> int main () { int x,y,z,o,count=0 ; for (x=1 ;x<=9 ;x++){ for (y=1 ;y<=17 ;y++){ for (z=1 ;z<=37 ;z++){ for (o=1 ;o<=37 ;o++){ if (x+y+z+o==40 && 10 *x+5 *y+2 *z+o==100 ){ count++; } } } } } printf ("%d\n" ,count); return 0 ; }
一维数组 1数组的定义 特点:(1)具有相同的数据类型;
(2)使用过程中需要保留原始数据;
构造类型——数组。所谓数组,是指一组具有相同数据类型的数据的有序集合。
一维数组的定义格式为 类型说明符 数组名 [常量表达式];
定义数组的个数,即数组的长度。
不能用变量命名 int[n],这样是不行的(新的C标准)可以。
2一维数组在内存中的存储 存储从0开始,下标,例如存10个数,存储地址就是0-9
靠后是高地址,靠前是低地址
下面是只初始化一部分值,其余元素全初始化为0
1数组访问越界 面试的时候可能会问
变量i的值发生了改变 ,没有注意数组空间的大小,可能会影响其他变量的大小,其值在内存视图中被覆盖了
#include <stdio.h> int main () { int a[5 ]={1 ,2 ,3 ,4 ,5 }; int j=20 ; int i=10 ; a[5 ]=6 ; a[6 ]=7 ; printf ("i=%d\n" ,i); return 0 ; }
2数组的传递 初试和机试都重要
数组长度传递不过来 ,必须用额外的参数
数组传递到子函数,子函数的形参接收到的是数组的起始地址,因此不能把数组的长度传递给子函数
调试按钮,步入看自己写的子函数
#include <studio.h> void print (int a[],int length) { int i; for (i=0 ;i<length;i++){ printf ("%3d" ,a[i]); } a[3 ]=20 ; printf ("\n" ); } int main () { int a[5 ]={1 ,2 ,3 ,4 ,5 }; print(a,5 ); printf ("a[3]=%d\n" ,a[3 ]); return 0 ; }
字符数组与scanf读取字符串 1字符数组初始化及传递 char c[10];
#include <studio.h> void print (char d[]) { int i=0 ; while (d[i]){ printf ("%c" ,d[i]); i++; } printf ("\n" ); } int main () { char c[6 ]="hello" ; char d[5 ]="how" ; printf ("%s\n" ,c); print(d); return 0 ; }
2scanf读取字符串