ZUOYE

136 阅读7分钟

第三次集训

如何使用scanf编写出高质量代码

  1. 使用scanf之前先使用printf提示用户以什么样的方式输出

  2. scanf中尽量不要使用非输出控制符,* 尤其是不要使用\n*

    (p:带%的是输出控制符,不带%的则不是)

  3. 应该编写代码对用户的非法输入做适当处理。

`while ((ch=getchar()) !='\n')` 
​
    `continue;`

运算符

  • 算术运算符

+(加) -(减) *(乘) /(除) %(取余)

  • 关系运算符

(大于) >=(大于等于) <(小于) <=(小于等于) !=(不等于) ==(等于)

  • 逻辑运算符

!(非) &&(并且) ||(或)

  • 赋值运算符

=
+=

*=

/=

-=

优先级别:算数 > 关系 > 逻辑 > 赋值

除法与取模运算符:

  • 除法/的运算结果和运算对象的数据类型有关,两个数都是int,则商就是int,若商为小数,则截取小数部分;被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型,不截取小数部分。

    • 如:16/5 == 3 16/5.0 == 3.20000 -13/4 == -4
    • -13/-3 == -4 3/5 == 0 5/3 == 1
    • 最典型的例题就是求 s =1+1/2+1/3+1/4+1/5......+1/100的值
  • 取余%的运算对象必须是整数,结果是整数后的余数,其余数的符号只与被除数相同。

    • 如: 13%3 == 1 13%-3 == 1 -13%3 == -1
    • -13%23 == -13 3%5 == 3

逻辑运算符

!(非) &&(并且) ||(或)

!真 假

!假 真

真&&假 假

假&&真 假

假&&假 假

真||假 ------- 真

真||真 ------ 真

假||假 ------ 假

C语言对真假的处理:非零既为真,零为假;

&&运算符:当左边的表达式为假时,右边的表达式不执行。

||运算符:当左边的表达式为真时,右边的表达式不执行。

一些琐碎的运算符知识

  • 自增【或者自减】

    • 分类:

      前自增 ---- ++i

      后自增 ---- --i

    • 前自增和后自增的异同:

    ** 相同: 最终都使i的值加1

    不同:前自增整体表达式的值是i加1之后的值

    后自增整体表达式的值是i加1之前的值***

三目运算符

A?B:C

等价于

if (A)

B;

else

C;

*逗号表达式

格式:

(A,B,C,D)

功能

  • 从左到右执行

  • 最终表达式式最后一项的值

*** 为什么会出现自增?***

答:代码更精炼

 自增的速度更快
 
 *p:(i ++ 和 ++i 单独成一个语句,不要把它作为一个完整复合语句的一部分来使用)*

流程控制

1.什么是流程控制?

答:程序代码执行的顺序

2.流程控制的分类

  • 顺序执行
  • 选择执行

    定义

    某些代码可能执行,也可能不执行,有选择的执行某些代码

    分类

if* 1.if最简单的用法

if (表达式) 语句

功能:

如果表达式为真,执行语句

如果表达式为假,语句不执行

2.if的范围问题 1.if(表达式)

语句A;

语句B;

解释:if默认只能控制语句A的执行或不执行

if无法控制语句B的执行或不执行

或者讲:语句B一定会执行

2.if (表达式)

{

语句A;

语句B;

}

此时if可以控制语句A和语句B

由此可见:if默认只能控制一个语句*的执行或不执行

如果想控制多个语句的执行或不执行

就必须把这些语句用{}括起来

3.if....else....的用法

4.if....else....if.....else用法

5.c语言对真假的处理 非零是真 零就是假

真用去表示 假用零表示

6.if举例--求分数的等级

7.if常见问题解析

空语句的问题
        if (3 > 2);//等价于
        if (3 > 2)
             ;//这是一个空语句

2.

       if(表达式1);
           语句A;
       else    
           语句B;//这是错误的

3.

            if(表达式1)
                语句A;
                else ;
                    语句B;//这是正确的
                //等价于
                else 
                    ;
                语句B;

4.

            if(表达式1)
                语句A;
            else if (表达式2)
                语句B;

5.

            if(表达式1)
                语句A;
            else if (表达式2)
                语句B;
            else (表达式3)
                语句C;//错误,正确写法为去掉 (表达式3)或在else (表达式3)之间加if
          

6.
if(表达式1) 语句A; else if (表达式2) ; else (表达式3); 语句C;// 语法正确,但逻辑上是错误的。

