1.c语言基本语句符号
<1>.printf("")
(1)输出
-
printf("Hello World!\n");
-
""⾥⾯的内容叫做“ 字符串 ”,printf会把其中的内 容原封不动地输出;
-
\n表⽰需要在输出的结果后⾯换⼀⾏;
(2)输出结果
-
printf("%d\n", 23+43);
-
%d说明后⾯有⼀个整数要输出在这个位置上
-
printf("23+43=%d\n", 23+43);
#include <stdio.h>
int main()
{
printf("x+y=%d\n", 23+46);
printf("hello world\n");
printf("23+56=%d\n", 23+56);
return 0;
}
<2>.scanf("", &)
(1)读入
-
scanf("%d整数",&x);scanf("%lf浮动",&x);
&为读取地址;&把读到的值赋予后项变量;
-
也可以读取多个变量,比如:
#include <stdio.h>
int main ()
{
int a;
int b;
printf("请输入a,b的值");
scanf("%d %d", &a,&b);
printf("%d+%d=%d\n" ,a,b,a+b);
}
2.变量
<1>.变量(int)
-
int price标识符 = 0;
-
这⼀⾏,定义了⼀个变量。变量的名字是
price,类型是int,初始值是0。
-
变量是⼀个保存数据的地⽅,当我们需要
在程序⾥保存数据时,⽐如上⾯的例⼦中
要记录⽤户输⼊的价格,就需要⼀个变量
来保存它。⽤⼀个变量保存了数据,它才
能参加到后⾯的计算中 ,⽐如计算找零。
-
int为整数类型
<2>.常量(const)
-
const是⼀个修饰符,加在int的前⾯,⽤来
给这个变量加上⼀个const(不变的)的属
性。这个const的属性表⽰这个变量的值⼀
旦初始化,就不能再修改了。
-
const int AMOUNT;
-
int change = AMOUNT - price;
-
如果你试图对常量做修改,把它放在赋值
运算符的左边,就会被编译器发现,指出
为⼀个错误。
<5>.赋值(=)
-
和数学不同,a=b在数学中表⽰关系,即a
和b的值⼀样;⽽在程序设计中,a=b表⽰
要求计算机做⼀个动作:将b的值赋给a。
关系是静态的,⽽动作是动态的。在数学
中,a=b和b=a是等价的,⽽在程序设计
中,两者的意思完全相反。
-
赋值也是运算,也有结果,结果为被赋的值。
#include <stdio.h>
int main()
{
int a=5;
int b=6;
int t;//增加容器做调换
t=a;
a=b;
b=t;
printf("%d %d", a,b);
return 0;
}
<6>.浮点数变量(double)
-
inch是定义为int类型的变量,如果把int换
成double,我们就把它改为double类型的
浮点数变量了。
-
double的意思是“双”,它本来是“双精度浮
点数”的第⼀个单词,⼈们⽤来表⽰浮点
数类型。除了double,还有float(意思就
是浮点!)表⽰单精度浮点数。
-
当浮点数与整数放在一起计算时,c语言会
自动将整数转化为浮点数;
3.表达式
<1>.算符c语言符号
四则运算 | c符号 | 意义 |
---|---|---|
+ | + | 加 |
- | - | 减 |
× | * | 乘 |
÷ | / | 除 |
mod | % | 取余 |
() | () | 括号 |
<2>.算符优先级
优先级 | 运算符 | 运算 | 结合关系 | 举例 |
---|---|---|---|---|
1 | + | 单目不变 | 自右向左 | a*+b |
1 | - | 单目取负 | 自右向左 | a*-b |
2 | * | 乘 | 自左向右 | a*b |
2 | / | 除 | 自左向右 | a/b |
2 | % | 取余 | 自左向右 | a%b |
3 | + | 加 | 自左向右 | a+b |
3 | - | 减 | 自左向右 | a-b |
4 | = | 赋值 | 自右向左 | a=b |
<3>.递减递增运算符的前缀型与后缀型
表达式 | 运算 | 表达式的值 |
---|---|---|
count++ | 给count加1 | count原来的值 |
count-- | 给count减1 | count原来的值 |
++count | 给count加1 | count加1以后的值 |
--count | 给count减1 | count减1以后的值 |
4.判断
<1>.if(){}语句判断
(1)条件(关系运算)
-
计算两个值之间的关系成为关系运算;
运算符 意义 == 相等 != 不等 > 大于 >= 大于等于 < 小于 <= 小于等于 -
关系运算的结果
-
当两个值的关系符合关系运算符的预期时,
关系运算的结果为整数1,否则为整数0 ;
#include <stdio.h> int main { printf("%d\n", 5==3);//0 printf("%d\n", 5>3);//1 printf("%d\n", 5<=3);//0 return 0; }
-
-
关系运算的优先级
-
所有的关系运算符的优先级⽐算术运算的 低,但是⽐赋值运算的⾼;
-
判断是否相等的==和!=的优先级⽐其他的 低,⽽连续的关系运算是从左到右进⾏的;
-
(2).if语句
-
一个if语句由一个关键字if开头,跟上在括号里表示条件的逻辑表达。然后一对{}之间的若干语句。如果表示条件的逻辑表达式结果不为0(条件成立),那么执行后面语句,否则不执行跳过;
(3)代码演示
#include <stdio.h>
int main{
int a,b;
printf("请输入两个数");
scanf("%d %d",&a,&b);
int max= 0;
if(a>b){
max=a;
}
if(a<b){
max=b
}
printf("大的是%d\n",max);
return 0;
}
或者我们可以
#include <stdio.h>
int main{
int a,b;
printf("请输入两个数");
scanf("%d %d",&a,&b);
int max= b;
if(a>b){
int max= a;
}
printf("大的是%d\n",max);
return 0;
}
<2>.if-else语句
(1)else语句
-
接在if语句之后,与if语句是相反不包含关系,如果...否则的话...;与连用if...if...相比,好处是不用判断多次,如果前项if成立则不需要判断后项else。
(2)if-else 嵌套
-
嵌套的判断:当if的条件满足或不满足的时候要执行的语句也可以是一条if或if-else语句,这就是嵌套的if语句
-
else的匹配:else总是和最近的那个if匹配(都有括号或者都没括号)
-
缩进格式不能暗示else匹配。
-
在if或else后面总是用{}较好。
#include <stdio.h> int main() { int a,b,c; int max = 0; printf("请输入a,b,c的值"); scanf("%d %d %d",&a,&b,&c); if(a>b){ if(a>c){ max=a; }else { max=c; } } else{ if(b>c){ max=b; } else{ max=c; } } printf("max=%d\n",max); return 0; }
(3)if-else级联
-
级联的if-else if
if( exp1 ) st1; else if( exp2 ) st2; else st3;
<3>.switch-case 语句
(1)switch-case 语句
-
控制表达式只能是整数型的
-
结果
-
常量可以是常数,也可以是
-
常数计算的表达式
-
根据表达式的结果,寻找匹
-
配的case,并执⾏case后⾯的
语句,⼀直到break为⽌
-
如果所有的case都不匹配,那
-
么就执⾏default后⾯的语句;
如果没有default,那么就什么
都不做
(2)break
-
switch语句可以看作是⼀种基于计算的
跳转,计算控制表达式的值后,程序会
跳转到相匹配的case(分⽀标号)处。
分⽀标号只是说明switch内部位置的路
标,在执⾏完分⽀中的最后⼀条语句后,
如果后⾯没有break,就会顺序执⾏到下
⾯的case⾥去,直到遇到⼀break,或
者switch结束为⽌。
(3)代码演示
#include <stdio.h>
int main()
{ int grade = 0;
printf("请输入成绩:");
scanf("%d", &grade);
grade /=10;
/* case只可辨别常量 */
switch (grade){
case 10:
//printf("A\n");
//break;
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
default:
printf("F\n");
break;
}
return 0;
}
5.循环
<1>.while循环语句
(1)while 语句
-
如果我们把while翻译作“当”,那么⼀个 while循环的意思就是:当条件满⾜时,不断地重复循环体内的语句。
-
循环执⾏之前判断是否继续循环,所以有可能循环⼀次也没有被执⾏;
-
条件成⽴是循环继续的条件。
(2)代码演示
#include <stdio.h>
int main()
{
int x;
int n=0;
printf("x=");
scanf("%d",&x);
n++; //包含0的话此处不可略去,正整 数可略去
x /=10;
while(x>0){
n++;
x /= 10;
//用于检查每一步骤中的x与n的值 printf("x=%d n=%d\n",x,n);
}
printf("n=%d",n);
return 0;
}
<2>.do-while循环语句
(1)do-while语句
-
在进⼊循环的时候不做检查,⽽是在执⾏完⼀轮循环体的代码之后,再来检查循环的条件是否满⾜,如果满⾜则继续下⼀轮循环,不满⾜则结束循环
-
do-while循环和while循环很像,区别是在循环体执⾏结束的时候才来判断件。也就是说,⽆论如何,循环都会执⾏⾄少⼀遍,然后再来判断条件。while循环相同的是,条件满⾜时执⾏循环,条件不满⾜时结束循环。
-
最后的括号有分号。
(2)代码演示
#include <stdio.h>
int main()
{
int x;
int n= 0;
printf("x=");
scanf("%d", &x);
do
{ x /=10;
n++;
}while(x>0);
printf("n=%d",n);
return 0;
}
#include <stdio.h>
int main()
{
int sum= 0;
int count= 0;
int number;
printf("请输入number=");
scanf("%d",& number);
while (number != -1){
sum += number;
count++;
printf("请输入number=");
scanf("%d",& number);
}
/*do{printf("请输入number=");
scanf("%d",& number);
if(number!=-1){
sum += number;
count ++;}
}while(number !=-1);
*/
printf("%f",1.0*sum/count);
return 0;
}
<3>.for循环语句
(1).for语句与while语句的差别
-
for==while
(2)for语句
-
for ( 初始动作; 条件; 每轮的动作 ) { }
for中的每⼀个表达式都是可以省略的 for (; 条件; ) == while ( 条件 )
-
for循环像⼀个计数循环:设定⼀个计数器,初始化它,然后在计数器到达某值之前,重复执⾏循环体,⽽每执⾏⼀轮循环,计数器值以⼀定步进进⾏调整,⽐如加1或者减1
(3)for==对于
-
for ( count=10; count>0; count-- )
就读成:“对于⼀开始的count=10,当 count>0时,重复做循环体,每⼀轮循环 在做完循环体内语句后,使得count--。”
(4)代码演示
#include <stdio.h>
int main()
{
int x;
int i= 1;
int ans= 1;
printf("x=");
scanf("%d",&x);
for(i=1;i<=x;i++){
ans *= i;
// printf("%d\n",i);
}
printf("x!=%d,i=%d",ans,i);
return 0;
}
(5)循环次数
- for(i=0;i<n;i++) ->循环次数是n,循环结束以后,i的值是n。循环的控制变量是i,是选择0开始还是1开始,是判断i<n还是判断i<=n,对循环的次数,循环结束后变量的值都有影响
(6)三种循环
-
如果有固定次数,用for循环
-
如果必须执行一次,用do-while循环
-
其他的用while循环
(4)if语句中的break
#include <stdio.h>
int main()
{
int x;
int i;
int isPrime= 1;
printf("x=");
scanf("%d",&x);
for(i=2;i<x;i++){
if(x % i == 0){
int isPrime= 0;
break;
}
}
if(isPrime==1){
printf("是素数\n");
}else{
printf("不是素数\n");
}
return 0;
}
(5)if的嵌套循环
- 循环里面还是循环;
#include <stdio.h>
int main()
{
int x;
int count = 0;
for (x=1;count<50;x++){
int i;
int isPrime= 1;
for(i=2;i<x;i++){
if(x % i == 0){
isPrime= 0;
break;
}
}
if(isPrime==1){
printf("%d\t",x);
count ++;
if(count%5==0){
printf("\n");
}
}
}
return 0;
}
<6>.从循环中跳出
(1)接力break
#include <stdio.h>
int main()
{
int x=2;
int one,two,five;
int exit= 0;
//printf("x=");
//scanf("%d",&x);
for(one=1;one<x*10;one++){
for(two=1;two<x*10/2;two++){
for(five=1;five<x*10/5;five++){
if(one+two*2+five*5==x*10){
printf("你需要%d个一角,%d个两角,%d个五角凑齐%d元\n",one,two,five,x);
exit= 1;
break;
}
}
if(exit==1) break;//第三轮循环结束后到这
}
if(exit==1) break;//第二轮循环结束后到这
}//第一轮循环结束后到这
return 0;
}
(2)goto语句
-
out 是自定义,goto语句避免了上述代码中繁琐的break跳出循环的过程
#include <stdio.h>
int main()
{
int x=2;
int one,two,five;
//printf("x=");
//scanf("%d",&x);
for(one=1;one<x*10;one++){
for(two=1;two<x*10/2;two++){
for(five=1;five<x*10/5;five++){
if(one+two*2+five*5==x*10){
printf("你需要%d个一角,%d个两角,%d个五角凑齐%d元\n",one,two,five,x);
goto out;
}
}
}
}out:
return 0;
}
6.c语言的数据类型
<1>.类型
- 整数:char,short,int,long,long long
- 浮点数:float,double,long double
- 逻辑:bool
- 指针
- 自定义类型
<2>.sizeof
-
sizeof是一个运算符,给出某个类型或变量在内存中所占据的字节数
-
sizeof(int);sizeof(i).输出格式为%ld
-
- sizeof 是静态运算符,结果在编译时已决定。sizeof中的运算结果不在代码中运行。
#include <stdio.h>
int main()
{
int a;
a = 6;
printf("sizeof(int)%ld\n",sizeof(int));
printf("sizeof(a)%ld\n",sizeof(a));
return 0;
}
#include <stdio.h>
int main()
{
int a;
a = 6;
printf("sizeof(double)=%ld\n",sizeof(long double));
printf("sizeof(a)=%ld\n",sizeof(a++));
printf("a=%d\n",a);//次数a的值为6,a++没有运算
return 0;
}
<3>.整数存储字节
- char:1字节(8比特)
- short:2字节
- int:取决于cpu,通常的意义是一个字
- long:取决于cpu,通常的意义是一个字
- long long:8字节
#include <stdio.h>
int main()
{
printf("sizeof(char)=%ld\n",sizeof(char));//1
printf("sizeof(short)=%ld\n",sizeof(short));//2
printf("sizeof(int)=%ld\n",sizeof(int));//4
printf("sizeof(long)=%ld\n",sizeof(long));//4
printf("sizeof(long long)=%ld\n",sizeof(long long));//8
return 0;
}
<4>.二进制负数
- 一个字节可以表达的数:00000000——11111111
- 三种方案表达负数
- 仿照十进制,有一个特殊的标志表示负数
- 取中间的数为0,如10000000表示0,比他小的是负数,比他大的是正数
- 补码
<5>.补码
-
补码的意义就是拿补码和源码可以加出一个溢出的零
<6>.unsigned
- 在整型类型前加上unsigned使得他们成为无符号的整数
#include <stdio.h>
int main()
{
unsigned char c = 255;
int i = 255;
printf("c=%d,i=%d\n",c,i);
return 0;
}
<8>.浮点类型
(1)浮点类型
(2)浮点的输入与输出
#include <stdio.h>
int main()
{
double ff = 1E-10;
printf("%.16f,%E\n",ff,ff);
return 0;
}
(3)输出精度
(4)超出范围的浮点数
(5)浮点运算精度
#include <stdio.h>
int main()
{
float a,b,c;
a = 1.345f;
b = 1.123f;
c = a + b;
if(c==2.468){
printf("相等\n");
} else{
printf("不相等 c= %.10f,或%f\n",c,c);
}
return 0;
}
(6)选择浮点类型
- 如果没有特殊需求,只使用double
<9>.字符类型
(1)字符类型
(2)字符输入输出
#include <stdio.h>
int main()
{
char c;
scanf("%c",&c);
printf("c=%d\n",c);
printf("c=%c\n",c);
return 0;
}
<10>.类型转换
(1)自动类型转换
(2)强制类型转换
<11>.bool类型
-
include <stdio.h>
-
之后就可以使用bool和true,false
<12>.逻辑运算
(1)逻辑运算
(2)例子
(3)优先级
(4)短路
7.函数
<1>.函数的定义
<2>.调用函数
#include <stdio.h>
void sum(int begin,int end)
{
int i;
int sum = 0;
for(i=begin;i<=end;i++){
sum += i;
}
printf("%d到%d的和是%d\n",begin,end,sum);
}
int main()
{
sum(1,10);
sum(20,30);
sum(35,45);
return 0;
}
<3>.函数的返回
<4>.有返回值的函数
-
函数中用return将return后的值传回给使用函数处;
-
函数头定义返回类型,如int
#include <stdio.h>
int max(int a,int b)
{
int ret;
if(a>b){
ret = a;//return a;
}else{
ret = b;//return b;
}
return ret;
}
int main(){
int a,b,c;
a = 5;
b = 6;
c = max(10,12);
c = max(a,b);
c = max(c,23);
printf("%d\n",max(a,b));
return 0;
}
<5>.没有返回值的函数
-
函数头为void;
-
不能使用return;
-
调用时不能做返回指定的赋值
#include <stdio.h>
void sum(int begin,int end)
{
int i;
int sum = 0;
for(i=begin;i<=end;i++){
sum += i;
}
printf("%d到%d的和是%d\n",begin,end,sum);
}
int main()
{
sum(1,10);
sum(20,30);
sum(35,45);
return 0;
}
<6>.函数的先后关系
<7>.函数的先定义后声明
(1)函数的原型
(2)函数的先定义后声明
#include <stdio.h>
void sum(int begin,int end);
int main()
{
sum(1,10);
sum(20,30);
sum(35,45);
return 0;
}
void sum(int begin,int end)
{
int i;
int sum = 0;
for(i=begin;i<=end;i++){
sum += i;
}
printf("从%d到%d的和是%d\n",begin,end,sum);
}
<8>.参数与变量
(1)值与参数类型不匹配
(2)传值于函数
(3)变量的生存期和作用域
- 函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称为本地变量
- 定义在函数内部的变量就是本地变量
- 参数本身也是本地变量
- 生存期:什么时候这个变量开始出现了,到什么时候他消亡了
- 作用域:在代码的什么范围可以访问这个变量
- 对于本地变量,这两个问题的答案是统一的:大括号内的块
8.数组
<1>.数组的定义
-
<类型>变量名称[元素数量];
-
int grades[100]
-
double weight[20]
-
-
元素数量必须是整数;
<2>.数组计数
#include <stdio.h>
int main()
{
int x;
int count[10]={0};
int i;
// for(i=0;i<10;i++){
// count[i]=0;
// }
scanf("%d",&x);
while(x!=-1){
if(x>=0&&x<=9){
count[x]++;
}
scanf("%d",&x);
}
for(i=0;i<10;i++){
printf("%d:%d\n",i,count[i]);
}
return 0;
}
<3>.数组的集成初始化