02_条件与循环和运算符

 

运算符优先级表

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

 

()

圆括号

(表达式)/函数名(形参表)

 

.

成员选择(对象)

对象.成员名

 

->

成员选择(指针)

对象指针->成员名

 

2

-

负号运算符

-表达式

右到左

单目运算符

(类型)

强制类型转换

(数据类型)表达式

 

++

自增运算符

++变量名/变量名++

单目运算符

--

自减运算符

--变量名/变量名--

单目运算符

*

取值运算符

*指针变量

单目运算符

&

取地址运算符

&变量名

单目运算符

!

逻辑非运算符

!表达式

单目运算符

~

按位取反运算符

~表达式

单目运算符

sizeof

长度运算符

sizeof(表达式)

 

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

双目运算符

%

余数(取模)

整型表达式/整型表达式

双目运算符

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

双目运算符

5

<< 

左移

变量<<表达式

左到右

双目运算符

>> 

右移

变量>>表达式

双目运算符

6

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

双目运算符

小于

表达式<表达式

双目运算符

<=

小于等于

表达式<=表达式

双目运算符

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

双目运算符

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

表达式1? 表达式2: 表达式3

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

 

/=

除后赋值

变量/=表达式

 

*=

乘后赋值

变量*=表达式

 

%=

取模后赋值

变量%=表达式

 

+=

加后赋值

变量+=表达式

 

-=

减后赋值

变量-=表达式

 

<<=

左移后赋值

变量<<=表达式

 

>>=

右移后赋值

变量>>=表达式

 

&=

按位与后赋值

变量&=表达式

 

^=

按位异或后赋值

变量^=表达式

 

|=

按位或后赋值

变量|=表达式

 

15

,

逗号运算符

表达式,表达式,…

左到右

从左向右顺序运算

 

 基本的if语句

              if (条件成立) { 则执行此语句 }; //

     if (1) printf("条件成立");

认识算术比较

     小于 <

     大于 >

     等于 ==

关系运算符表达式

    5>10 //不成立 0

    1>0  //成立 1

    3==5 //

    5<1 //

运算符表达式用法

      int 明=22,玲=23;

           printf("明%d岁,玲%d岁,",明,玲);

           if (明>玲) printf("明比玲大%d 岁\n",abs(明-玲));

                if (明<玲) printf("明比玲小%d 岁\n",abs(明-玲));

#include <stdio.h>
#include <math.h>
int  main(void) //main是程序入口
  {
     
     
    int 明=129,玲=29;
    printf("明%d岁,玲%d岁,",明,玲);
    if (明>玲) 
    {
        printf("明比玲大%d 岁\n",abs(明-玲));
    }
    if (明<玲)
    {
        printf("明比玲小%d 岁\n",abs(明-玲));
    }
    if (明==玲)
    {
        
        printf("明与玲一样大\n");
    }
      
    getchar();
    return 0;  //返回一个0
  }//一段程序结束
View Code
明129岁,玲29岁,明比玲大100 岁
View Code

scanf格式化输入

    scanf; %d来格式化

 

if..else扩展语句 

   if (明<=玲)

         {

                  printf("明比玲小%d 岁\n",abs(明-玲));

         }

         if (明>玲)

         {

         printf("明与玲一样大\n");

              }

//等价于下边代码

 

   if (明<=玲)

         {

                  printf("明比玲小%d 岁\n",abs(明-玲));

         }else

         {

         printf("明与玲一样大\n");

              }

在if语句中使用代码块

if (明>玲)

         {

                  printf("明比玲大%d 岁\n",abs(明-玲));         

                  printf("玲比明小一些\n");

              }

 

if语句的嵌套使用

if (明>玲)

         {

                  printf("明比玲大%d 岁\n",abs(明-玲));

                  if ( 明-玲 >10)

                  {

                           printf("明比玲大得多\n");

                  }

         }

 

