C语言作业-熊家旗-第三次作业

239 阅读4分钟

学习笔记

一、运算符

算数运算符

 1. + --- 加
 2.--- 减
 3. * --- 乘
 4. / --- 除
 5. % --- 取余数

关系运算符

 1. > 大于
 2. >= 大于等于
 3. < 小于
 4. <= 小于等于
 5.  != 不等于
 6.  == 等于

逻辑运算符

 1.  !非
 2. && 并且
 3. || 或

赋值运算符

 1.  = 
 2.  += 
 3.  *=
 4.  / =
 5.  -=

一些琐碎的运算符知识

1.自增[或者自减]

  前自增--++i
  后自增--i++

前自增和后自增的异同:

 相同:最终都使i的值加1不同
 不同:前自增整体表达式的值是i1之后的值
       后自增整体表达式的值是i1之前的值

为什么会出现自增

 代码更精练
 自增的速度更快

学习自增要明白的几个问题

 1.我们编程时应该尽量屏蔽掉前自增和后自增的差别
 2.自增表达式最好不要作为一个更大的表达式的一部分来使用
   或者说
   i++和++i单独成一个语句,不要把它作为一个完整复合语句的一部分来使用
   例:
   nt m= i++ + ++i + i +i++;(这样写不但是错的而且还没有意义)
   printf("%d %d %d",i++,++i,i); (同上)

2.三目运算符

格式:

A ? B : c 
等价于
if (A)
    B;
else
    C;

3.逗号表达式

格式: A,B,C,D

功能:从左到右执行

优先级别

算术 >关系>逻辑>赋值

二、除法与取余运算符

微信图片_20211122230815.jpg

微信图片_20211122230900.jpg

三、逻辑运算符

!真 是 假
!假 是 真

真&&真 是 真
真&&假 是 假
假&&假 是 假

真||真 是 真
真||假 是 真
假||假 是 假

C语言对真假的处理

非零是真
零是假

真是1表示
假是0表示

##### 当左边的表达式是假&&时右边不执行
##### 只有当左边的表达式是假||时右边执行

四、流程控制

1.什么是流程控制

程序代码执行的顺序

2.流程控制的顺序

顺序执行、选择执行(某些代码可能执行,也可能不执行,有选择的执行某些代码)、循环执行

3.选择执行: if

  • if的简单用法

    • 格式: if (表达式)

    • 如果表达式为真,执行语句;不成立,不执行。

    • 实操:

QQ截图20211123235057.png

  • if的范围问题

    • if默认只能控制一个语句的执行

    • 实操:

    A语句成立时: QQ截图20211124000012.png A语句不成立时: QQ截图20211123235953.png (B语句一定会执行)

  • if控制多个语句:

    格式:if
        {
         语句A;
         语句B;
        }
    
  • if else的用法

    • 默认控制一个语句
    • 实操:

QQ截图20211124095221.png

  • if ... else if ... else语句

    • 格式:

      if (1)
          A;
      else if (2)
          B;
      else if (3)
          C;
      else 
          D;
      
    • 实操:

QQ截图20211124101745.png

  • C语言对真假的处理 非零是真

零就是假

真用1表示

假用0表示

  • 举例一:求分数的等级 代码:

    #include <stdio.h> int main (void) { float score ;

       printf("请输入您的成绩:");
       scanf("%f", &score);
    
       if ( score > 100)
          printf("做梦!\n");
       else if (score >= 90 && score <= 100)   
          printf("优秀!\n");
       else if (score >= 80 && score <90)
          printf("良好!\n");
       else if (score >= 60 && score < 80)
          printf("及格!\n");
       else
          printf("不及格\n");      
    
       return 0;
     }
    
    • 结果:

QQ截图20211124113810.png

  • 举例二:互换两个数字 代码:

    include <stdio.h>

    int main (void) { int i = 3; int j = 5; int t;

          t = i;
          i = j;
          j = t;
    
          printf("i = %d, j = %d\n", i, j);
    
      return 0;
      }
    

结果:

QQ截图20211124115042.png

  • 举例三:对任意三个数字进行排序 代码:

    # include <stdio.h>
    int main(void>
         int a, b, c;
         int t;
    
     printf ("请输入三个整数;");
     scanf("%d %d %d", &a, &b, &c);
    
     if (a < b)
     {
        t = a;
        a = b;
        b = t;
     }
     if (a < c)
     {
      t = a;
      a = c;
      c = t;
     }
     if (b < c)
     {
         t = b;
         b = c;
         c = t;
     }   
    
     printf("%d %d %d\n",a ,b ,c);
    
      return 0;
     }
    
    • 结果:

QQ截图20211124135450.png

  • if的常见问题解析

    if (表达式1)
      A;
    else if (表达式2)
      B;
    else if (表达式3)
      C;
    else 
      D;
      
      
    
    1. 空语句问题:if()后面不加分号

    2. 即使if...else有多个语句成立,也只会执行表达式1

    3. else后面不能加表达式,除非加if后再加表达式

    4. else (表达式);等价于无意义的语句

