C语言集训-陈朝旭-第三次作业

200 阅读6分钟

一.运算符

1.算数运算符

+-*/%
取余数

除法的运算结果和运算对线的数据类型有关,两个数如果都是int,则商也是int(若商有小数部分,则小数部分被截取),被除数和除数中,只要有一个或者两个都是浮点型数据,则商也是浮点型,不截取小数部分 如:16/5 ==3

16/5.0 ==3.20000

3/5 ==0

-13/4 ==-4

取余的运算对线必须是整数,结果是整除后的余数,其余数的符号与被除数相同 如:13%3 == 1

13%-3 == 1

-13%3 == -1

2.关系运算符

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

3.逻辑运算符

&&
并且

真用1表示,假用0表示,若&&左边的表达式如果为假,右边的表达式不执行;无论左边表达式真假||两边的表达式都会执行

“||”表示“或”

4.赋值运算符

=+=*=/=-=
如 a=3a=a+3a=a*3a=a/3a=a-3

5.自增自减

分类

前自增:++i

后自增:i++

前自增和后自增的相同:最终都使i的值加1

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

# include <stdio.h>
int main()
{   
    int i;
    int j;
    int k;
    int m;
    
    i = j = 3;
    k = i++;
    m = ++j;
    
    printf("i = %d, j = %d, k = %d, m = %d\n", i, j, k, m);
    
    return 0;
}

前自减:--i

后自减:i--

前自减和后自减同理

6.三目运算符

A ? B:C

等价于

    if(A)
        B;
    else
        C;

如下

# include <stdio.h>
int main()
{   
    int i;
   
    i = (3>2 ? 5 : 1);
    printf("%d\n",i);

    return 0;
}

7.运算符优先级别

算术>关系>逻辑>赋值

二.流程控制

顺序

选择

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

分类:

  • if语句

  • switch语句

1.if else语句

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

只会输出AAAA和CCCC,原因如下

格式:

if(表达式)

语句

功能:

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

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

2.if的范围问题

if默认的只能控制一个语句的执行或者不执行 if(表达式)

语句A

语句B

if只能控制语句A是执行与否,语句B不受控制,所以语句B一定执行

if(表达式)

{

语句A

语句B

}

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

3.if...else的用法

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

    scanf("%d %d", &i, &j);

    if (i > j)
        printf("i大于j\n");
    else
        printf("i小于j\n");
    return 0;
}

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

# include <stdio.h>
int main(void)
{
    double delta = 3;

    if (delta > 0)
        printf("有两个解!\n");
    else if (delta == 0)
        printf("有一个唯一解!\n");
    else
        printf("无解!\n");
        
    return 0;
}

格式:

if (1)
        printf("A!\n");
    else if (2)
        printf("B\n");
    else if (3)
        printf("C\n");
    else
        printf("D");

5.c语言对真假的处理

非0是真 0是假 假用0表示,真用1表示

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

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

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

    if (score > 100)
        printf("这是做梦!\n");
    else if (score)
 
    return 0;
}

例子一:互换两个数字

# include <stdio.h>
int main(void)
{
    int i = 3;
    int j = 4;
    int t;
    
    t = i;
    i = j;
    j = t;

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

    return 0;
}

例子二:对任意三个数字进行排序

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

7.if的常见问题解析

空语句: if (a < c);等价于 if (a < c)和;

如果if语句1执行那么else if语句2不会再执行

else if接(表达式)或者else接结果


2.for语句

1.为什么需要for循环

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

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

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

输出结果为sum=499500


2.for循环最简单的用法

# include <stdio.h>

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

    for (i=1; i<10; i+=2)
    {
        sum = sum + i; 
        printf("我今天很高兴!\n");

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

输出结果为:

我今天很高兴!

我今天很高兴!

我今天很高兴!

我今天很高兴!

i=11

3.for和if的嵌套使用

# include <stdio.h>

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

    for (i=3; i<=12; ++i)
    {
        if (i%3 == 0)
            sum = sum + i;

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

    return 0;
}

输出结果如图

1637851635(1).png

# include <stdio.h>

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

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

    return 0;
}

输出结果如图

1637851749(1).png

4.强制类型转换和对初学者很重要的求和程序讲解

# include <stdio.h>

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

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

    return 0;
}

输出结果为0

问题出在输出上应该用%f而不是%d(float必须用%f输出)

# include <stdio.h>

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

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

    return 0;
}

输出结果为1.0000

下面对整型变量i进行强制转换

# include <stdio.h>

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

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

    return 0;
}

输出结果如图所示

1637852318(1).png

强制类型转换:

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

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

例子:(int)(4.5+2.2)输出结果为6float)(5)输出结果为5.000000

5.浮点数的存储所带来的问题

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

举例:有一个浮点型变量x,如何判断x的值是否是0

if(|x-0.00000001| < 0.00000001)(就是说x和一个很小的数相减的绝对值小于这个很小的数就可以看做是0)


else

    不是

循环更新的变量不能定义为浮点型

6.for和if嵌套使用四个习题的讲解

1.求1到100之间的奇数之和

# include <stdio.h>

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

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

    return 0;
}

2.求1到100之间奇数的个数

# include <stdio.h>

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

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

    return 0;
}

个数一般用cnt表示

3.求1到100之间奇数的平均值

# include <stdio.h>