#include <stdio.h>
#include <math.h>
int  main(void) //main是程序入口
  {
     
     
    int 明=0,玲=0;
    printf("请输入明的年龄:");
    scanf("%d",&明);
    printf("请输入玲的年龄:");
    scanf("%d",&玲);
    getchar();
    printf("明%d岁,玲%d岁,",明,玲);
    if (明<玲)
    {
        printf("\n明比玲小%d 岁\n",abs(明-玲));
    }else

    if (明>玲) 
        {//
            printf("\n明比玲大%d 岁\n",abs(明-玲));
            if (明-玲>20) 
            {
                 printf("\n明比玲大很多\n");
            }
        }else    printf("\n明与玲一样大\n");
    
    
      
    getchar();
    return 0;  //返回一个0
  }//一段程序结束
View Code
请输入明的年龄:1 2
请输入玲的年龄:明1岁,玲2岁,
明比玲小1 岁
View Code

 

 

例:某公司招聘职员,年龄要求:18-30;

 

逻辑运算符 &&

  条件1: 年龄>=18

  条件2: 年龄<=30

  条件1&&条件2 满足要求

   1 && 1=1;

   0 && 1=0;

   1 && 0=0;

   0 && 0=0;

 

  int   age;

逻辑运算符 ||

  条件1: 年龄<18

  条件2: 年龄>30
  条件1 || 条件2 都不满足要求
  1 || 1=1
  0 || 1=1
  1 || 0=1
  0 || 0=0

 

逻辑运算符 !

! (1223)=0;

! (0)=1;

!(条件1 || 条件2)  // 条件1&&条件2



elise if


if (age>=18)

         {

                  if (age<=30)

                  {

               printf("年龄=%d  满足应聘条件YYY\n",age);

                  }else

                  {

           printf("年龄=%d 不满足应聘条件NNN\n",age);

                  }

         }else

         {

      printf("年龄=%d 不满足应聘条件NNN\n",age);

         }

 

#include <stdio.h>
#include <math.h>
int  main(void) //main是程序入口
  {
     
     
    int age=0;
    printf("请输入应聘人的年龄:");
    scanf("%d",&age);
    getchar();
    /*if (age>=18&&age<=30)
    {
        printf("年龄=%d  满足应聘条件YYY\n",age);
    }else
    {
        printf("年龄=%d 不满足应聘条件NNN\n",age);
    }*/
    /*if (! (age<18||age>30) )
    {
        printf("年龄=%d  满足应聘条件YYY\n",age);
    }else
    {
        printf("年龄=%d 不满足应聘条件NNN\n",age);
    }*/
    /*if (age>=18)
    { 
        if (age<=30)
        {
               printf("年龄=%d  满足应聘条件YYY\n",age);
        }else
        {
           printf("年龄=%d 不满足应聘条件NNN\n",age);
        }
    }else
    {
      printf("年龄=%d 不满足应聘条件NNN\n",age);
    }*/
    if (age<18)
    { 
         printf("年龄=%d 不满足应聘条件NNN\n",age);
    }else if(age>30)
    {
         printf("年龄=%d 不满足应聘条件NNN\n",age);
    }else
    {
         printf("年龄=%d  满足应聘条件YYY\n",age);
    }
    
    getchar();  
    getchar();
    return 0;  //返回一个0
  }//一段程序结束
View Code
请输入应聘人的年龄:25
年龄=25  满足应聘条件YYY
View Code

 

 

认识switch格式

 switch(表达式)

 {

   case 常量表达式:

    语句1;

    break;

   case 常量表达式:

    语句2;

    break;

   case 常量表达式:

    语句3;

    break;  

    ................

   default:

   语句n; 

   break;  

  }

.........

 

实例运用:

 假设有一期彩票开奖,数字28赢得一等奖,数字 16赢得二等奖,数字39赢得三等奖,数字138赢得末等奖;

这时要求我们设计一段程序来判断:

 

#include <stdio.h>

#include <math.h>

