数据结构 循环结构 函数 指针

目录

一.数据结构

1. if语句

2.条件表达式

3.switch语句

二.循环结构

1.三种循环结构

2.break 和 continue的差别

3.嵌套循环

4.每行输出五个的写法

5.如何整除一个数

6.输入123,输出321逆序输出数据

7. for只管后面一个语句

八.不停的输入,直到遇到#停止输入!

三.函数

5.函数的参数可以是常量,变量,表达式,甚至是函数调用。

6. 一定要注意参数之间的传递

7.掌握库函数

四.指针

1.指针的定义(两种形式)

2.二级指针


一.数据结构

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的写法可以吗 错  因为二级指针:存放一级指针的地址

  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值