C程序基本框架:
#include<stdio.h> //预处理指令int main() //程序入口和主函数main
{
//编写的代码
return 0; // 程序退出前 返回给调用者(操作系统)的值
}
变量四要素:
变量类型
变量名
变量值
存储单元
------
变量名 -- 标识符 -- 由字母、数字、下划线组成
//注意: 标识符 不能 以数字开头 , 可以是 字母 和下划线_
//要用驼峰命名法:-- bubbleSortt()
------
数据类型;
主要:
整形: int -- 4 字节
字符型: char -- 1字节 -- 8 bit
浮点型: float -- 4 字节
输入/ 输出 I/O
输出:
printf:
一般格式: printf(格式控制, 输出列表);
1. 格式控制:
1) 原样输出
2)占位符,格式字符 :
d--十进制整数 x--十六进制 c --单个字符 s--字符串(多个字符) f --小数 p--打印内存地址
a %m.nf 指定数据宽度--m 和小数位数 --n
-- 前面不够的空格补充
b 输出的数据向左对齐 %-m.nf --与%m.f作用基本想相同
但是 当数据长度不超过m时候 ,向左靠,右边补充空格
2.输出列表 : 数据类型 表达式
输入: scanf(格式控制,地址列表)
//注意: scanf 的格式控制里面
如果有其他字符,要吧之前的的字符输入进去才能写入
比如
sacnf("data=%d",&n); -- 他对应额输入应该是 data= 100(一个数字)
注:
0.scanf 的格式中有什么字符,输入的时候也要输入
1.输入多个变量的时候尽量分开写
2.尽量不要在scanf 里面添加 空格 逗号 或者其他字符
3.输入的3个字符时候,不要用空格隔开,因为会空格也算字符
4.在输入数据时,如输入空格、回车、Tab键 或者遇到非法字符(不属于对应数值的字符),则认为改数据结束
5.当多次输入的时候,要注意回车符, 一般用getchar() 来吸收
//其他输入输出:
getchar -- 输入一个字符
putchar -- 输出一个字符
puts -- 输出字符串
gets -- 输入字符串
char *gets(char *str);
gets(str); -- 优势:可以接收空格 ,直接能接收一行字符串
scanf("%s", string); -- 不能接收空格,一次只接受一个字符串
puts 和 printf 区别:
1.会自动换行
2.printf 支持格式化,多样化的输出,puts 值针对输出字符串
case1: 键入一个大写字符输出他的小写字母 --小写字母的ASCLL码值比他的大写字母大32,+32即可
case2: 输入两个数获得其 +-*/的值
float a,b;
printf("请输入两个数字,我们计算他的和差积商");
scanf("%f%f",&a,&b);
printf("和 %f",a+b);
printf("差 %f",a-b);
printf("积 %f",a*b);
printf("商 %f",a/b);
case3: 给“China”加密,规则 -- 用原来的字符后面的四个字母代替 C --G
putchar('C'+4); --- printf("%c",'C'+4);
putchar('h'+4);
putchar('i'+4);
putchar('n'+4);
putchar('a'+4);
---------------------------------------------------------
流程控制:
选择:
if -- else -- 两个分支常用
if - else if - else -- 多个分支
// 判断的时候注意 == 才是判断 = 是赋值
case: 输入2个数字,从小到大输出 if 判断即可
if(a>=b) printf -- b ,a
else a,b
判断:
逻辑与 &&
逻辑或 ||
非 !
switch case -- 多个分支常用
case break
default
//注意: case 后面支持整形 也支持字符 1 2 3 , a b c
test1: 成绩分类 >85 -- A 70~84 -- B 60~69 -- C
报错积累
-- "/243" --一有中文标点
-- expect ";" --缺少 ;-- expected 'int *' but argument is of type 'int' -->参数类型错误
----undeclared -- 未定义 -- 函数名写错 or 没写
//注意switch 里面的;数据选择 -- 最大公因数 -- 作为除数 将范围分类
test1:
写函数:
y= x(x<1)
2 x-1(1<=x<10)
3x-11(x>=10)
#include<stdio.h>int main()
{
float x,y;
puts("请输入x,我们将为你计算出他对应的函数值:");
scanf("%f",&x);
if(x<1)y=x;
else if(1<=x&&x<10)y=2*x-1;
else y=3*x-11;
printf("函数值y:%.2f",y);
return 0;
}
循环:
while
for
-------------------------
while:
-- 只要条件为真就好一直执行
避免死循环 ,除了51单片机代码
爱你一万次:
#include<stdio.h>int main()
{
int k=0;
while(k!=10000)
{
puts("我爱你");
k++;
}
return 0;
}
//全局变量不用初始化,默认0
//在函数里面的变量最好初始化,一般为0
test: 计算1~100 的和
do ... while .....
-------------------------------------
while循环3个表达式:
1.条件初始值: k=0;
2.条件临界值: while(date<=100》)
3.条件变化 k++;格式:
表达式1
while(表达式2)
{表达式3
}
for:
格式
for(表达式1;2;3)
死循环 while(1);
-------------------------------------
死循环 for(;;)
C99标准 允许 for 里面初始化---int i=0;
-----------------------------------
关键字:
break -- 提前跳出 整个 循环
continue -- 跳出当前循环
test :
-对1000 个人进行筹款 -- 捐到10000就停止 -- break 跳出循环
--输出 100~200 直接3的倍数 -- continue 退出 -- 不执行后面的输出 printf
百分号 % -- 取余(模)
--------------------------------
循环嵌套的时候 -- 他的 时间复杂度 是 iMAX * jMAX
test1: 输入m,n,求他们的最小公倍数 和 最大公约数
(1)九章算术—更相减损法
判断a和b那个大,然后大数就减去小数的,再将减去得到的值赋予大数的位置,继续判断,直至两数相等,这时,a=b=最大公约数
适用于两数相差不大也不小
int dix=m*n;
while(m!=n)
{
if(n>=m)
n=n-m;
else
m=m-n;
}
printf("%d %d",m,dix/m);
时间复杂度 = O (log (max (a, b)))
(2)单相取余法 -- 枚举法
先判断a,b那个大,再用a和b的对小的取余,如果结果不为0,则让小的数-1,直至结果为0.
t=m>n?n:m;
while(m%t || n%t)t--;
printf("%d\n",t);
(3)欧几里得——辗转相除法
让两个数中的大数对小数取余,再将小数赋予大数,结果赋予小数,
重复以上动作直至两数其中一个数为零,那么另一个就是最大公约数
while(m && n)
{
if(m>n)m=m%n;
else n=n%m;
}
printf("%d",m>n?m:n);
(4)函数递归法
通过函数调用自身达到求最大公约数的目的,运行速度快,但是不稳定
适用于两数相差较小时求最大公约数.
int lcd(int a,int b)
{
if(a==b)return a;
return a>b?lcd(a-b,b):lcd(b-a,a);
}