int  main(void) //main是程序入口

  {

    

    

   int num;

   printf("请输入彩票号码:");

   scanf("%d",&num);

   //if (num==28)

   //{

           // printf("彩票号码为%d,恭喜,你中了一等奖\n",num);

   //}else if (num==16)

   //{

           //  printf("彩票号码为%d,恭喜,你中了二等奖\n",num);

   //}else if (num==39)

   //{

           // printf("彩票号码为%d,恭喜,你中了三等奖\n",num);

   //}else if (num==138)

   //{

           // printf("彩票号码为%d,恭喜,你中了末等奖\n",num);

   //}else

   //{

           // printf("你彩票的号码未中奖...");

   //}

        

   switch(num)

   {

   case 28:

                  {

                           printf("彩票号码为%d,恭喜,你中了一等奖\n",num);

                           break;

                  }

   case 16:

                  {

                           printf("彩票号码为%d,恭喜,你中了二等奖\n",num);

                           break;

                  }

   case 39:

                  {

                           printf("彩票号码为%d,恭喜,你中了三等奖\n",num);

                           break;

                  }

   case 138:

                  {

                           printf("彩票号码为%d,恭喜,你中了末等奖\n",num);

                           break;

                  }

   default:

        printf("你彩票的号码未中奖...");

 

   }

         getchar(); 

         getchar();

         return 0;  //返回一个

  }//一段程序结束

 
View Code
请输入彩票号码:50
你彩票的号码未中奖...
View Code

 

 

认识goto格式

    goto 标签地址:

    一般会配合if语句使用

 

实例运用:

 假设有一期彩票开奖,数字28赢得一等奖,数字 16赢得二等奖,数字39赢得三等奖,数字138赢得末等奖;

这时要求我们设计一段程序来判断:

 

#include <stdio.h>

#include <math.h>

int  main(void) //main是程序入口

  {

    

    

   int num;

  

   printf("请输入彩票号码:");

   scanf("%d",&num);

   if (num==28)

   {

             goto Label1;

   }else if (num==16)

   {

             goto Label2;

            

   }else if (num==39)

   {

             goto Label3;

          

   }else if (num==138)

   {

             goto Label4;

           

   }else

   {

            goto Label5;

   }

        

 

  

         getchar(); 

         getchar();

         return 0;  //返回一个

Label1:

          printf("彩票号码为%d,恭喜,你中了一等奖\n",num);

          goto end;

Label2:

          printf("彩票号码为%d,恭喜,你中了二等奖\n",num);

         goto end;

Label3:

          printf("彩票号码为%d,恭喜,你中了三等奖\n",num);

         goto end;

Label4:

          printf("彩票号码为%d,恭喜,你中了末等奖\n",num);

    goto end;

Label5:

          printf("你彩票的号码未中奖...");

         goto end;

end:

 getchar(); 

 getchar();

 return 0;  //返回一个

  }//一段程序结束
View Code
请输入彩票号码:28
彩票号码为28,恭喜,你中了一等奖
View Code

 

 

认识for循环格式

   1、 for (初值表达式;结束条件;循环表达式)

     {

      语句1;

      语句2;

      ...

      语句n;

     }

     语句b;

     ....

   2、备注

  初值表达式:在执行语句1以前仅执行一次;

  结束条件:  当条件成立后 语句b;

  循环表达式:语句n执行完后就会执行一次循环表达式

实例运用:

   假设有一期彩票开奖,数字28赢得一等奖,数字 16赢得二等奖,数字39赢得三等奖,数字138赢得末等奖;

这时要求我们设计一段程序来判断:

   修改代码,用for循环优化程序.

  

 

#include <stdio.h>
#include <math.h>
void isyes()
{
    int num;
    scanf("%d",&num);
    getchar(); 

    switch(num)
    {
    case 28:
        {
            printf("彩票号码为%d,恭喜,你中了一等奖\n",num);
            break;
        }
    case 16:
        {
            printf("彩票号码为%d,恭喜,你中了二等奖\n",num);
            break;
        }
    case 39:
        {
            printf("彩票号码为%d,恭喜,你中了三等奖\n",num);
            break;
        }
    case 138:
        {
            printf("彩票号码为%d,恭喜,你中了末等奖\n",num);
            break;
        }
    default:
        printf("你彩票的号码未中奖...\n");

    }
}
int  main(void) //main是程序入口
  {
     
     
   
    int i;
   printf("请输入彩票号码:");
   
   
   for (i=0;i<=100;++i)
   {
       //验证是否中奖
       isyes();
    
   }
   
   getchar();
    return 0;  //返回一个0
  }//一段程序结束