3.流程控制为什么重要?

答:流程控制是自学编程的基础,看懂程序的前提!

如何学习一些需要算法的程序(郝老师的学习方法)
  1. 尝试自己去解决它,大部分人都自己无法解决。
  2. 如果解决不了,就看答案。 关键是把答案看懂,这个要花很大的精力,也是学习的重点。
  3. 看懂之后尝试自己去修改程序,并且知道修改之后程序的不同输出结果的意思。
  4. 照着答案去敲代码。
  5. 调试错误。
  6. 不看答案,自己单独把答案敲出来。
  7. 如果彻底无法彻底理解,就把它背会。

Switch

电梯程序放在下面

80e98303c457318eb1be85486ce8922.jpg

ddee4da976de68f011635ce93838888.jpg

7659b4202879b783fec3ef671222895.jpg

循环

循环定义:某些代码会被重复执行

分类:

  • for 1.格式

7659b4202879b783fec3ef671222895.jpg for(1;2;3)

7659b4202879b783fec3ef671222895.jpg 语句A

2.执行的流程【重点】

  • 单个for循环的使用

  • 多个for循环的嵌套使用

    1.for(1;2;3)//1

    for(4;5;6)//2

    A;

    B;

    • 整体是两个语句,1 2 3是第一个语句 ;4是第二个语句
    • for(1;2;3)

      for(4;5;6)

      {

      A;

      B;

      }

      -整体是一个语句

3.范围问题

4.举例子:

1+2+3....+100

1+1/2+1/3+....+1/100

<强制类型转换>

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

功能:将表达式的值强制转化为前面所执行的数据类型

例子:(int)(4.5+2.2) 最终值为6 (float)(5) 最终值为 5.000000


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

    for ( i = 1; i <=100; i++)
    {  
        sum = sum + 1/float(i);//强制转换
        //更简单的写法为	sum = sum + 1.0/i;
    }
    
    printf("1+1/2+1/3……+1/100=%f\n",sum);//float必须用%f输出

    return 0;
}

<浮点数的存储带来的问题>

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

    举例:

        有一个浮点型变量x,如何判断x的值是否是零
    
           if(|x-0.000001)|<0.000001)
    
                是零
    
            else
                不是零
    
  • while

1.执行顺序

格式:

while(表达式)

语句

2.与for的相互转化

for和while可以相互转换

for和while的嵌套

{
   int i,j ,k,m;
   for(i=1;i<=4;i++)
    for(m=1;m<4;m++)
        printf("哈哈\n");
    printf("嘿嘿\n");

    return 0;
}

```int main()
{
   int i,j ,k,m;
   for(i=1;i<=4;i++)
    printf("1111\n");
    for(m=1;m<4;m++)
   {
       printf("333\n");
    printf("222\n");

   }

    return 0;
}


  
  
```for(1;2;3)
  
  等价于
  
  while(2)
  {
  A;
  3;
  }

3.举例

从键盘输入一个数字,如果该数字是回文数,则返回yes

  • do....while(具体应用代码在后面)

  • break和continue

    break

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

  • break如果用于Switch,则是用于终止Switch

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

代码实操

1.程序的选择执行

#include<stdio.h>

int main(void)
{
    if (3)
        printf("AAAA\n"); //会输出
    if (0)
        printf ("BBBB\n");//不会输出
    if (0 == 0);
        printf ("CCCC\n");//会输出

    return 0;


}

42c6d8210237689e49c55a29249cba8.png 2

int main(void)
{   
    float  score;//score 分数

    printf("请输入你的考试成绩:");
    scanf("%f",&score);

    if (score>100)
        printf ("这是做梦!\n");
    else if (score >= 90 && score <= 100)//不能写成90<=score<=100
            printf ("优秀!\n");
    else if (score>=80 && score<90)
            printf ("良好!\n");
    else if (score>=60 && score<80)
            printf ("及格!\n");
    else if (score >= 0 && score < 60)
            printf ("不及格!继续加油\n");
    else 
            printf ("输入的分数过低,进厂吧你!");

    return 0;
}

ac7864cd0f1989c598ce3dda159da44.png 3.for循环1

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

    for (i = 1;i<=4;++i)
        sum = sum + i;

    printf ("sum = %d\n",sum);
    return 0;
}

