用于学习笔记,侵权删
第一章 C语言基础
1.编译
计算机语言:机器语言、汇编语言、高级语言。
机器语言:01序列表示的语言。
01序列每一位都是一个比特bit。
8比特bit为一个字节B。
c语言是高级语言,让计算机读取就需要编译。编译:将c语言转化为机器语言的过程。
【源程序.c】-->[编译]--》【目标文件.obj】-->[链接]-->【可执行文件.exe】
2.数制及表示
十进制 0-9
二进制 0 1 【0b】0b110110
八进制 0-7 【0】05124
十六进制 0-9 A-F 【0x】0x5D12
3.main函数
c程序的基本单位是函数。
所有的符号由英文输入法输入。int main 之间有空格。return 0 ;后面有分号表示语句结束。
main函数就是主函数。
每个c程序有且仅有一个main函数。
c程序从main函数开始执行。
return语句的作用:c程序在【main函数的】return 0;结束执行。
4.编译预处理
c语言编译预处理命令包括 文件包含(#include)、宏定义(#define)、条件编译。
文件包含是可以嵌套的。
宏定义 :#define 名称 内容(使用规则:把所有的名称替换成对应内容)
第二章 基础数据类型
1.标识符
变量、函数、数组等的名字。
只能以字母、下划线开头;
只能使用大小字母、下划线、数字的任意组合;
大小写字母表示不同的名字;
规定的32个关键字不能作为标识符使用。
2.数据类型
字符型 char 1字节
整型 int 2字符 long(int) 4字符
实型(浮点数) float 4字符 double 8字符
sizeof():求括号里的内容占多少个字节
3.常量
整型常量:整数1 -5;
实型常量:小数1.5 -3.12 ;
字符型常量 :字符常量'a' '2' '!' \n \t \\ \' \ddd(1-3位八进制数) \xxh(1-2为16进制数)、字符串常量"a" "hello world" 每个字符串结尾都隐藏‘\0’表示字符串的结束,占一个字节
4.变量
定义:数据类型 变量名;
赋值:变量名 = 常量;
初始化:类型 变量名 = 常量;
所有变量在使用前都必须定义;
连续赋值必须保证 =等号左边 是变量。
第三章 运算符
1.运算符
括号运算符()、
算术运算符+-*/%++--、
关系运算符> >= < <= == !=、
逻辑运算符!非 &&与 ||或、
复合运算符+= -= *= /= %= 。
注意: == 表示 等于 = 表示 赋值
% 求余运算符 18/4=4......2 ==> 18%4 =2
优先级:算术>关系>逻辑
2.++,--运算符
int i;
i--; --i; ===> i = i-1;
i++; ++i; ===> i = i+1;
j = ++i; --> 先加1;再赋值
++i; j = i;
j = i++; --> 先赋值;再加1
j = i; i++;
3.逗号运算符
从左往右开始计算,最右边的值是最终结果。
第四章 程序的输入和输出
1.printf()语句
将固定的内容输出到屏幕上。
%md:输出m位整数,整数不够,左边补空格。m的位数小于输出位,原数输出。
%.nf:小数点后保留n位小数,四舍五入;小数位不够补0。
ASCII码:空格32 ‘0‘48 ’A‘65 'a' 97
2.scanf()语句
int a; scanf(“%d”,&a);
& + 变量名:获取变量的地址。
int a;char b;float c;
scanf("%d%c%f",&a,&b,&c);【15z3.14回车赋值】
scanf("a=%d,b=%c,c=%f",&a,&b,&c);【a=15,b=z,c=3.14回车赋值】
第五章 if...else语句,switch语句
c语言的结构:顺序结构、选择结构、循环结构
1.if...else语句
if...else允许嵌套。当if或else后面有多个语句时,用{ }把这多个语句括起来。
else 总是与其之前最近且不带else的if配对
if()...else if()...else if()...else...
getchar()从键盘获取一个字符
补全代码:
认识数学函数:#include <main.h>
例题:编写程序输出分段函数。
答案:
2.三目运算 ?:运算
A?B:C
判断A:A 为真,输出B;A为假,输出C。
例题:判断输出结果
3.switch-case语句
如果没有break语句……switch-case语句找到第一个匹配的case语句开始运行,直到break语句或整个switch-case语句结束。
第六章 循环结构(一)
1.while语句
使用规则: while(条件为真){执行操作}
作用:重复执行操作直到不满足该条件为止,执行的操作叫循环体。
例题一:编程计算并输出n!的值,其中n从键盘上输入。
提示:n! =1*2*3*...*n
分析:
答案:
例题二:编程计算1*2*3+3*4*5+5*6*7+..+99*100*101的值。
提示:可以用步长为2的循环语句实现。
答案:
例题三:输入一个正整数m,计算1-3+5-7+9-11+…的前m项之和。
答案:
sign 控制正负±
sign 初始值是1,即,是正的
后来在循环体内,赋值sign = -sign;把它赋值为负值,便于后一项控制为负数。
结果:
小总结:题目是加减运算,把结果result赋初始值为0;题目是乘法运算,把结果result赋初始值为1。
例题四:(水仙花数:水仙花数的每一位数字 的立方 之和仍然等于这个数)
答案:
2.do...while语句
do{执行操作} while(条件为真);
do-while语句的循环体至少执行一次。
第七章 循环结构(二)
1.for语句
for(初始值;条件;变量更新){执行操作;}
例题二:编程计算1*2*3+3*4*5+5*6*7+...+99*100*101的值。
提示:可以用步长为2的循环语句实现。
例题三:输出100~999之间的水仙花数
提示:水仙花数的每一位数字的立方之和等于这个数
例题四:输出1~100,每行输出8个数。
2.continue和break语句
break的作用:(1)结束switch语句;(2)结束循环,直接进入后面的语句。
用法:break;
continue的作用:结束本次循环,进入下一次循环判断。
用法: continue;
例题一:******************难
编写程序,输出100以内的全部素数(只能被1和它本身整除的整数)。
分析:
mark作用:
1)如果mark==1,就是素数;如果不是素数,就能被J=2整除,并把mark赋值为0,然后跳出循环;
2)后面判断的时候,就找出mark==1的数就是素数
第八章 数组和字符串
1.一维数组
定义:数据类型 数组名[元素个数];
int a[5]; 数组元素:a[0] a[1] a[2] a[3] a[4] 数组元素下标从0开始。
赋值:没赋值的自动赋值为0;
例题一:从键盘中输入数字,存放在一维整型数组a[5]中,计算并输出所有元素的平均值。
分析:
答案:
运行结果:
例题二:定义数组a[6]=[10,7,15,20,3,1},求出该数组的最大值,并输出其下标
答案:
例题三:编写程序实现,用数组来产生Fibonacci数列前15项。
提示:Fibonacci数列为1,1,2,3,5,8,13,...
f(i)=f(1-1)+f(i-2),f(1)=1,f(2)=1(第一项和第二项为1,后面每一项都是前面两项之和)
答案:要先对数列赋值,规律如上a[i]=a[i-1]+a[i-2]。因为是数组,所以要用到循环赋值。然后再输出。
例题四:用冒泡排序法对给定的5个整数按递增的顺序排序。
冒泡排序法(升序):再第一趟排序中,比较所有的数,从第一个数开始两两比较;交换位置。直至最大的数放到了队尾。
N个元素,N-1趟排序。
答案:
2.二维数组
数据类型 数组名[元素个数1][元素个数2]; ===》 int a[2][3];
未被赋值的元素会自动设置为0
例题一:
若定义X[3]={1,2,3,4,5,6,7;则数组中行的大小是()。
A 4 B 3 C 2 D 无法确定。
B
例题二:读程序题目
答案:输出 i=3,s=15
3.字符串数组
定义:char 字符数组名[元素个数]; char s[20];
char str1[20]="abc123"; 等价于 char str1[20] = {'a','b','c','1','2','3','\0'};
char str1[]="abc123"; 等价于 char str1[] = {'a','b','c','1','2','3','\0'};
注意:计算时,以"\0'为字符串结束标志。
strcmp(str1,str2) 比较str1和str2的大小。
strcpy(str1,str2) 把str2复制(copy)到str1中。
strcat(str1,str2) 把str2连接到str1后面。
strlen(str) 计算str中的非\0'字符个数。
( 使用时加上#include <string.h> )
⭐例题一
A 由于p数组中没有字符串结束符,长度不能确定;但q数组中字符串长度为3
B.由于q数组中没有字符串结束符,长度不能确定;但p数组中字符串长度为3
C在给p和q数组置初值时,系统会自动添加字符串结束符,故输出的长度都为3 √
D.由于p和q数组中都没有字符串结束符,故长度都不能确定
注意: char s[3]={a;b;c'};的初始化方式会使strlen()失效。因为固定了字符数组的长度,系统无法在后面加上结束字符'\0'。
例题二 编写程序,输入一串字符,如果是大写字母改变为小写字母;如果是小写字母,则把它变为大写字母;若是其它字符则不变。
分析:所需的知识点
gets(字符数组名);从键盘上输入字符串。scanf(“%s",字符数组名);
puts(字符数组名);把字符串输出到屏幕上。printf("%s",字符数组名);
使用时要加上#include<string.h>
答案:
第九章 函数
1.函数的定义和声明
定义:返回类型 函数名(数据类型 形式参数,.…){ }
函数可以定义在main函数的前面,也可以定义在main函数的后面;
只有被main函数调用时,函数才会执行;
形式参数和实际参数必须是同个数据类型。
在C程序中,若对函数类型未加说明,则函数的隐含类型为()。 int
形式参数和实际参数之间是单向值传递;
在函数内对形参的任何修改都不会影响main函数内的实参;
函数返回类型为void(空)时,函数没有return语句;
函数内定义的变量只在本函数中有效。
函数中的形式参数是局部变量。
static的作用:在函数执行完后保持变量a的值;下一次执行函数时,a的值为上次保存的值。
例题一:输出100以内的全部素数
提示:(只能被1和它本身整除的整数)。
分析:
答案:
?问题:怎么判断是否是素数,第一步为什么要使用循环?
素数:只能被1和它本身整除的整数
(1)分别将【这个数】取余%【小于这个数的数(多个)】,如果区域结果是0,证明可以整除,则不是素数;如果是1,证明不能整除,不是素数。
例如: i = 2;【4】要分别取余%【 2 、3 】 这两个数。
4%2 4%3
(2)能被其他小于它的数整除时,就不是素数,所以需要使用循环
函数的定义不允许嵌套;函数的调用可以嵌套;main函数不能被其他函数调用
一个函数的返回值由【被调用函数定义的返回类型】确定。
2.函数的递归
函数调用自己本身。
用递归函数求Fibonacci数列。
斐波那契数列 : f(1) = f(2) = 1
第十章 指针(在函数中属于地址传递)
1.指针的定义
指针 = &变量
*变量 = 指针指向变量的值
先定义指针,再把指针与变量想关联(图左边);或者直接定义指针的同时把指针与变量相关联(图右边)。如下图:
指针赋值给指针(地址) p1=p2; (改变了指针的指向)
变量的地址赋值给指针 p1=&a;
int a[5]; p1 = a; p1 = &a[0];
指针与变量相关联。
若有定义:int x=1,*p=&x;则语句 printf("%d\n".*p);的输出结果是()。
A.1 B.p 的地址 C.x 的地址 D.0
答案:A
2.指针做函数参数
⭐函数自变量是指针类型时,函数调用时,写 (&变量名,&变量名)【下图第三点】
3.指针与数组
1.指针=数组名;
2指针进行加减运算时,p+1指向p之后的一个变量。
3.t[i] 等价于 p[i] 等价于 *(t+i) 等价于 *(p+i)
4.&t[i] 等价于 t+i 等价于 p+i
例题一:若定义char t[10],*p=t;则在下面表达式中表示t[1]的地址的是()。
A p+1 B.*(p+1) C.*p+1 D.&p+1
A
例题二:若已定义: int a[]={0,1,2,3,4,5,6,7,8,9], *p=a,i;其中0<i≤9,则对a数组元素不正确的引用是()。
分析:
A选项 因为p=a, 所以p-a =0; a[p-a] = a[0]
B选项 *和&是一对逆运算。所以是 a[i]
*和&是一对逆运算。
例题三:编写函数int ff(str,ch),其功能是统计并返回字符ch在字符串str中出现的次数。
提示:例如:调用ff("every"e')后返回2,因为在字符串"every"中字符'e'出现了2次。
已知:主函数内容
分析:字符串str,字符ch,出现次数count;用循环比较每个字符str[i]与字符ch是否相等,如果相等,count++
答案:第一点:作函数的自变量时,指针和数组是等价的。