4.循环执行

  • 循环的定义

    某些代码会循环执行

  • 分类:for、while、do...while

  • for的简单用法

    • 实操:

QQ截图20211124211317.png

  • for和if的嵌套使用 代码:

    include <stdio.h>

    int main (void) { int i ; int sum = 0;

    for (i=3; i<=100; ++i) { if (i%3 == 0) sum = sum + i; } printf("sum = %d\n", sum);

    return 0; }

    • 实操:

QQ截图20211124233628.png

  • 强制类型转换和求和公式

    • 强制类型转换

      1.格式:(数据类型)(表达式)

      2.功能:包表达式的值强制转换为前面所执行的数据类型

      3.例子:

      int)(4.5+2.2)---6
       (float)(5)---5.000000
       
      

    代码:

      # include <stdio.h>
    
      int main (void)
      {
         int i ;
         float sum = 0;
    
         for (i=3; i<=100; ++i)
         {
           sum = sum + 1 / (float)(i);
         }
         printf("sum = %f\n", sum);
    
         return 0;
      }
    
    • 实操:

QQ截图20211125000627.png

  • 浮点数的存储所带来的问题

    • float和double都不能保证可以精确的存储一个小数

    • 为什么循环中更新的变量不能定义为浮点型

      • 因为浮点型是一种非准确性存储

for和if的嵌套使用的四个习题

1.100以内的奇数和

代码:

 # include <stdio.h>

int main (void)
{
   int i ;
   int sum = 0;

   for (i=3; i<=100; ++i)
   {
     if (i%2 == 1)  
       sum = sum + i;
   }
   printf("sum = %d\n", sum);

   return 0;
 } 
 

实操:

QQ截图20211125003945.png

2.100以内的奇数个数

代码:

 # include <stdio.h>

int main (void)
{
   int i ;
   int sum = 0;

   for (i=1; i<=100; ++i)
   {
     if (i%2 == 1)  
     sum = sum + 1;
   }
   printf("sum = %d\n", sum);

   return 0;
} 

实操:

QQ截图20211125004227.png

3.100以内的奇数的平均值

代码:

# include <stdio.h>

int main (void)
{
   int i ;
   int sum = 0;
   int cnt = 0;
   float avg;

    for (i=1; i<=100; ++i)
   {
     if (i%2 == 1)
     {  
      sum = sum += i;
      ++cnt;
     }
   }
   avg = sum / cnt;
   printf("avg = %f\n", avg);

   return 0;
} 

实操:

QQ截图20211125005529.png

4.100以内的奇数和,再求偶数和

代码:

# include <stdio.h>

int main (void)
{
   int i ;
   int sum1 = 0;
   int sum2 = 0;

    for (i=1; i<=100; ++i)
     if (i%2 == 1)
     {  
      sum1 = sum1 += i;
     }
     else
     {
      sum2 = sum2 += i;   
     }
   printf("奇数和 = %d\n", sum1);
   printf("偶数和 = %d\n", sum2);

   return 0;
}

实操:

QQ截图20211125010424.png

多个for循环的使用

for(123;)
    for(456;)
       AB

整体是两个语句:

1;2;3;是第一个

4;5;6;是第二个

for(123;)
  for(456;)
     {
     AB;
     }

整体上是一个语句

for(789;)
    for(123;)
    {
     AB;
     for(456;)
         C;
    }

总体上是一个语句

实操:

# include <stdio.h>

int main (void)
{
   int i ;
   int j;

    for (i=1; i<=3; ++i)
     {
         printf ("111\n");
         for(j = 0; j < 3; ++j )
         {
             printf("222\n");
             printf("333\n");
         }
        printf("444\n"); 
     }

   return 0;
} 

结果: QQ截图20211125090937.png

while语句

1.执行顺序

格式

while(表达式)
    A;

2.与for相比较

for和while可以相互转换,但for的逻辑性更强,不容易出错。

3.举例:判断回文数

代码:

 int main (void)
{
   int val ;
   int sum;
   int m;
    printf("请输入您要判断的数字: ");
    scanf("%d", &val);

    m = val;
    while (m)
    {
        sum = sum * 10 + m%10;
        m /= 10;
    }
    if (sum == val)
       printf("Yes\n");
    else
       printf("No\n");   

   return 0;
} 
    

实操:

QQ截图20211125095402.png

4.do...while语句

格式:

do
{
     A;
} while (表达式);

主要用于人机交互

并不等价于for和while

举例:一元二次方程

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