int main(void)
{
    int i;
    int sum = 0;
    int cnt = 0;
    float avg;
    
    for (i=1; i<101; ++i)
    {
        if (i%2 == 1)
           {
           sum += i;
           ++cnt;
           }
           
    } 
    avg = 1.0*sum / cnt; 
    printf("sum = %d\n", sum);
    printf("cnt = %d\n", cnt);
    printf("avg = %f\n", avg);
    
    return 0;
}

4.求1到100之间奇数的和,再求1到100之间偶数的和

# include <stdio.h>

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

    for (i=1; i<101; ++i)
    {
        if (i%2 == 1)
        {
            sum1 += i;
        }
        else
        {
            sum2 += i;
        }
    
    } 

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

7.多层for循环嵌套使用执行顺序

直通车

1.单个for循环的使用

2.多个for循环的嵌套使用

for(1; 2; 3) //第一个语句

for(4; 5; 6) //第二个语句

A; //第三个语句

B; //第四个语句

3.while语句

# include <stdio.h>

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

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

    return 0;
}

用while语句写上面的代码

# include <stdio.h>

int main(void)
{
    int i;
    int sum = 0;
    i = 1;
    whlie (i < 100)
    {
            sum = sum + i;
            ++i;
    } 
          printf("sum = %d\n", sum);

    return 0;
}

1.执行顺序

格式:

while(表达式)
    语句;

2.与for的相互比较

for和while可以相互转换

for (1; 2; 3)
    A;

等价于

1;
while (2)
{
    A;
    3;
} 

3.举例

1.用while判断是否是回文数

# include <stdio.h>
int main()
{
    int m;
    int sum = 0;
    int val;
    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;
}

2.斐波拉切序列

# include <stdio.h> 
int main()
{
    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;
}

关于斐波拉切序列的讲解

4.什么时候用while,什么时候用for

笑了,用多了自然知道hhh

4.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;
    case 3;
        printf("3层开!\n");
        break;
    default:
        printf("没有盖到这一层!\n");
        break;
    }
    return 0;
}

5.do while语句

主要用于人机交互

do
{
    ......
} whlie(表达式)



while(表达式)
{
......
}



for (1; 2; 3)
    A;

do whlie不等价于while也不等价于for

do while实现一元二次方程

# include <stdio.h>
# 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;
      
      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 = (-b + sqrt(delta)) / (2*a);
          x2 = x1;
          printf("该一元二次方程有唯一解,x1 = x2 = %lf\n",x1);
     }
      else
     {
           printf("无解\n");
     }
      printf("是否继续(Y/N):"); 
      scanf(" %c", &ch);           //%c前面必须加一个空格
   }while('y' == ch || 'Y' == ch);
               
   return 0;
}

6.break和continue的区别

break
    break如果是用于循环是用来终止循环
    break如果是用于switch,则是用于终止switch
    break不能直接用于if,除非if属于循环内部的一个子句
    
    
continue
    用于跳过本次循环余下的语句
    转去判断是否需要进行下次循环
    
    

break用法介绍

continue用法介绍


三.课后习题

C Primer Plus

  • 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

第十三题

a. x -= 1;\

b. m = n % k;\

c. p = q / (b - a);\

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


  • 5.11 第三题
#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;
}

运行结果如图所示 LZUZO6}ZSY6@}){TGYK9P7J.png 第八题

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

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

运行结果如图所示:

0~T04EB4RYMA1VV[${]7AQU.png

遇到的情况:继续执行时出现了无限循环输出


  • 6.16 第五题
# include <stdio.h>
int main (void)
{  
    int i, j, num;  
    char c ;  
    printf("enter the core char you want to print(A...Z):");  
    scanf("%c",&c);  
    char ch ='A';  
    num = c -'A'+1;  
    for (i=1; i<=num;i++)
    {  
        for(j=0;j<num-i ;j++)  
        printf("");   
        for (ch= 'A';j <num; j++)  
            printf("%c",ch++);  
        for(j=1,ch-=2;j<i ;j++,ch--)  
            printf("%c",ch);  
            printf("\n");  

    } 
    return 0;  
}  

运行结果如图所示

E2FOOL)_P930YURIL(_D9{F.png

第十二题 (计算机二级内容)

# include <stdio.h>  
int main()
{
    double times, i;                         
        
    printf("请输入项数:"); 
    while ((scanf ("%lf",&times) == 1) && (times > 0)) 
    {
        int a = 1;  
        double sum1 = 0, sum2 = 0;       
        for (i = 1.0; i <= times; i++,a = 0-a)
        {
            sum1 += 1.0 / i;
            sum2 += a*1.0 / i;   
        }
         printf("sum1 = %lf, sum2 = %lf", sum1, sum2);
    }
    printf("结束");
   
    return 0;
}

运行结果如图所示

P7E0{AKRZ6W1D2{D@$XIHK.png 第十八题

# include <stdio.h> 
int main()
{
    int friends;
    int i = 1; 
    
    for (friends = 8; friends < 150; i++)
    {   
        friends = 2 * (friends - i);
        printf("第 %d 周有 %d 个朋友\n", i, friends);
    }
    
    return 0;
}

运行结果如图所示:朋友初始数改为8

CQH11SHD_97)RQ1EYBG_2F7.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

第十题

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

运行结果如图下所示

~A6EBS2G@0D}H$KC0L2ZVD.png


已注册杭电oj账号:zkshang )LLO13KI_G7MTC5EOA2.png