C语言基础学习内容
两个数交换
求一个整数每一位的值
求和
二重循环
一维数组的遍历
遍历:按照一定的顺序,不重不漏的将数组中的每一个元素“找一遍”。
求最大值(打擂台)
二维数组的遍历
字符串的遍历
函数的递归
++(自增运算符)和–(自减运算符)
a++:a = a+1
++a: a= a+1
a–:a = a- 1
–a: a = a-1
a++:先使用a的值,再将a的值加1.
++a: 先将a的值+1,然后再使用a的值
#include<stdio.h>
int main(){
int a = 10;
++a;//a++
printf(“a = %d\n”,a);
return 0;
}
#include<stdio.h>
int main(){
int a = 10;
int b;
// b = a++;//1.赋值 2.++
// 1.b = 10
// 2.a =11
b = ++a;//1.a = 11 2.b=11
//a++:先使用a的值,再将a的值加1.
//++a: 先将a的值+1,然后再使用a的值
printf("a = %d\n",a);
printf("b = %d\n",b);
return 0;
}
不同类型数据间的混合运算
(1)+ - * /运算时的两个数中有一个为float或double,运算结果为double类型。
4+3-int 4.3+3-double 3.2f+2double
(2)如果int类型与float或double类型进行运算,运算结果为double类型。
(3)字符型数据与整型数据进行运算,就是把字符的ascii码与整型数据进行运算。
‘a’+2 =99
例如:
int i=3;float f=2.5f;double d=7.5
10+’a’+if-d/3 (从左到右)
=107+ if-d/3
=107+7.5-d/3
=114.5-d/3
=114.5-2.5 =112.000 double
强制类型转换
#include<stdio.h>
int main(){
float a = 12.845f;
int b;
b = (int)a; //直接抹去小数点后面的值
printf("b = %d\n",b);
return 0;
}
赋值运算符 =
结合顺序:从右向左
```c
#include<stdio.h>
int main(){
// int a,b,c;
// a= b =c =10;
//int a = b =c =10; error
int a=10,b=10,c=10;
//如果没有给变量赋初值,变量的值是未知的
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
return 0;
}
复合运算符:
+= -= *= /= %=
#include<stdio.h>
int main(){
int a = 10;
//a+=3;//a = a +3;
//a-=3;//a = a-3;
//a*=3;//a = a*3;
//a/=3;//a = a/3
a%=3;//a = a%3;
printf("a –[= %d\n",a);
return 0;
}
练习:
int x = 15,求X-=X+X的值()
X = X-(X+X)=15-30=-15
赋值过程中的类型转换
(1)浮点型数据赋值给整型变量,直接舍弃小数部分。
(2)将整型数据赋值给浮点型变量,数值不变。
(3)将double型数据赋值给float变量时,注意数值范围不能溢出。
(4)字符型数据赋值给整型变量,直接将字符的ASCII赋值给整型变量。
#include<stdio.h>
int main(){
//1.浮点型--->整型
float a = 12.35f;
int b;
b = a;
printf("b = %d\n",b);
//2.整型---->浮点型
int c = 12;
double d;
d = c;
printf("d = %f\n",d);
//3.double -float
double e = 12.235678123;
printf("e = %.9f\n",e);
float f;
f = e;
printf("f = %.9f\n",f);
//4.char -->int
char g = 97;
int h;
h = g;
printf("h = %d\n",h);
//5.int-->char
int i = 289;
char j;
j = i;
printf("j = %d\n",j);
return 0;
}
总结printf()
scanf() //输入
#include<stdio.h>
int main(){
//
int a;
scanf(",a=%d",&a);//输入格式 ,变量的地址
//&取地址符
//通过键盘输入数据到变量地址对应的空间
//输入的时候必须严格按照输入格式输入
printf("a = %d\n",a);
return 0;
}
特例1
#include<stdio.h>
int main(){
int a,b,c;
//输入数值 format: "%d%d%d"
//加:空格 回车 tab
scanf("%d%d%d",&a,&b,&c);
printf("a = %d\n",a);
printf("b = %d\n",b);
printf("c = %d\n",c);
return 0;
}
特例2
#include<stdio.h>
int main(){
char a,b,c;
//输入字符 format: "%c%c%c"
//字符和字符直接要紧紧的挨在一起输入。
scanf("%c%c%c",&a,&b,&c);
printf("a = %c\n",a);
printf("b = %c\n",b);
printf("c = %c\n",c);
return 0;
}
特例3
#include<stdio.h>
int main(){
double a;
//输入格式 float--->%f
//输入格式 double--->%lf
scanf("%lf",&a);
printf("a = %f",a);
return 0;
}
特例4
#include<stdio.h>
int main(){
int x,y;
scanf("%d%3d",&x,&y);//1234 56789
printf("x = %d,y=%d",x,y);
return 0;
}
字符输入输出函数putchar() getchar()
1.putchar();-输出
#include<stdio.h> //01
int main(){
int a = '\101';
printf("a = %c\n",a);
putchar(a);
putchar('\n');
putchar('\x41');
putchar('a'+3);
return 0;
}
2.getchar()
#include<stdio.h> //01
int main(){
char a,b,c;
// scanf("%c",&a);
a = getchar();
b = getchar();
c = getchar();
printf("%c%c%c",a,b,c);
return 0;
}
例题:
输入三角形的三条边,求三角形的面积。
#include<stdio.h>
#include<math.h>
int main(){
double a,b,c;
scanf("%lf%lf%lf",&a,&b,&c);
double s = (a+b+c)/2;
double area;
area = sqrt(s*(s-a)*(s-b)*(s-c));
printf("area = %f",area);
return 0;
}
2.求解一元二次方程。
#include<stdio.h>
#include<math.h>
int main(){
float a,b,c;
scanf("%f%f%f",&a,&b,&c);
float x1,x2;
x1 = (-b+sqrt(b*b-4*a*c))/(2*a);
x2 = (-b-sqrt(b*b-4*a*c))/(2*a);
printf("x1 = %f,x2 = %f",x1,x2);
return 0;
}
输入一个大写字母,将大写字母转换为小写字母。
A-65 a-97 ‘A’+32=’a’
#include<stdio.h>
#include<math.h>
int main(){
char c1;//大写
char c2;//小写
c1=getchar();
c2 = c1+32;
putchar(c2);
return 0;
}
第四章 选择结构if switch
1.关系运算 > < >= <= == !=
作用:判断关系运算符左右两边的表达式是否满足条件。
5>6–否(0)
5>=5-是(1)
优先级:
算术运算符>关系运算符>赋值运算符
关系运算内部:
(> < >= <=)>(== !=)
#include<stdio.h>
int main(){
int a=5,b=6,c=2;
printf("%d\n",a+b>b);//1.11>b
printf("%d\n",a+b!=b+'a');//1.11!=103
printf("%d\n",a+b>b>a==b-a);
//1.11>b>a==1
//2.1>a==1
//3.0==1
printf("%d\n",b>a+b>a!=b-a>1);
//1.b>11>a!=1>1
//2.0>a!=1>1
//3.0!=0
return 0;
}
逻辑运算符:&&(与)||(或) !(非)
与运算:a&&b-如果a和b同时为真(满足),结果为真(是),如果有一个为假(不是)结果为假。
1&&1=1 1&&0=0 0&&1=0 0&&0=0
5&&-2=1
注意:C语言中,非0数表示真,0表示假。
或运算:a||b-如果a或b为真(满足),结果为真(是),如果a和b同时为假,结果为假。
1||1=1 1||0=1 0||1=1 0||0=0
-9||7=1
非运算:!a-如果a为真,!a为假;如果a
为假,!a为真。
!1=0 !0=1 !-1=0
优先级:
!(非)>算术运算符>关系运算符>&&和||>赋值运算符
赋值运算符:从右向左
算术运算符 关系运算符 逻辑运算符:从左到右
1.!(2)+2-1&&4+2/2
2.0+2-1&&4+1
3.1&&5=1
#include<stdio.h>
int main(){
int a=1,b=2,c=5,d=-1;
printf("%d\n",a>b+1||b+d==a&&c-5);
//1. 1>3||1==1&&0
//2.0||1&&0
//3.1&&0=0
printf("%d\n",5>3&&8<4-!0);
//1.5>3&&8<4-1
//2.5>3&&8<3
//3.1&&0=0
return 0;
}
逻辑运算特性:
b =9;
注意:存在a&&b,a如果为0(假),&&号后面的b,不执行。
存在a||b,a如果为1(真),||号后面的b,不执行。
if语句
if(只要是能返回1或0){//判断是否满足条件
}
例:定义两个整数,按照由小到大的顺序输出。
#include<stdio.h>
int main(){
//1.小 大 按原样输出
//2.大 小 交换输出
int a,b,t;
scanf("%d%d",&a,&b);
if(a>b){
//10>2
//a和b交换
t = a;
a = b;
b = t;
}
printf("%d %d",a,b);
return 0;
}
例题:输入一个年份,判断这个年份是否是闰年?
int year
能被4整除并且不能被100整除或能被400整除
(year%40&&year%100!=0)||year%4000
#include<stdio.h>
int main(){
int year;
scanf("%d",&year);
if((year%4==0&&year%100!=0)||year%400==0){
printf("是闰年!");
} else{
printf("不是闰年!");
}
return 0;
}
另
#include<stdio.h>
int main(){
int year;
scanf("%d",&year);
if((year%4==0&&year%100!=0)||year%400==0)
printf("是闰年!");
else
printf("不是闰年!");
return 0;
}
注意:如果if或else后只有一句话或一个不可分割的整体,{}可以省略。
#include<stdio.h>
int main(){
int a = 10;
int b = 5;
if(a<5)
b = a+2;
a = b+1;
printf("%d,%d",a,b);
return 0;
}
#include<stdio.h>
int main(){
double x,y;
scanf("%lf",&x);
if(x<1)
y = x;
else if(x>=1&&x<10)
y = 2*x-1;
else if(x>=10)
y = 3*x-11;
printf("y = %f",y);
return 0;
}
条件表达式(三目运算)
形式:表达式1?表达式2:表达式3
简洁的if…else语句
步骤:如果表达式1为真,执行表达式2;如果表达式1为假,执行表达式3.
例如:给定两个整数,输出最大值。
#include<stdio.h>
int main(){
int a =10;
int b = 20;
int max;
//方法一
// if(a>b){
// max = a;
// } else{
// max = b;
// }
//方法二
// max=a>b?a:b;
//方法三
// a>b?max=a:max=b;
// printf("max=%d",max);
//方法四
a>b?printf("%d",a):printf("%d",b);
return 0;
}
例题:输入一个字符,判断它是否为大写字母,如果是大写字母,转换为小写,如果不是大写字母,则不转换。
#include<stdio.h>
int main(){
//输入一个字符,判断它是否为大写字母,
//如果是大写字母,转换为小写,
//如果不是大写字母,则不转换。
char ch;
ch = getchar();//scanf("%c",&ch);
// if(ch>='A'&&ch<='Z'){
// ch = ch +32;
// }
// ch = ch>='A'&&ch<='Z'?ch+32:ch;
ch>='A'&&ch<='Z'?putchar(ch+32):putchar(ch);
//putchar(ch);
return 0;
}
switch语句
switch(表达式(整型char)){
case 常量:语句
case 常量:语句
case 常量:语句
case 常量:语句
…
default:语句 //可以省略
}
语句结构中的“表达式”的类型为整型(包括char);default语句可以省略;各case标号出现的次序不影响程序的结果每个case后的标号应不相同。多个case标号后可以共用一组执行语句。
例题:用户输入成绩的等级,输出相应的成绩范围。如:输入A,输出85-100;输入B输出70-84;输入C输出60-69;输入D输出59-0.
#include<stdio.h>
int main(){
//
char grade;
grade = getchar();
//如果switch中省略掉break;就会从第一个符合条件
//的语句开始执行,直到switch语句执行完成。
switch(grade){
//整型
case 'A':printf("100-85\n");break;//跳出
case 'B':printf("84-70\n");break ;
case 'C':printf("69-60\n");break ;
case 'D':printf("59-0\n");break ;
default:printf("输入成绩错误!");
}
return 0;
}
典型例题:
输入一个5位数,求出每一位数的值。
#include<stdio.h>
int main(){
int a;
scanf("%d",&a);
int ten_thou,thou,hun,ten,indiv;
ten_thou = a/10000;//万
thou = a%10000/1000;//千
hun = a%10000%1000/100;//百
ten = a%10000%1000%100/10;//十
indiv = a%10000%1000%100%10;//个
printf("ten_thou=%d\n",ten_thou);
printf("thou=%d\n",thou);
printf("hun=%d\n",hun);
printf("ten=%d\n",ten);
printf("indiv =%d\n",indiv);
return 0;
}
输入一个三位整数,判断这个三位数是否是水仙花数。如果153=111+555+333,就是水仙花数。
#include<stdio.h>
int main(){
int num;
scanf("%d",&num);
int b,s,g;
b = num/100;
s = num%100/10;
g = num%100%10;
if(num==b*b*b+s*s*s+g*g*g) printf("yes!");
else printf("No!");
return 0;
}
例题:求一元二次方程的解。
注意:两个整数比较是否相等是可以用==,;例如22 a3.
两个浮点数比较是否相等时,千万别使用==。
#include<stdio.h>
#include<math.h>
int main(){
double a,b,c;
scanf("%lf%lf%lf",&a,&b,&c);
double disc = b*b-4*a*c;//double 0.0000001
double x1,x2;
if(fabs(disc)<=1e-6){
//0.00000001 0.00000000000001
printf("有两个相等的解:%f\n",-b/(2*a));
}
else if(disc>0){
x1 = (-b+sqrt(disc))/(2*a);
x2 = (-b-sqrt(disc))/(2*a);
printf("x1=%f,x2=%f\n",x1,x2);
}else{
double p,q;
p = -b/(2*a);
q = sqrt(-disc)/(2*a);
printf("x1=%f+%fi\n",p,q);
printf("x2=%f-%fi\n",p,q);
}
return 0;
}
输入一个百分制成绩,要求输出‘A’,‘B’,‘C’,‘D’,‘E’。例如:100-90分输出A,89-80输出B,70-79输出C,60-69输出D,59-0输出E。(int)78.5/10=7 (int)75.3/10
switch结构 与 if…else if…else if…else结构等价。
#include<stdio.h>
int main(){
float score;
scanf("%f",&score);
if(score>=90&&score<=100)printf("A");
else if(score>=80&&score<=89)printf("B");
else if(score>=70&&score<=79)printf("C");
else if(score>=60&&score<=69)printf("D");
else printf("E");
return 0;
}
#include<stdio.h>
int main(){
float score;
scanf("%f",&score);
switch((int)score/10){
//100-0
case 10:
case 9:printf("A");break;
case 8:printf("B");break;
case 7:printf("C");break;
case 6:printf("D");break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:printf("E");break;
}
return 0;
}
第五章 循环结构
知识点:while for break continue 双重循环
while循环
循环:做重复的事情。
while(循环条件:返回0或1的表达式){
//循环体
}
循环条件为真,就执行循环体,循环条件为假,跳出循环体。
#include<stdio.h>
int main(){
int i =1;//循环次数
while(i<=20){
//循环体
printf("helloword\n");
i++;
}
return 0;
}
例如:1+2+3+4+….+100
#include<stdio.h>
int main(){
int sum = 0;//空瓶子
int i=1;
while(i<=100){
sum = sum +i;
i++;
}
printf("%d",sum);
return 0;
}
注意:循环体中如果只有一句话或一个整体,{}可以省略。
do….while循环
do{
//循环体
}while(循环条件);
#include<stdio.h>
int main(){
int sum = 0;
int i=1;
do{
sum = sum +i;
i++;
}while(i<=100);
printf("%d",sum);
return 0;
}
注意:while和do…while是等价的。
注意:while和do…while的区别:while语句是先进行循环条件的判断,再执行循环体。do…while先无条件执行一次循环体,再进行循环条件的判断。
#include<stdio.h>
int main(){
int i =1;
int a=10;
while(i<1){
//1<1--->0
a = 20;
i++;
}
printf("a=%d",a);
return 0;
}
练习:
for语句
一般形式:
for(初始值;循环条件;循环增(减)量)
{
//循环体
}
例题:1+2+3++….100
注意:while和for等价的。
如果明确了循环的范围,使用for语句。
如果循环范围不明确,使用while语句。
#include<stdio.h>
int main(){
int sum;
int i;
for(sum=0,i=1;i<=100;++i)
{
sum = sum+i;//sum+=i
}
printf("%d",sum);
return 0;
}
注意:循环体中如果只有一句话或一个整体,{}可以省略。
for循环的几种形式:
初值表达式可以为空,但;不能省略。
for(;i<=100;++i)
条件语句可以为空,如果条件语句为空,此循环会无限的执行下去(死循环)。
for(;;++i)
循环增量也可以省略,如果省略,程序有可能会无限执行下去。for(;i<=100;)
初值,循环条件,循环增量可以同时省略。
for(;;)相当于while(1){}
初值表达式可以是多个表达式。
for(sum=0,i=1,;i<=100;)
在C99中,初值表达式可以定义变量。C89不可以。for(int i=1;i<=100;)
#include<stdio.h>
int main(){
int b,s,g;
for(int i=100;i<=500;i++){
b = i/100;
s = i%100/10;
g = i%10;//个位 g = i%10
if(i==b*b*b+s*s*s+g*g*g)
printf("%d是水仙花数\n",i);
}
return 0;
}
求斐波那契数列(Fi-bo-na-cci)的前30项。
#include<stdio.h>
int main(){
int f1 = 1;
int f2 = 1;
int f3,f4;
printf("%d\n",f1);
printf("%d\n",f2);
for(int i=3;i<=30;i++){
f3 = f1 +f2;
printf("%d\n",f3);
f1 = f2;
f2 = f3;
}
return 0;
}
break关键字和continue关键字
break关键字:在循环结构中,遇到break关键字跳出整个循环。
#include<stdio.h>
int main(){
for(int i=1;i<=10;i++){
if(i%3==0)break;
printf("%d\n",i);
}
return 0;
}
continue关键字:在循环结构中,遇到continue关键字跳出本次循环。
#include<stdio.h>
int main(){
for(int i=1;i<=10;i++){
if(i%2==0)