Hello World!
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
程序框架(学习函数之前都要用到)
#include <stdio.h>
int main()
{
return 0;
}
变量
- 变量定义的一般形式
<类型名称> <变量名称>;
int a;
int a,b;
- 变量名称(标识符)
标识符只能由字母、数字、下划线组成
数字不可以出现在首位
C语言的关键字不可用 - 变量赋值
int a=b; //将b的值赋予a,与 b=a 不同。
- 变量初始化
<类型名称> <变量名称> = <初始值>;
int a=0;
int b=0;
int a=0,b=0;
常量
const int AMOUNT = 100; // const修饰符 C99!
scanf 输入
- 出现在" "中的内容是需要输入的内容
int a=0;
int b=0;
scanf("%d %d",&a,&b); //输入 1 2
scanf("%d,%d",&a,&b); //输入 1,2
数据类型
整数
int a;
scanf("%d",&a);
printf("%d",a); // %d说明后面有一个整数要输出在这个位置上
浮点数
- printf(%m.nf) 控制小数位数
https://blog.csdn.net/xjp_xujiping/article/details/55818048 - 当浮点数和整数放在一起运算时,C会将整数转换成浮点数,然后进行浮点数的运算。
- 示例:
printf("%f",10/3*3.0); // 9.000000
printf("%f",10/3*3); // 0.000000
printf("%f",10/3.0*3); // 10.000000
- 法一:
int a=10;
printf("%d",a/3); // 3 商取整
printf("%f",a/3); // 结果永远是0.000000
printf("%f",a/3.0); // 3.333333
- 法二:
double a=10; //或 float a=10; 相当于a=10.0
scanf("%lf",&a); //输入时需注意 %lf
printf("%f",a/3); // 相当于 10.0/3
(%)p
- 地址
运算符
算术运算
- % 取余
- = 优先级最低
结合关系:自右向左。 - 单目取负/单目不变
结合关系:自右向左。
int a*+b; // 自右向左
int a*-b; // 自右向左
sizeof
- 给出某个类型或变量在内存中所占据的字节数
sizeof(int)
sizeof(i)
&
- 获得变量的地址,它的操作数必须是变量
- 地址的大小是否与 int 相同取决于编译器
- 数组
相邻的数组单元之间的地址永远相差4
&a == a == &a[0]
关系运算
- ==
- !=
- 优先级:比算术运算低,比赋值运算高
- == / != 的优先级比其他的低
- 当两个值的关系符合关系运算符的预期时,关系运算的结果为1,否则为0
printf("%d\n",1==2); // 1
printf("%d\n",1>2); // 0
printf("%d\n",1<2); // 1
逻辑运算
- ! 逻辑非
!a
- && 逻辑与
若左边是false则不进行右边运算 - || 逻辑或
若左边true则不进行右边运算
条件运算
- ? 自右向左
- , 优先级最低
将,右边的值作为结果
int i;
i=1+1,2+2; // i=2
i=(1+1,2+2); // i=4
( i=0, j=10; i < j; i++, j-- )
复合赋值
- a++ 是a+1以前的值
- ++a 是a+1以后的值
示例1
int a=1;
int b=1;
printf("a++=%d,a=%d\n", a++, a); // a++值为1,a值为2
printf("++b=%d,b=%d\n", ++b, b); // ++b值为2,b值为2
示例2
int a=1;
int t1=a++; // t1=1, a=2
int t2=++a; // t2=3, a=3
判断
if-else
-
if (条件成立) {
…
} else {
…
}
switch-case
-
switch (<控制表达式>) {
case <常量>:
…
break;
case <常量>:
…
break;
default:
…
break;
} -
<控制表达式><常量>只能是整数结果
循环
while循环
-
while (条件成立) {
…
}
do-while循环(注意 ; )
-
do
{
<循环体语句>
} while (<循环条件>);
for循环
-
for (<初始动作>;<循环条件>;<循环体>) {
…
}
其他
- goto
goto out ;
…
out : //放在需要结束的循环外面
随机数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(0));
int a=rand();
printf("%d\n",a);
return 0;
}
- 示例:猜数游戏
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(0));
int number=rand()%100+1; //可通过 x%n 来限定随机数的范围
int count=0;
int a;
printf("猜一个1到100之间的数。\n");
do{
count++;
printf("第%d次猜测:",count);
scanf("%d", &a);
if( a>number ){
printf("你猜的数大了。\n");
}else if( a<number ){
printf("你猜的数小了。\n");
}
} while(a!=number);
printf("恭喜你猜对了!");
return 0;
}
数组
一维数组
- 有效范围 [ 0 ,数组大小-1]
- 集成初始化时的定位 C99!
int a[10]={
[0]=2,[2]=3,6
}; //其他位置补零
二维数组
- 例:int a[3][5] 为3行5列的矩阵
for ( int=0; i<3; i++ ) {
for ( j=0; j<5; j++ ) {
a[i][j]=i*j;
}
} //二维数组的遍历
- 二维数组的初始化
列数必须给出,行数可以省略,若省略表示补零
int a[][5]={
{0,1,2,3,4},
{2,3,4,5,6}, //最后的 , 可以存在
}; //也可不带{}
数组大小
sizeof(a)/sizeof(a[0])
搜索
- 结构体
#include <stdio.h>
int amount[]={1,5,10,25,50};
char *name[]={"penny","nickel","dime","quarter","half-dollar"};
struct{
int amount;
int *name;
} coins[]={
{1,"penny"},
{5,"nickel"},
{10,"dime"},
{25,"quarter"},
{50,"half-dollar"}
};
int search(int key,int a[],int len)
{
int ret=-1; //没找到k时输出-1
for(int i=0;i<len;i++)
{
if(key==a[i])
{
ret=i;
break;
}
}
return ret;
}
int main()
{
int k; //需要查询的值
scanf("%d",&k);
for(int i=0;i<sizeof(coins)/sizeof(coins[0]);i++)
{
if(k==coins[i].amount){
printf("%s\n",coins[i].name);
break;
}
}
return 0;
}
- 二分搜索(有序数组)
int search(int key,int a[],int len)
{
int ret=-1; //没找到k时输出-1
int left=0;
int right=len-1;
while(right>left)
{
int mid=(left+right)/2;
if(a[mid]==k)
{
ret=mid;
break;
} else if(a[mid]>k
{
right=mid-1;
} else{
left=mid+1;
}
}
return ret;
}
int main()
{
int k; //需要查询的值
scanf("%d",&k);
......
return 0;
}
数组排序
- 选择排序
- 冒泡法
函数
- 调用函数
<函数名>(参数值) //()不可省略
- 声明
<函数类型> <函数名>(参数值) ;
- void f(void);
表示此函数不接受参数 - void f();
表示f函数的参数未知
数学问题
猜数
- 二分法
100以内的数最多猜7次可得正确答案
最大公约数
- 辗转相除法
求a、b的最大公约数
1、若b==0,计算结束,最大公约数是a
2、否则,计算c=a%b,让a=b,b=c
3、回到步骤一
指针
指针与数组
int a[]={0};
int *p=a;
p==&a[0]
*p==a[0]
p[0]==a[0]
- 函数参数表中的数组实际上是指针,即a[ ]可以用*a代替,以下四种函数原型是等价的:
int sum(int *ar, int n);
int sum(int *, int);
int sum(int ar[], int n);
int sum(int [], int);
- 数组变量是const的指针,不能被赋值
其它
- 将Dev C++改为C99标准,参考 https://blog.csdn.net/artechtor/article/details/1788699
- 若使用 Dev C++ 4.9.9.2
system("pause"); // 在程序运行完成后,窗口还能留下
- ANSI C
只能在代码开头定义变量
不支持“//”注释