View Code
请输入彩票号码:20
你彩票的号码未中奖...
View Code

修改代码,用goto和swich优化程序.

#include <stdio.h>
#include <math.h>
int  main(void) //main是程序入口
  {
     
     
   int num;
   int i=0;
start:
   printf("请输入彩票号码:");
   scanf("%d",&num);
 
    
   switch(num)
   {
   case 28:
        {
            printf("彩票号码为%d,恭喜,你中了一等奖\n",num);
            break;
        }
   case 16:
        {
            printf("彩票号码为%d,恭喜,你中了二等奖\n",num);
            break;
        }
   case 39:
        {
            printf("彩票号码为%d,恭喜,你中了三等奖\n",num);
            break;
        }
   case 138:
        {
            printf("彩票号码为%d,恭喜,你中了末等奖\n",num);
            break;
        }
   default:
        printf("你彩票的号码未中奖...\n");

   }
    getchar();  
    i++;
    if (i<1000) goto start;
    getchar();
    return 0;  //返回一个0
  }//一段程序结束
View Code

 

 

认识while循环格式

   1、 while(循环条件)

     {

      语句1;

      语句2;

      ...

      语句n;

     }

     语句b;

     ....

    for(;条件;)

二、实例运用:

   假设有一期彩票开奖,数字28赢得一等奖,数字 16赢得二等奖,数字39赢得三等奖,数字138赢得末等奖;

这时要求我们设计一段程序来判断:

  1、 修改代码,用while循环优化程序.

#include <stdio.h>
#include <math.h>
void isyes()
{
    int num;
    scanf("%d",&num);
    getchar(); 

    switch(num)
    {
    case 28:
        {
            printf("彩票号码为%d,恭喜,你中了一等奖\n",num);
            break;
        }
    case 16:
        {
            printf("彩票号码为%d,恭喜,你中了二等奖\n",num);
            break;
        }
    case 39:
        {
            printf("彩票号码为%d,恭喜,你中了三等奖\n",num);
            break;
        }
    case 138:
        {
            printf("彩票号码为%d,恭喜,你中了末等奖\n",num);
            break;
        }
    default:
        printf("你彩票的号码未中奖...\n");

    }
}
int  main(void) //main是程序入口
  {
     
     
   
    int i;
   printf("1--100以内能被3整除的数有:\n");
   
   
   //for (i=0;i<=100;++i)
    i=1;
    while(i<=100)
   {
       //验证是否中奖
       //isyes();
       if (i%3==0)
       {
           printf("%2d,",i);
       }
       if (i%10==0)
       {
           printf("\n");
       }
       ++i;//i=i+1;
   }
   
   getchar();
    return 0;  //返回一个0
  }//一段程序结束
View Code
1--100以内能被3整除的数有:
 3, 6, 9,
12,15,18,
21,24,27,30,
33,36,39,
42,45,48,
51,54,57,60,
63,66,69,
72,75,78,
81,84,87,90,
93,96,99,
View Code

 

  2、 找出1至100内能被3整除的数

//郁金香灬外挂技术 www.yjxsoft.net www.yjxsoft.com  QQ150330575

#include <stdio.h>
#include <math.h>
void isyes()
{
    int num;
    scanf("%d",&num);
    getchar(); 

    switch(num)
    {
    case 28:
        {
            printf("彩票号码为%d,恭喜,你中了一等奖\n",num);
            break;
        }
    case 16:
        {
            printf("彩票号码为%d,恭喜,你中了二等奖\n",num);
            break;
        }
    case 39:
        {
            printf("彩票号码为%d,恭喜,你中了三等奖\n",num);
            break;
        }
    case 138:
        {
            printf("彩票号码为%d,恭喜,你中了末等奖\n",num);
            break;
        }
    default:
        printf("你彩票的号码未中奖...\n");

    }
}
int  main(void) //main是程序入口
  {
     
     
   
    int i;
   printf("1--100以内能被3整除的数有:\n");
   
   
   //for (i=0;i<=100;++i)
    i=1;
    while(i<=100)
   {
       //验证是否中奖
       //isyes();
       if (i%3==0)
       {
           printf("%2d,",i);
       }
       if (i%10==0)
       {
           printf("\n");
       }
       ++i;//i=i+1;
   }
   
   getchar();
    return 0;  //返回一个0
  }//一段程序结束