image.png for循环---奇数求和代码

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

    for (i = 1; i<10;i+=2)//i+=2 等价于 i = i + 2
    {
        sum = sum + i;
    }
    printf ("i = %d",i);
    printf ("sum = %d",sum);

    return 0;
}

image.png

1---100奇数求和

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

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

    return 0;
}

image.png

1到100奇数平均值代码

int main(void)
{
    int i;
    int sum = 0;
    int cnt = 0;
    float avg ;//平均值英文缩写

    for (i = 0; i<=100;++i)
    {
        if (i%2 == 1)
        {
            sum += i;
            ++cnt;

        }

    }

    avg = 1.0*sum / cnt;
    
    printf ("sum = %d",sum);
    printf ("cnt = %d\n",cnt);
    printf("avg = %f\n",avg);


    return 0;
}

image.png 菲波拉契序列程序


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

    f1 = 1;
    f2 = 1;

    printf("请输入您想要求的序列:");
    scanf("%d",&n);

    if (1 == n)
    {
        f3 = 1;    
    }
    else if (2 == n)
    {
        f3 = 1;
    }
    else
    {
        for (i = 3; i<=n; i++)
        {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
        }
    }

    printf("%d",f3);
    return 0;
    
}

image.png 一元二次方程do...while代码

#include<math.h>

int main(void)

{
    double a,b,c;
    double delta;
    double x1,x2;
    char ch;

    do
    {
        printf("请依次输入一元二次方程的三个系数:\n");
        printf("a = ");
        scanf("%lf",&a);

        printf("b = ");
        scanf("%lf",&b);

        printf("c = ");
        scanf("%lf",&c);

        delta=b*b-4*a*c;
        printf("delta=%lf\n",delta);
    
        if(delta > 0)
        {
            x1 = (-b + sqrt(delta))/( a * 2);
            x2 = (-b - sqrt(delta))/( a * 2);
            printf("该方程有两个解, x1 = %lf,x2 = %lf\n",x1,x2);
        }
        else if(delta==0)
        {
            x1=(-b)/(2*a);
            x2=x1;
            printf("该方程有唯一解, x1 = x2 =%lf\n",x1);
        }
        else 
        {
            printf("无解\n");
        }

        printf("继续请输入Y,退出请输入其他值:");
        scanf(" %c", &ch);

    }while('y'==ch || 'Y'==ch);

    return 0;
}

image.png 电梯程序


int main (void)
{
    int val;

    printf ("输入你想进入的楼层:");
    scanf("%d,&val");

    switch (val)
    {
    case 1:
        printf ("1层开!\n");
        break;
    case 2:
        printf ("2层开!\n");
        break;
    case 3:
        printf ("3层开!\n");
        break;
    default:
        printf ("没有盖到这层\n");
        break;
    }
    return 0;

}

image.png *break的应用


int main(void)
{
    int i;

    switch (2)
    {
        case 2:
            printf("嘻嘻嘻嘻\n");
            break;
    }

    for (i=0; i<3; ++i)
    {
        if (3 > 2)
            break;
        printf("嘿嘿嘿嘿\n"); //
    }

    return 0;
}

image.png break的应用

image.png

课后作业

5.10 7

image.png 5.10.13 a. x -= 1;
b. m = n % k;
c. p = q / (b - a);
d. x = (a + b) / (c * d);

5.11.3

#include<stdio.h> 
int main() 
{ 
int a, b, c; 
do { printf("请输入天数:");
scanf("%d",&a); 
b = a%7; c = a/7; 
printf("%d days are %d weeks, %d days\n",a, c, b); }
while (a > 0);
return 0;
}



image.png

5.11.8

#include<stdio.h> 
int main() 
{ 
int a, b, i,j; 

printf("请输入第一个整数:"); 

scanf ("%j",&a); 
do { 
     printf("请再次输入一个整数:"); 
     scanf ("%j",&b); 
     c = b%a; 
     printf("%j\n",i); }
     while (b > 0);
     return 0;
}

\

image.png 6.16 第五题和第十二题实在不会写,看答案也不太理解 第八题

#include<stdio.h>
int main() 
{ 
int friends; 
int i = 1; 

for (friends = 5; friends <= 150; i++) 
{ 
        friends = 2 * (friends - i); 
        printf("R博士第 %d 周有 %d 个朋友\n", g,F ); 
} 
        return 0; 
}

\

image.png

7.11

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

image.png 第10题:

image.png

微信图片_20211125232442.png

#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;
}

```