目录
一.数据结构
1. if语句
a,else是与最接近的if且没有else的语句匹配。
b,交换的程序写法:t = x;x=y;y=t;
if(a<b){t=a;a=b;b=t;}
注意,else是可由可没有的,有的if它可以带else,有的if它不带else,如果带else情况的话它就是与它最近的那个而且没有else语句的那个if来给它做匹配
在交换代码里面你可以给它加一个条件,如果a<b的话,则交换ab的值,否则就不交换ab的值。a<b就交换ab的值,说明a里面始终放的是一个较大的值。
c,单独的if语句:if(a<b) t = a;
标准的if语句:if(a<b) min = a;
else min = b;
如果这个条件成立,那么最小值等于a,如果这个条件不成立,那么最小值就等于b。
嵌套的if语句:if(a<b)
if(b>c) printf("ok!");
嵌套的if语句,它就是如果这个语句成立的话,下面再判断,比如说如果a<b,下面再判断b是不是大于c,如果大于c的话就输出ok,否则就不输出。
但这样的话这个第一个的if语句就不成立的话,那第二个语句就不要执行了,因为它嵌套在它的内部,如果你外面的这个它都不成立的话,他就没有机会进到内部来进行它的程序。
多选一的if语句 if(a= =t) printf("a");
elae if(b = =t)printf("b");
else if(c = = t)printf("c");
else printf("d");
例子
int a=1,b=0;
if(! a) b++; //判断非a的时候,它b++ //假的不执行
else if(a= =0) //如果成立的话,则执行下面这个语句 //假的不执行。
if(a)b+=2; //属于else if的嵌套if语句,不执行。
else b+=3; //b = b+3 //if—else—if语句没有一个正确的,就执行else语句
求b的值 b = 3
2.条件表达式
表达式1?表达式:表达式3
第一个表达式后面接了一个问号,意为第一个表达式是否成立,如果成立的话,选择冒号前面的表达式,如果不成立的话,则选择冒号后面的这个表达式
1.口诀:真前假后
2.注意是当表达式1的数值是非0时;才采用表达式2的数值做为整个运算结果;
当表达式1的数值为0时,就用表达式3的数值做为整个的结果。
例子
int a = 1,b=2,c=3,d=4,e=5;
k=a<b?c:d 求k的数值是多少 k=3
k=d>e?d:e 求k的数值是多少 k=5
3.switch语句
1.执行的流程一定要看懂!
2.注意有break 和 没有break的区别
3.switch只可以和break一起用,不可以和continue用
4.switch(x) x:是整型常量,字符型常量,枚举型数据
{case 1; ..., case后面的一定是常量,不是变量
case 2;....,}
1.没有break时候,只要有一个case匹配了,剩下的都要执行,有break则是直接跳出了switch语句
2. x可以是1 2 3 4或者是a b c d,枚举型数据可以是Monday,Tuesday这些列举型的数据
二.循环结构
1.三种循环结构
a.for(); while(); do—while()三种。
b,for循环当中必须是两个分号,千万不要忘记。
c.写程序的时候一定要注意。循环一定要有结束的条件,否则成了死循环。
d.do—while()循环的最后一个while();的分号一定不能够丢,do—while循环是至少执行一次循环。
2.break 和 continue的差别
记忆方式:
break;是打破的意思,(破了整个循环)所以看见break就退出整个一层循环。
continue; 是继续的意思了,(继续循环运算),但是要结束本次循环,就是循环体内剩下的语句不再执行,跳到循环开始,然后判断循环条件,进行新一轮的循环。
3.嵌套循环
就是有循环里面还有循环,这种比较复杂,要一层一层一步一步耐心的计算,一般记住两层是处理二维数组的。
在二维数组里面会用到,一个是外层循环控制行,内层循环控制列。二维数组的话,要用到for循环的嵌套形式,来进行一个输入和读取。
在冒泡排序里面也i用到了一个嵌套循环。
4.每行输出五个的写法
for(i = 0;i<100;i++)
{ printf("%d",i);
if ( (i+1)%5==0)printf(''\n") );
如果i是从1开始的话,就是if((i%5==0)printf("\n"););}
首先我们要先写一个循环,放(i = 0;i<100;i++),在这个循环里面,我们执行的是printf("%d",i);,然后判断一下,因为你要控制五个作为一行输出,判断一下i%5==0,判断一下这个a+1是不是五的倍数。因为我们这里的i是从零开始的,所以第一行的数据应该是从0到4,最后一个数字是4,这个时候就要用i加一,看i+1是不是五的倍数,那就输出一个换行,这样的话就保证每输出五个就换行。如果i是从一开始的话,那这个地方就直接i除以五取余数 ,看它是不是五五的倍数,如果i是五的倍数的话,那就直接输出换行,这样就实现了一个每五个输出一行的结果。
5.如何整除一个数
i%5 ==0; 表示整除5
i%2 ==0; 表示整除2,同时表示是偶数!
6.输入123,输出321逆序输出数据
int i = 123;
while(i! =0);
{
printf("%d",i%10);
i = i/10;} // 除号两边都是整数的话,它最后的结果一定是整数形式。
7. for只管后面一个语句
int i=3;
for(i=3;i<6;i++);
printf("%d",i);
printf("#"); 请问最终打印几个#号
for其实只管它后面的一个语句,如果你要想管两个语句的话,需要加上一个花括号,就可以管住多个语句,如果没有加花括号的话,默认它都只管着后面的这一个语句。
#号只打印了一次,因为这个#号没有在这个循环体内。
如果加了一个花括号的话,那就是输出3,#,输出4,#,输出5,#,然后循环结束。
八.不停的输入,直到遇到#停止输入!
while(x=getchar()!='#')
getchar是用来控制从键盘上获得一个字符的指令,如果x=得到的不是#的话就继续,一旦它输入的这个符号是#号,就结束了
三.函数
1.函数:是具有一定功能的一个程序块。是c语言的基本组成单位。
2.函数的定义:[函数类型]函数名(形式参数)
函数不可以嵌套定义。但可以嵌套调用。
3.函数名缺少返回类型,默认为int。
4,c语言由函数组成,但有且仅有一个main函数!是程序运行的开始!
例子 判断一个数是否为质数
我们先看看这段代码
void fun(int a) //输入一个整形a,判断它是不是质数
{
for (i = 2;i<a<2;i++)
if(a%i==0)
printf("不是质数");
break;
printf("是质数");
}
第一个·for循环从二开始,因为质数他得定义是不可以被一和它之外的其他所有数整除,所以说我们i是从二开始判断,然后判断到二分之a就结束了。因为他如果到二分之a前面没有他的公因式的话,后面一定也没有。然后每一次循环i要实现一次加一,然后在里面判断如果a%i==0,就不是质数,然后break循环结束所有的循环 ,否则就打印出是质数。
在这里最关键的问题就在于它的最后一句,他没有用if else 来进行区分,所以说你不管前面执不执行,最后的printf一定会输出的。所以说这个的代码是错误的。
让我们来看看正确的
#include<stdio.h>
int fun(int);
int main(void)
{
int a;
printf("请输入一个数字\n");
scanf("%d", &a);
if(fun(a)==1)
printf("此数字是质数");
else
printf("此数字不是质数");
return 0;
}
int fun (int a)
{
int i;
for(i=2;i<a;i++)
{
if(a%i ==0)
return 0;
}
if(a ==1)
{
return 0;
}
return 1;
}
5.函数的参数可以是常量,变量,表达式,甚至是函数调用。
add(int a, int y){return 0;}
main ()
{ int sum ;
sum = /*1*/ add(/*2*/ add(7,8),9);
} 问sum的值 值为 24
在这里我们定义了一个函数叫add,这里面函数的类型缺失了,默认为整形int型数据定义一个add,它实现的功能是能返回的值是实现两个变量的相加,这个地方x和y它就是一个变量,在这个时候a的函数他的一个参数就是一个变量,但是我们也可以是常量,比如说在主函数里面对这个add函数进行调用的时候,我们第二个参数选择了是九。还可以是表达式,比如说你在这个返回值的时候x+y因为有加号的存在,所以它就是一个表达式。甚至是函数的调用,比如说这个/*1*/add,对于这个函数来讲,它的第一个参数又调用了它本身。
这样的话它实现的功能就是先执行里面的这个add,7+8等于15,然后在实现外面的这个add,15+9,最后的值就是24.
6.函数的参数,返回值
main ()
{
int a = 5,b = 6,c; //a,b是实际参数
c = add(a,b); //调用函数
printf("%d",c);
}
int add(int x,int y) //被调用函数 ,x,y是形式参数,返回值为int型
{
int z;
z =x+y;
return z; //z就是这个add函数计算后得到的结果,就是函数返回给主函数的返回值
}
在c语言里形参不可以向实参传递,所以说参数的传递只能是从实参向形象来传递
程序是从上往下顺序执行,当碰到了函数add后,把a,b的数值传给调用函数,程序中断等待返回数值。当得到了返回数值后,在顺序的往下执行。
6. 一定要注意参数之间的传递
实参和形参之间 传数值,和传地址的差别。
传数值的话,形参的变化不会改变实参的变化。
传地址的话,形参的变化就会有可能改变实参的变化。
7.掌握库函数
a,库函数时已经写好了函数,放在了仓库中,我们只需要如何去使用就可以了!
b,以下这些库函数经常考到,
ads(),sqrt(),fabs(),pow(),sin()
其中abs是整数取绝对值,fabs是是小数取绝对值,sqrt是开平方根,pow它实现的是二的三次方。pow(2,3)这样来表示,sin()就是三角函数
四.指针
指针变量的本质是用来放地址,而一般的变量是放数值的。
1.指针的定义(两种形式)
1.int x=3; int *p=&x
2.int x; int *p;
x =3; p=&x
int*p中 *p 和p的差别:简单说*p是数值,p是地址!
*p可以当做变量来用;*的作用是取后面地址p里面的数值
p是当作地址来使用的。可以用在scanf函数中: scanf'("%d".p);
*p++ 是地址会发生变化。 口诀 :取当前值,然后在移动地址!
(*p)++ 是数值会发生变化。 口诀:取当前值。然后再使数值增加1
例子
int*p ,a[]={1,3,5,7,9};
p =a; //把这个数组的第一个元素的地址赋值给p。
请问*p++和(*p)++的数值分别为多少
*p++; 这个本身的数值为1。 由于使地址会增加一,所以指针指向数值3了
(*p)++; 这个本身的数值为1。由于有个++表示数值会增加,指针不移动,但数值1由于自加了一次变成了2.。
2.二级指针
*p:一级指针:存放变量的地址。
**q : 二级指针:存放一级指针的地址。
常考题目: int x=7;
int*p=&x; **q=p;
问:*p为多少? *q为多少? **q为多少? 7 p 7
对于二级指针可以把*q看成一个整体前面加上了*表示取数值,所以*q存放的是一级指针的地址
**q = &x的写法可以吗 错 因为二级指针:存放一级指针的地址