C语言集训-黄锐辉-第三次作业

126 阅读4分钟

理论部分

scanf

编写出高质量代码

  • 使用前使用printf提示用户以什么样的方式来输入
  • 尽量不使用非输入控制符,尤其是\n
# include <stdio.h>

int main (void)
{
    int i ;
    
    scanf ("%d", & i);
    
    printf ("i = %d", i);

    
    while ((ch = getchar())  != ' \n' )
        
        continue ;//处理垃圾值
    
    int j ;
    
    scanf ("%d",&j);
    
    printf ("j=%d",j);
       
    return 0;
}

运算符

  • 算数运算符 + - * /(只要被除数与除数有一个有小数位,结果就有小数位) %取余(要求除数与被除数都为整数)

  • 关系运算符 > >= <= !=不等于 ==等于

  • 逻辑运算符 ! 非 &&并且 ||或

    情况结果
    !真
    !假
    真&&真
    真&&假
    假&&真
    假&&假
    真||假
    假||假
    真||真
  • 赋值运算符 = +=(a += 3 --> a = a+3 ) /= -=

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

当&&左边表达式为假时,&&右边的表达式不执行

当||表达式左边为真时,右边表达式也不会执行

c为了追求速度做出这样的规定

# include <stdio.h>
int main (void)
{
    int a = 8;

    int b = 6;

    int m ;

    m = (3>2) && (a=7);  

    printf ("m=%d , a = %d ",m , a  );

    return 0 ;//输出结果m=1 a=7
}

流程控制(重要)

选择执行

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

if

if最简单的用法
# include <stdio.h>//最简单的用法
int main (void)
{
    if ( 3 > 2)
    printf ("AAAA\n");//输出
    if ( 0)
    printf ("BBBB\n");//不会输出 
    if ( 0==0)
    printf ("CCCC\n");//输出
    return 0 ;

}
if的范围问题
# include  <stdio.h>//if默认只能控制一个语句的执行或不执行(范围问题)
int main (void)
{
    if (3<2)
    printf ("aaaa\n");
    printf ("bbbb\n");
    return 0;
} //输出bbbb

if默认只能控制一个语句的执行或不执行如果要控制多个语句需要用{ }括起来

```c
# include  <stdio.h>
int main (void)
{
    if (3<2)
    {
    printf ("aaaa\n");
    printf ("bbbb\n");
    }
    printf ("cccc\n");
    return 0;
    
} 
```
if ..else ...的用法

如果,否则

if..else..if的用法

格式

if (1)
    A;
else if (2)
    B;
else if (3)
    C;
else
    D;
c语言真假的处理

非零是真

零就是假

真用1表示

假用零表示

if的举例--求分数的等级
#include <stdio.h>
int main (void)
{
    int m ;
    printf ("请输入你的成绩\n");
    scanf ("%d" , & m);
    if (m >= 90 && m <=100)
        printf ("你的成绩是A\n");
    else if (m >= 80 && m < 90 )
        printf ("你的成绩是C\n");
    else 
        printf ("你的成绩是D\n");
    return 0;
}
if常见问题解析(如下)(重要)

if ( 3 > 2);
   printf ("4444\n");
//这里不能加分号,没有语句以else开头
else 
    printf ("5555\n");
if ( 3 > 2)
    printf ("aaaa\n");
else if ( 2  > 1);
    printf ("bbbb\n");
else
    printf ("dddd\n");
//该程序只会运行第一句,如果第一句成立只执行第一句后面的语句都不会运行下去也不会执行
if (表达式)
    A;
else if (表达式2)
    B;
else if (表达式3)
    C;
//这样写没有问题,也可以运行下去,但逻辑上有问题
if (表达式)
    A;
else if (表达式2)
    B;
else if (表达式3)
    C;
else (表达式4) //不对,正确的写法是去掉表达式4或加个if
    D;

写表达式前一定要加if

if (表达式)
    A;
else if (表达式2)
    B;
else if (表达式3)
    C;
else (表达式4) ;//语法上不会出错,逻辑上处处哦
    D;
        /*等价于
             else
                 (表达式4);
             D;                         */  

循环

定义

某些代码会被重复执行

for

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

    int i ;
    int sum ;

    for (i = 1 ; i <= 900; ++i)
        sum = sum + i ;
        printf ("sum=%d\n",sum);


    return 0;
}
#include <stdio.h>
int main (void)
{
    int i ;
    int sum = 0 ;

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

    return 0 ;
}

for 与 if 的嵌套

#include <stdio.h>
int main (void)
{
    int i = 1;
    int sum = 0;
    for (i=1 ; i <= 12 ; i=i+1)
    {

        if (i%3 == 0)
        sum = sum + i;
        printf ("%d",sum);
    }

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

}

100以内奇数的和

#include <stdio.h>
int main (void)
{
     int i = 1;
     int sum = 0;
     for (i=1;i < 100 ; i = i + 2)
     {
         sum = sum + i;
     }
    printf ("%d",sum);

   return 0;
}

