#50-60 if知识点
1.易错
#include<stdio.h>
int main(void)
{
float score = 80;
int i = (80 <= score <=100);
//判断句执行同级从左到右,并且结果为0或1
printf("%d",i);
return 0;
}
2.小程序-判断成绩等级
#include <stdio.h>
int main(void)
{
float score;
scanf("%f",&score);
if (score > 100)
printf("做梦!");
else if (score>=80 && score<=100)
printf("优秀!");
else if (score>=60 && score<80)
printf("良好!");
else if (score<=60 && score>=0)
printf("不及格,继续努力!");
else
printf("你考得到再说。");
return 0;
}
3互换两个值
# include <stdio.h>
int main(void)
{
double i, j, m;
scanf("%lf",&i);
scanf("%lf",&j);
m = i; //int i,j
i = j; //i=j,j=i; 这样写是错的,
j = m; //i的值已赋予j,原来的值已
printf("%lf,%lf",i,j);// 不存在!
return 0;
}
3任意三个数进行大到小排列
# include <stdio.h>
int main(void)
{
int a,b,c,i;
scanf("%d%d%d",&a,&b,&c);
if (a < b)
{
i = a;
a = b;
b = i;
}
if (a < c)
{
i = a;
a = c;
c = i;
}
if (b < c)
{
i = b;
b = c;
c = i;
}
printf("%d %d %d", a, b, c);
return 0;
}
-----------60-70循环语句知识点
1计算从1到100的和
# include <stdio.h>
int main(void)
{
int i;
int sum = 0;
for (i = 1; i <= 100; ++i)//++i相当于i=i+1
sum = sum + i; //i+=2相当于i=i+2
/*注意for语句循环的顺序,
i = 1语句只循环一次 */
printf("%d",sum);
return 0;
}
2试手_打印一个直角三角形
# include <stdio.h>
int main(void)
{
int a,b;
for (a = 1; a <= 40; a++)
{ for (b = 1; b <= a; b++)
{
printf("*");
}
printf("\n");
}
return 0;
}
3循环与if嵌套
求1到100之间奇数之和
# include <stdio.h>
int main(void)
{
int a, b;
b = 0;
for (a=1; a<=100; a++)
{
if (a%3 == 0)
{
b = b + a;
}
}
printf("%d",b);
return 0;
}
-----------------70-80
1.数据转换
例:(int)(4.5+6.3)=10
(float)(4+5)=9.00000
计算1+1/2+...+1/100的值
# include <stdio.h>
int main(void)
{
int i;
float sum = 0;//不能是int
for (i=0; i<=100; ++i)
{
sum = sum + 1/(float)(i);
//也可以写成 sum = sum + 1.0/i; //整数与整数相除结果是整数(无小数位)
}
printf("%f",sum);
//float必须用%f输出
return 0;
}
2.三目运算符
# include <stdio.h>
int main(void)
{
int i;
i = (0>2 ? 5 :1);
//三目运算符(A ? B : C)
printf("%d",i);
return 0;
}
3.逗号运算符(A,B,C,D)
# include <stdio.h>
int main(void)
{
int i, j = 2;
i = (j++, ++j, j+2, j-3);
//从左到右执行,
//最终表达式的值是最后一项的值
printf("%d",i);
return 0;
}
----------------80-90
1。while用法
计算1+2+.…+100的值
# include <stdio.h>
int main(void)
{
int i = 1, j = 0;
while(i < 101)
{
j = j + i;
++i;
}
printf("%d",j);
return 0;
}
2.do while用法
格式
do{A
}while(B)
先执行再判断B是否成立,成立的就循环,反之退出
# include <math.h>
# include <stdio.h>
int main(void)
{
double a, b, c, delta;
double x1, x2;
char d;
do{
printf("请输入一元二次方程各个值\n");
printf("a=");
scanf("%lf",&a);
printf("b=");
scanf("%lf",&b);
printf("c=");
scanf("%lf",&c);
delta = b*b - 4*a*c;
if (delta > 0)
{
x1 = (-b + sqrt(delta))/2*a;
x2 = (-b - sqrt(delta))/2*a;
printf("方和程有两个解,\nx1 = %lf,x2 = %lf\n",x1, x2);
}
else if (delta == 0)
{
x1 = -b/2*a;
printf("方程有一个解,x=%lf\n",x1);
}
else
{
printf("方程无解\n");
}
printf("你想断续吗(Y/N)");
scanf(" %c",&d);
}while('Y' == d || 'y' == d);
return 0;
}
------------90-100
1-switch用法
# include <stdio.h>
int main(void)
{
int val;
printf("请输入你要进入的楼层\n");
scanf("%d",&val);
switch (val)
{
case 1:
printf("一层开\n");
break;
case 2:
printf("二层开\n");
break;
default:
printf("没有这一层\n");
break;
}
return 0;
}
2-continue
用于跳过本次循环余下的语句
转去判断是否需要我再次循环
例
for(1;2;3)
{
A;
continue;//B语句会被跳过
B;
}
3-数组的使用
为n个变量连续分配存储空间
所有变量数据类型必须相同
所有变量所占字节大小必须相等
完全初始化
int a[5]={1,2,3,4,5}
不完全初始化
int a[5]={1,2,3}
未被初始化的元素自动为0
int a[5]
不初始化,所有元素是垃圾值
----------错误写法-------------
int a[5];
a[5] = {1,2,3,4,5}
只有在定义的时候才可以整体赋值
-------------------------------
# include <stdio.h>
int main(void)
{
int a[5] = {1,2,3,4,5};
int i;
for(i=0; i<5; ++i)
{
printf("%d\n",a[i]);
}
return 0;
}
4-二维数组
int a[3][4];最大为a[2][3](a[m-1][n-1])
总共是12个元素,可以当作3行4列看待
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
a[i][j] 表示第i+1行j+1列的元素
初始化
int a[3][4] = {1.2.3.4.5.6.7.8.9.10.11.12};
最好选择下面
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7 ,8},
{9, 10, 11, 12}
};
输出二维数组的值
# include <stdio.h>
int main(void)
{
int i, j;
int a[3][4] ={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
for(i=0; i<3; ++i)
{
for(j=0; j<4; ++j)
{
printf("%d\n",a[i][j]);
}
}
return 0;
}
5------倒排列数组------------------------
# include <stdio.h>
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int i, j, b, c;
b = 5;
for (i=0; i<b; ++i)
{
j = a[i];
a[i] = a[b];
a[b] = j;
--b;
}
for(c=0; c<5; ++c)
{
printf("%d\n",a[c]);
}
return 0;
}
---------100-120--------------
1-函数
避免了重复操作
例;
# include <stdio.h>
void max(int x,int y)
{
if (x>y)
{
printf("最大值为%d",x);
}
else
printf("最大值为%d",y);
}
int main(void)
{
int i,j;
printf("请输入需要判断的两个值\n");
scanf("%d %d",&i, &j);
max(i,j);
return 0;
}
2-return意义
3函数的声明
如果把函数写在主函数下面,必须对函数进行声明
因为编译器是从上到下进行编译的
# include <stdio.h>
void f(void);//函数声明,分号不能丢
int main(void)
{
f();
return 0;
}
void f(void)
{
printf("++");
}
4-变量
如果把函数写在主函数下面,必须对函数进行声明
因为编译器是从上到下进行编译的
# include <stdio.h>
void f(void);//函数声明,分号不能丢
int main(void)
{
f();
return 0;
}
void f(void)
{
printf("++");
}
4-变量
素数:只有能被1和本身整除,1不是素数
5,判断一个数是否是素数
# include <stdio.h>
bool suxu(int x)
{
int a;
for (a=2; a<x; ++a)
{
if(x%a == 0)
break;
}
if (a == x)
return true;
else
return false;
}
int main(void)
{
int val;
scanf("%d",&val);
if (suxu(val) == 1)
printf("yes\n");
else
printf("no\n");
return 0;
}
6输出某范围所有素数
# include <stdio.h>
void suxu(int x)
{
int i;
for (i=2; i<x; ++i)
{
if(x%i == 0)
break;
}
if (x ==i)
printf("%d\n",x);
return;
}
void padu(int y)
{
int j;
for(j=2; j<=y;++j)
{
suxu(j);
}
}
int main(void)
{
int a;
printf("请输入范围(0到几)\n");
scanf("%d",&a);
padu(a);
return 0;
}
130-150 指针
1_指针定义
5,判断一个数是否是素数
# include <stdio.h>
bool suxu(int x)
{
int a;
for (a=2; a<x; ++a)
{
if(x%a == 0)
break;
}
if (a == x)
return true;
else
return false;
}
int main(void)
{
int val;
scanf("%d",&val);
if (suxu(val) == 1)
printf("yes\n");
else
printf("no\n");
return 0;
}
6输出某范围所有素数
# include <stdio.h>
void suxu(int x)
{
int i;
for (i=2; i<x; ++i)
{
if(x%i == 0)
break;
}
if (x ==i)
printf("%d\n",x);
return;
}
void padu(int y)
{
int j;
for(j=2; j<=y;++j)
{
suxu(j);
}
}
int main(void)
{
int a;
printf("请输入范围(0到几)\n");
scanf("%d",&a);
padu(a);
return 0;
}
130-150 指针
1_指针定义
2,错误典例
# include <stdio.h>
int main(void)
{
int * p;
int i = 1;
*p = i;/*p指向未知地址,不能随便改变该地址 的值,若该地址的值对系统很重要,改变它就可能引起系统崩溃*/
printf("%d", *p);
}
3互换两个值
# include <stdio.h>
int main(void)
{
int * p;
int i = 1;
*p = i;/*p指向未知地址,不能随便改变该地址 的值,若该地址的值对系统很重要,改变它就可能引起系统崩溃*/
printf("%d", *p);
}
3互换两个值
4,指针与数组
p[i]永远等价于*(p+i)
# include <stdio.h>
void f(int * pArr, int len)
{
pArr[0] = 88;//相当于*pArr=88;
}
int main(void)
{
int a[5]={1,2,3,4,5};
f(a,5);
printf("%d",a[0]);
return 0;
}
# include <stdio.h>
void f(int * pArr, int len)
{
pArr[0] = 88;//相当于*pArr=88;
}
int main(void)
{
int a[5]={1,2,3,4,5};
f(a,5);
printf("%d",a[0]);
return 0;
}
4-用函数输出数组内容
5变量相减
# include <stdio.h>
int main(void)
{
/* int * i;
int * j;
printf("%d",i -j);
return 0;
不同空间的指针变量相减毫无意义
*/
int a[5];
int * p;
int * q;
p = &a[3];
q = a;
printf("p和q所指的单元相隔%d个单元\n",p-q);
printf("p的地址%d,q的地址为%d",p,q);
return 0;
}
6-字节
int main(void)
{
/* int * i;
int * j;
printf("%d",i -j);
return 0;
不同空间的指针变量相减毫无意义
*/
int a[5];
int * p;
int * q;
p = &a[3];
q = a;
printf("p和q所指的单元相隔%d个单元\n",p-q);
printf("p的地址%d,q的地址为%d",p,q);
return 0;
}
6-字节
一个指针变量无论指向什么
指针不同于一般变量,存的是变量的地址,在同一架构下地址长度都是相同的(cpu的最大寻址内存空间),所以不同类型的指针长度都一样
你输出的4 4 4,说明指针长度为4字节
可以记录的地址范围是0x00000000~0xFFFFFFFF,这个范围才是指针变量的值
比如说一个char 1字节,可以存在0x0,也可以位于0xFFFFFFFF
而和char占用1字节还是100字节无关,指针的范围只和机器字和系统有关
比如你的32位系统,指针长度为4,在64位操作系统下那么就都是8了
# include <stdio.h>
int main(void)
{
int * p;
printf("%d",sizeof(p));
}
同时该程序也可以判断机子是32位还是64位
7--传统数组(静态数组)的弊端
指针不同于一般变量,存的是变量的地址,在同一架构下地址长度都是相同的(cpu的最大寻址内存空间),所以不同类型的指针长度都一样
你输出的4 4 4,说明指针长度为4字节
可以记录的地址范围是0x00000000~0xFFFFFFFF,这个范围才是指针变量的值
比如说一个char 1字节,可以存在0x0,也可以位于0xFFFFFFFF
而和char占用1字节还是100字节无关,指针的范围只和机器字和系统有关
比如你的32位系统,指针长度为4,在64位操作系统下那么就都是8了
# include <stdio.h>
int main(void)
{
int * p;
printf("%d",sizeof(p));
}
同时该程序也可以判断机子是32位还是64位
7--传统数组(静态数组)的弊端
8-动态内存
要改变它就必须要分配动态内存
要改变它就必须要分配动态内存
#include <stdio.h>
# include <malloc.h>
int main(void)
{
int *p= (int *)malloc(4);
*p = 4;
printf("%d\n", *p);
free(p);//动态内存释放
printf("%d",*p);
return 0;
}
# include <malloc.h>
int main(void)
{
int *p= (int *)malloc(4);
*p = 4;
printf("%d\n", *p);
free(p);//动态内存释放
printf("%d",*p);
return 0;
}
动态内存与静态内存在比较
静态内存是在系统自动分配,由系统自动释放
静态内存是在栈分配的
动态内存是由程序员手动分配,手动释放
动态内存是在堆分配的
9--多级指针
静态内存是在系统自动分配,由系统自动释放
静态内存是在栈分配的
动态内存是由程序员手动分配,手动释放
动态内存是在堆分配的
9--多级指针
---------------150-180--------------
1-结构体
1-结构体
典例
# include <stdio.h>
struct Student
{
int age;
float score;
char sex;
};
int main(void)
{
struct Student st = {80, 60, 'N'};
struct Student st2;
//定义的同时没有赋值的话后面
//就不可以整体赋值
st2.age = 10;
st2.score = 88;
st2.sex = 'F';
printf("%d %f %c\n",st.age,st.score,st.sex);
printf("%d %f %c\n",st2.age,st2.score,st2.sex);
return 0;
}
2---如何取出结构体中的变量
# include <stdio.h>
struct Student
{
int age;
float score;
char sex;
};
int main(void)
{
struct Student st = {80, 60, 'N'};
struct Student st2;
//定义的同时没有赋值的话后面
//就不可以整体赋值
st2.age = 10;
st2.score = 88;
st2.sex = 'F';
printf("%d %f %c\n",st.age,st.score,st.sex);
printf("%d %f %c\n",st2.age,st2.score,st2.sex);
return 0;
}
2---如何取出结构体中的变量
# include <stdio.h>
struct Student
{
int age;
float score;
char sex;
};
int main(void)
{
//如何取出结构体中的变量
struct Student st = {80, 60, 'N'};
st.age;//第一种
struct Student * pst = &st;
pst ->age =88;//第二种
return 0;
}
重点
pst->age含义:pst所指向的那个结构体变量中的age这个成员
struct Student
{
int age;
float score;
char sex;
};
int main(void)
{
//如何取出结构体中的变量
struct Student st = {80, 60, 'N'};
st.age;//第一种
struct Student * pst = &st;
pst ->age =88;//第二种
return 0;
}
重点
pst->age含义:pst所指向的那个结构体变量中的age这个成员