View Code

 

三、while和for的区别比较

while(条件表达式)

  语句是括号里值为1,一直干下去;括号里值为0,停止循还,程序往后执行

  等价于 for(;条件表达式;)

for(循还环处理仅一次;是否满足继续循环条件判断;每一次循环后处理)

{

  A;

}

 B;

 

四、作业

 1、把课程代码里的while循环改变等价的for循环

 2、写一段代码,找出100以内能被5整除的数

#include <stdio.h>
#include <math.h>

     
int  main(void) //main是程序入口
  {
     int i=100;
     while(i){
        if(i%5==0) 
             printf("%d\t",i);
        i--;
         }
    getchar();
    return 0;  //返回一个0
  }//一段程序结束
View Code
100     95      90      85      80      75      70      65      60      55      50      45      40      35      30              25      20      15      10      5
View Code

 

 3、写一段代码,找出100以内所有奇数 

#include <stdio.h>
#include <math.h>

     
int  main(void) //main是程序入口
  {
     int i=100;
     while(i){
        if(i%2) 
             printf("%d\t",i);
        i--;
         }
    getchar();
    return 0;  //返回一个0
  }//一段程序结束
View Code   
99      97      95      93      91      89      87      85      83      81      79      77      75      73      71              69      67      65      63      61      59      57      55      53      51      49      47      45      43              41      39      37      35      33      31      29      27      25      23      21      19      17      15              13      11      9       7       5       3       1
View Code

 

 

认识 循环嵌套

   for (表达式;条件1;表达式)

    {         

       代码段;//可以没有

      for (表达式;条件2;表达式)

          {         

           代码段;//可以没有

           for (表达式;条件3;表达式)

           {         

             代码段;//可以没有

              ....

           }

         }

    }

      

while(条件)

{

  代码段;//可以没有

  while(条件)

    {

       代码段;//可以没有

      while(条件)

      {

       代码段;//可以没有

       ..........      

      }

    }

 

}

 

while(条件)