100以内奇数的个数

#include <stdio.h>
int main (void)
{
     int i = 0;
     int sum = 0;
     for (i=0;i < 100 ; i = i + 1)
     {
        if(i%2 == 1)
         sum = sum + 1;
     }
    printf ("%d",sum);

   return 0;
}

1到100以内奇数的平均值

#include <stdio.h>
int main (void)
{
     int i = 1;
     int sum = 0;
     int suma = 0;
     double answer = 0;
     for (i=1;i < 100 ; i = i + 2)
     {
         sum = sum + i;
         if (i%2 == 1)
         suma = suma + 1;
     }
    answer = sum / suma ;

    printf ("%f",answer);

   return 0;
}

for的运行顺序

格式

for (1,2,3)
    语句A;

1---2---A---3(一次循环完成)---2---A---3---2---A---3依次反复直到不符合2的条件

#include <stdio.h>
int main (void)
{
    float i = 1.0;
    double sum = 0;
    for (i = 1.0 ; i <= 100 ; i=i+1);
    {
        sum = sum + 1.0/(i);
    } 
    printf ("%lf", sum);
    return 0;
}
//此程序错误,循环中更新的变量不能定义成浮点型

自增自减

a++ 后自增 表达加一之前的值

++a 前自增 表达加一之后的值

都是a加1以后的值

三目运算符

A ? B : C

等价于 if (A)

​ B;

​ else

​ C;

int i;
i = (3>2 ? 5 : 1)
逗号表达式

格式

​ (A,B,C,D)

功能:从左到右执行,追终表达式的值是最后的值

强制类型转换

格式

(数据类型)(表达式)

功能

把表达式的值强制转化为前面执行的数据类型

例子

(int)(4.5+2.2) 最终值是 6

(float) (5) 最终值是 5.000000

while

执行顺序

格式

while(表达式)

​ 语句;

表达式成立----语句----表达式成立----语句-----------知到表达式不成立、

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

    int sum = 0;
    int i = 0 ;
    while (i < 100)
    {
        i=i+1;
        sum = sum + i;
    }
    printf ("sum=%d",sum);
    return 0;
    
}

for与while能相互转换

但for逻辑性更强更不容易出错

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

菲波拉且序列

f(n)=f(n-1)+f(n-2)

f(1)=1 f(2)=2

求第n项数的大小

# include <stdio.h>
int main (void)
{
    int n;
    int f1, f2, f3;
    int i;

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

do...while

主要用于人机交互

格式

do

{

​ ...........

} while(表达式)

switch
#include <stdio.h>
int main(void)
{
    int val;
    printf ("请输入你要去的楼层");
    scanf ("%d",&val);

    switch (val)
    {
    case 1:
        printf("1\n");
        break;
    case 2:
        printf("2\n");
        break;
    }
    return 0;
}

编程作业

5.10第七题

#include <stdio.h>
int main (void)
{
    char c1 , c2 ;
    int diff;
    float num;

    c1 = 's';
    c2 = 'o';
    diff = c1 - c2;
    num = diff;
    printf ("%c%c%c:%d %3.2f\n", c1, c2, c1, diff ,num);
    return 0;
}

输出结果为

sos:4 4.00

5.10第十三题

1.  --x
2.  m = n%k
3.  p = q/b - a
4.  x = (a + b)/(c*d)    

5.11第三题

#include <stdio.h>
int main (void)
{
    int day = 0;
    int week = 0;
    int x = 0;

    printf ("请输入天数\n");
    scanf ("%d", &day);

    if (day <= 7)
    {
        printf ("%d days are %d weeks , %d days.\n",day , week , day );
    }
    else 
    {
        x = day%7;
        week = day / 7;
        printf("%d days are %d weeks , %d days.\n",day , week , x);
    }
    return 0;    
}

5.11第八题(对着答案写的)

#include <stdio.h>
int main(void)
{
    int a , b ;
    printf ("This program computes moduli\n");
    printf ("Enter an integer to serve as the second operand") ;
    scanf ("%d" , b);
    printf ("Now enter the first operand");
    scanf ("%d", a);
    while (a > 0)
    {
        printf("%d %% %d is %d\n", a, b, a % b); 
		printf("Enter next number for first operand (<= 0 to quit): ");
		scanf("%d", &a); 
    }
    return 0;
}

6.16第十八题

#include <stdio.h>
int main (void)
{
    int i = 5;
    int n = 1;
    
    for ( n = 1; i <= 150; n = n+1)
    {
        i = (i-n)*2;
        printf ("i=%d\n",i);
        printf ("n=%d\n", n);
    }

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

6.16第十二题,第五题

不会

7.11第二题

1. number >= 90 &&  number < 100
2. ch != q  &&ch ! k
3. (number <=9  &&  number <= 9) && number !=5
4.sumber<1 || number > 9