int main (void)
{
   double a, b, c;
   double delta;
   double x1, x2;
   do 
   { 
   printf ("请输入一元二次方程的三个系数:   ");
   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("有两解,x1 = %lf, x2 = %lf\n", x1, x2);
   }
   else if (delta == 0)
   {
       x1 = x2 = (-b) / (2*a);
       printf("有唯一解,x1 = x2 = %lf\n", x1, x2);
   }
   else
   {
       printf("无解\n");
   }
   } while(1);
   return 0;
} 

swith语言

微信图片_20211125210313.jpg 微信图片_20211125210324.jpg 微信图片_20211125210341.jpg 微信图片编辑_20211125211107.jpg

break和continue语句

  • break如果用于循环是用于终止循环;

    break如果用于switch,则是用于终止switch;

    break不能直接用于if,除非if属于循环内部的一个语句;

    再多层循环中,break只能终止最近的循环;

    再多层switch中,break只能终止最近的switch。

  • continue用于跳过本次循环余下的语句,转去执行其他的语句

五、如何看懂一个程序

分三步: 1.流程 2.每个语句的功能 3.试数

对一些小算法的程序

尝试自己编程解决它,大部分人都自己无法解决如果解沃不了,就看答案 。

关键是把答案看懂,这个要花很大的精力,也是我们学习的重点。

看懂之后尝试首己去修改程序,并且知道修改之后程序的不同输出结果的含义照着答案去敲。

不看答案,自己独立把答案敲出来。

如果程序实在无法彻底理解,就把它背会。

举例:斐波拉契数列

代码:

# include <stdio.h>

int main (void)
{
   int n;
   int f1, f2, f3;
   int i;

   f1 = 1;
   f2 = 2;

   f1 = 1;
   f2 = 2;

   printf("请输入数字: ");
   scanf("%d", &n);

   if (1 == n)
   {
       f3  = 1;
   }
   else if (2 == n)
   {
       f3 = 2;
   }
   else
   {
       for (i=3; i<=n; ++i )
       {
           f3 = f1 + f2;
           f1 = f2;
           f2 = f3;
       }    
   }
   printf("%d\n", f3);
   return 0;
} 

实操:

QQ截图20211125131150.png

六、进制

1.什么叫n进制逢n进一

2.把r进制转成十进制

3.十进制转成r进制

4.不同进制所代表的数值之间的关系

十进制的3981转化化成十六进制是F8D

十进制的3981和十六进制的F8D所代表的本质上都是同一个数

课后作业

5.10第七题

QQ截图20211125224858.png

第十三题

--x

m = n%k

p = (q / p) - a

x = (a + b) / (c*d)

5.11第三题

代码:

# include <stdio.h>

int main (void)
{
   int i;
   int j;
   int k;
   printf("请输入天数: ");
   scanf("%d", &i);
   j = i / 7;
   k = i % 7;
   printf("%d days are %d weeks, %d days.\n", i, j ,k);

   return 0;
} 

QQ截图20211125230139.png

第八题

代码:

# include <stdio.h>

int main (void)
{
   int a, b, x;

   printf("请输入第一个数:");
   scanf("%d", &a);
   printf("请输入第二个数:");
   scanf("%d", &b);

   if (a > 0 && b > 0)
   {
     x = b % a;
     printf("%d", x);
   } 
   else
     printf("程序结束");

   return 0;
} 

QQ截图20211125233229.png

6.16

第五题:

实在看不懂题目的意思,但按答案运行了一遍。

第十二题

代码:

#include<stdio.h>  
int main()
{
    double t;
    double i;                         

    printf("请输入项数:"); 
     while ((scanf ("%lf", &t) == 1) && (t > 0))
    {
        int a = 1;  
        double sum1 = 0, sum2 = 0;          
        for (a = 1.0; a <= t; ++a, i = 0-i)
        {
            sum1 += 1.0 / a;
            sum2 += a*1.0 / a;   
        }
         printf("sum1 = %lf, sum2 = %lf", sum1, sum2);
    }
    printf("结束程序");

    return 0;
}

结果:第二个收敛 QQ截图20211125234153.png

第十八题

代码:

#include<stdio.h> 
int main()
{
    int f;
    int a = 1; 

    for (f = 5; f < 150; ++a)
    {   
        f = 2 * (f - a);
        printf("第 %d 周有 %d 个朋友\n", a, f);
    }

    return 0;
}

结果:

QQ截图20211125234513.png

7.11

第二题

a. number >= 90 && number <100;
b. ch!='q' && ch!='k';
c. number >= 1 && number <= 9 && number != 5;
d. number < 1 || number >9

第10题

代码:

#include<stdio.h> 
int main()
{
    char ch;

    while ((ch = getchar()) != '#')
    {
        if (ch != '\n')
        {
            printf("step 1\n");
            if (ch == 'b')  
               break;  
            else if (ch != 'c')
            {
                if (ch != 'h')
                printf("step 2\n");
                printf("step 3\n");
            }
        }
    }
    printf("Done\n");
    return 0;
}

结果:

QQ截图20211125235003.png