{

  代码段;//可以没有

  for(表达式;条件;表达式)

    {

       代码段;//可以没有

      while(条件)

      {

       代码段;//可以没有

       ..........      

      }

    }

 

  

 

二、实例运用:

1、n的阶乘问题(n>0,n为整数)

   1*2*3...*n-1*n

   1*2*3*4*5=120

   

#include <stdio.h>

#include <math.h>

void 阶乘(void)

{
         int num=1;

         int n=0;

         int i=1;

         num=n=i=1;

start:
         scanf("%d",&n);

         getchar();

         if(n<=0)

         {
                  printf("输入的值不合法,请重新输入\n");

                  goto start;
         }
         printf("%d的阶乘计算公式如下:\n",n);

         printf("1");
         do
         {
                  num=num*i;

                  if (i>1)

                  {
                           printf("*%d",i);//1*1*2*3
                  }
                  i=i+1;

         }while(i<=n);   

         printf("=%d \n",num);

         //

         return ;
}

 int  main(void) //main是程序入口

  {
           //代码开始
           //while

           for(;1;)//死循环
           {
                    阶乘();
            }

    getchar();

         return 0;  //返回一个

  }//一段程序结束         
View Code
10
10的阶乘计算公式如下:
1*2*3*4*5*6*7*8*9*10=3628800
View Code 

 

2、打印出9*9乘法表如下图格式

#include <stdio.h>
int main(void)
{
    int i,j;
    for (i=1;i<=9;i++)
    {
        for(j=1;j<=i;j++)
        {
            printf("%d*%d=%2d ",i,j,i*j);
        }
        printf("\n");
    }
    getchar();
    return 0;
}
View Code

 

1*1=1  

2*1=2   2*2=4  

3*1=3   3*2=6    3*3=9  

4*1=4   4*2=8    4*3=12   4*4=16  

5*1=5   5*2=10   5*3=15   5*4=20   5*5=25  

6*1=6   6*2=12   6*3=18   6*4=24   6*5=30   6*6=36  

7*1=7   7*2=14   7*3=21   7*4=28   7*5=35   7*6=42   7*7=49  

8*1=8   8*2=16   8*3=24   8*4=32   8*5=40   8*6=48   8*7=56   8*8=64  

9*1=9   9*2=18   9*3=27   9*4=36   9*5=45   9*6=54   9*7=63   9*8=72   9*9=81
View Code

 

认识Break  Continue关键字

 一、 Break作用

直接跳出当前循环层;执行后边的语句;

#include <stdio.h>

int main()
{
    int i;
    for ( i=1;i<=9;i++)

         {
                  printf("for i=%d \n",i);

                  if  (i==3) break;
       }
    return 0;
}
for i=1
for i=2
for i=3
请按任意键继续. . .

 

   

二、Continue关键字

 

结束本轮循环,继续执行新一轮的循环.

#include <stdio.h>


int main()
{
    int i;
    for ( i=1;i<=9;i++)
    {

            printf("for i=%d 1111111111\n",i);

            if  (i>=3) continue;

            printf("fori=%d 2222222222\n",i);
    }
    return 0;
}
View Code
for i=1 1111111111
fori=1 2222222222
for i=2 1111111111
fori=2 2222222222
for i=3 1111111111
for i=4 1111111111
for i=5 1111111111
for i=6 1111111111
for i=7 1111111111
for i=8 1111111111
for i=9 1111111111
请按任意键继续. . .
View Code

 

三、do while 循环里运用

1、找出9*9乘法表内乘积尾数是6的数限3个。

  

#include <stdio.h>


int main()
{
    int i=1,j=1,n=0;

         while(j<=9)

         {      
                  i=1;

                  while(i<=9)

                  {
                           if (i>j) break;

                           //(i*j)%10==6

                          

                           if ((i*j)%10==6)

                           {
                                    printf("%d*%d=%2d ",i,j,i*j);

                                    n++;

                                    if (n>=3)   break;
                           }

                           i++;
                  }

       if (n>=3)        break;

                  printf("\n");

                  j++;

         }
    return 0;
}
View Code
2*3= 6

4*4=16


1*6= 6
 请按任意键继续. . .
View Code

 

 

 

多层循环的强行终止与goto应用

 

 

多层循环的强行中止;

 

goto语句应用

 

实例分析

 

 

 

 

 

一、实例:

 

找出一个各位的乘积与各位的和相等的5位数:

 

12345  i1*i2*i3*i4*i5等于i1+i2+i3+i4+i5

 

i1*i2*i3*i4*i5==i1+i2+i3+i4+i5

 

for (i1=1;i1<=9;i1++) //i1*10000

 

for (i2=1;i2<=9;i2++) //i2*1000

 

for (i3=1;i3<=9;i3++) //i3*100

 

for (i4=1;i4<=9;i4++) //i4*10

 

for (i5=1;i5<=9;i5++) //i5*1

 

 如果 i1*i2*i3*i4*i5==i1+i2+i3+i4+i5 成立

 

{

 

 打印 i1*10000+i2*1000+i3*100+i4*10+i5*1

 

 跳出整个循环

 

 goto endfor;

 

}

 

endfor:

 

 

#include <stdio.h>
int main(void)
{
    int i1,i2,i3,i4,i5;//分别表示万位,千位,百位,十位,个位
    for (i1=1;i1<=9;i1++) //i1*10000
        for (i2=1;i2<=9;i2++) //i2*1000
            for (i3=1;i3<=9;i3++) //i3*100
                for (i4=1;i4<=9;i4++) //i4*10
                    for (i5=1;i5<=9;i5++) //i5*1
                    {
                                if( i1*i2*i3*i4*i5==i1+i2+i3+i4+i5 )
                            {
                                printf("%d \n" ,i1*10000+i2*1000+i3*100+i4*10+i5*1 );
                                    //跳出整个循环
                                goto endfor;
                            }
                    }
endfor:
     
    //B

    getchar();
    getchar();
    return 0;
}
View Code
11125

 

posted @ 2020-05-08 22:26  岁月荏苒¥我心依旧  阅读(178)  评论(0编辑  收藏  举报