C语言集训--车蒙蒙--第三次作业

177 阅读7分钟

观课笔记

1.运算符

  • 算术运算符:+ - * /(除) %(取余)
  • 关系运算符:> >= < <= !(不等于) ==(等于)
  • 逻辑运算符:!(非) &&(与) ||(或)
  • 赋值运算符:= += *= /= -=
  • 优先级别:算术>关系>逻辑>赋值

除法的运算结果和运算对象的数据类型有关,两个数都是int,则商就是int,若商有小数,则截取小数部分;被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型,不截取小数部分。 例如:16/5==3 16/5.0==3.20000 -13/4==-4

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

测试取模运算符的例子

代码及运行结果如下:

#include<stdio.h>

int main()
{
    printf("%d %d %d %d  %d %d\n",3%3,13%3,-13%3,-13%-3,-13%23,3%5);
    
    return 0;
}

image.png

总结:取余%的运算对象必须是整数,结果是整除后的余数,其余数的符号与被除数相同


逻辑运算符的拓展讲解

类别真假
真&&真
真&&假
假&&真
假&&假

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

&&左边的表达式为假,右边的表达式肯定不会执行; ||左边的表达式为真,右边的表达式肯定不会执行。

相关代码
#include<stdio.h>

int main()
{
    int i = 10;
    int k =20;
    int m;

    m = (3>2)&&(k = 8);
    printf("m = %d.k = %d\n",m,k);

    return 0;
}

2021-11-23 (1).png

注意:只要看k不等于零,都认为是给k赋了一个值


2.流程控制的分类

分类:

if

if最简单的用法
1.格式:if(表达式)
语句A:
语句B:

解释:if默认只能控制语句A的执行或不执行,if无法控制语句B的执行或不执行;或者讲:语句B一定会执行

功能:
如果表达式为真,执行语句;如果表达式为假,语句不执行
运行实例如下:

2021-11-23 (2).png


2.if(表达式)
{
语句A;
语句B;
}

此时if可以控制语句A和语句B 由此可见:if默认只能控制一个语句的执行或不执行,如果想控制多个语句的执行或不执行,就必须把这些语句用{}括起来

相关代码及运行结果
#include<stdio.h>

int main()
{
    int i , j;
    scanf("%d %d",&i,&j);
    if(i > j)
        printf("i大于j\n");
     else
        printf("i小于j\n");

        return 0;   
}

2021-11-23 (3).png


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

首先判断关键词if后括号内条件表达式的值,如果该表达式的值为逻辑真(非 0),则执行 if 体(语句 A),而不执行 else 体(语句 B),然后继续执行 if-else 之后的其他语句;否则,若该表达式的值为逻辑假(0),则不执行该 if 体(语句 A),而执行 else 体(语句 B),然后继续执行 if-else 之后的其他语句。


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

格式:

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

5.C语言对真假的处理

  • 非零是真
  • 零就是假
  • 真用1表示
  • 假用0表示

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

相关代码及运行结果
#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 if("score>=0 && score<60")
       printf("不及格!继续加油!\n");
    else 
      printf("输入的分数过低,不要如此自卑!\n");
    return 0;
      
}

2021-11-23 (4).png

求三个数字的最大值
代码及运行情况如下
#include<stdio.h>

int main()
{
    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;
}

2021-11-23 (6).png


7.if的常见问题的解析

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

if(表达式1)

A;

else

B;

是正确的

if(表达式1);

A;

else(表达式2)

B;

是错误的

3.

if(表达式1)

A;

else if(表达式2)

B;

else if(表达式3)

C;

else

D; 即便表达式1和2都成立,也只会执行A语句

4.

if(表达式1)

A;

else if(表达式2)

B;

else if(表达式3)

C;

else(表达式4) //7行

D;

这样写语法不会出错,但逻辑上有漏洞

5.

if(表达式1)

A;

else if(表达式2)

B;

else if(表达式3)

C;

else(表达式4) //7行

D;

这样写法是不对的,正确的写法是:要么去掉7行的(表达式4),要么在7行的else后面加if。

6.

if(表达式1)

A;

else if(表达式2)

B;

else if(表达式3)

C; else if(表达式4)

D;

这样写语法不会出错,但逻辑上是错误的


8.关于if语句的相关代码及运行结果

#include<stdio.h>
 int main()
 {
     if(3>2)
     printf("哈哈!\n");
     else 
         printf("嘿嘿\n");
    return 0;
 }

2021-11-24 (1).png

#include<stdio.h>
 int main()
 {
    if(3>1)
       printf("AAAA\n");
    else if(3>2)
       printf("BBBB\n");
    else
       printf("CCCC\n");

       return 0;
 }

2021-11-24 (2).png

总结:即便表达式1和2都成立,也只会执行A语句。

自增自减

自增:

前自增-- ++i;

后自增-- i++

前自增和后自增的异同

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

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

相关代码与运行结果:
#include<stdio.h>
int main()
{
	int i;
	int j;
	int k;
	int m;

	i = j = 3;//等价于i=3; j=3;
	k = i++;
    m = ++j;
	
	printf("i =%d, j = %d, k=%d, m =%d\n",i ,j ,k ,m);
	return 0;
}

	
 

image.png


9.循环

  • 定义:某些代码会被重复执行 分类:

for

1.格式:for(1,2,3) 语句A;

2.执行的流程【重点】

单个for循环的使用, 多个for循环的使用

相关代码及运行结果
1.1+2+...+100的和
#include<stdio.h>

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

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

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

    return 0;

}

2021-11-24 (3).png

2.验证循环次数的程序
#include<stdio.h>
int main(void)
{
    int i;
    int sum = 0;

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

    return 0;
}

2021-11-24 (4).png


3.举例

1.求1到100之间的奇数之和
#include<stdio.h>

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

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

     return 0;
}

2021-11-24 (5).png

2.求1到100之间的奇数的个数
#include<stdio.h>

int main(void)
{
    int i;
    int cnt = 0;//个数一般用从cnt表示
    for(i =1; i<=100; i++)
    {
       if( i%2 == 1)
       cnt++;
    }   
    printf("cnt = %d\n",cnt);

    return 0;
}

2021-11-24 (6).png

3.求1到100之间的奇数的平均值
#include<stdio.h>

int main(void)
{
    int i;
    int sum = 0 ;
    int cnt = 0;
    float avg = 0 ;
    for(i=1 ;i<=100; i++)
    {
        if(i%2 == 1)
        {
            sum += i; //sum = 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;
}

2021-11-24 (8).png

4.求1到100之间的奇数之和,再求1到100之间的偶数之和
#include<stdio.h>

int main(void)
{
    int i;
    int sum = 0;
    int sum1 = 0;
    int sum2 = 0;
    for(i = 1;i<=100; i++)
    {
        if(i%2==1)
         {
              sum1 += i;  //sum1 = sum1 + i;
        }
        else 
        {
              sum2 += i;
              }
           }
        printf("sum1 = %d\n",sum1);
        printf("sum2 = %d\n",sum2);
              return 0;
}

2021-11-25.png

while

  • 1.执行顺序: 格式

while(表达式)

语句;

  • 2.与for的相互比较 for和while可以相互转换

for(1;2;3)

A;

等价于

1;

while(2)

{

A;

3;

}

whilefor可以相互转化 但for的逻辑性更强,更不容易出错,推荐多使用for

  • 3.举例

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

回文数:正着写和倒着写都是一样的 比如:121 12321

相关代码及运行结果:
#include<stdio.h>

int main(void)
{     
       int m;
       int val;
      int sum = 0;
      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;
}

2021-11-25 (2).png

关于代码的解释:

1>.m = 1234成立

sum = 0*10+1234%10 = 4

m = /10 = 123;

2>. m = 123 成立;

sum = 4*10+123%10=43

m=123/10=12;

3>. m =12 成立

sum = 43*10+12%10=432

m = 12/10 =1;

4>.

m = 1

sum = 432*10+1%10 = 4321

m = 1/10 = 0

5>.

m = 0 不成立

最终sum= 4321


do while

格式

do

{

}while(表达式)

do...while不等价于for以及while 主要用于人机的交互


break

  • break如果用于循环则用来终止循环;如果用于switch则用来终止switch break不能直接用于if,除非if属于循环内部的一个子句


continue

for (1;2;3)

{

A;

B; continue; //如果执行该语句,则执行完该语句后,将会执行语句3,C和D都会被跳过,不会被执行

C;

D;

}


课后习题

5.10第七题:

运行结果:

image.png


5.10第十三题:

a: x--; or --xx; or x = x-1;

b:m = n % k ;

c:p = q / (b - a);

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


5.11第三题:

相关代码及运行情况:
#include<stdio.h>
#define WEEK 7

int main(void)
{
   int days;
   printf("请输入天数:");
   scanf("%d",&days);

   while(days>0)
   {
      int weeks = days/7;
      printf("%d days are %d weeks, %d days\n",days, weeks, days %7);
      printf("请输入天数:");
      scanf("%d",&days);
   }

   return 0;

}

image.png

5.11第八题:

相关代码及运行结果:
#include<stdio.h>
int main(void)
{
   int i;
   int j;
   printf("This program computers moduli.\n");
   printf("Enter an integer to serve as the second operand:");
   scanf("%d",&i);
   printf("Now enter thhe first operand:");
   scanf("%d",&j);
   printf("%d % %d is %d",j, i ,j%i);
   printf("\nEnter next number for first operand:");
   scanf("%d",&j);

   while(j>0)
   {
     printf("%d  %   %d is %d",j ,i ,j%i);
     printf("\nEnter next number for the first operand: ");
     scanf("%d",&j);
   }
   return 0;
}

image.png


6.16第五题:
相关代码及运行结果如下:
#include <stdio.h>

int main(void)
{
	char end;
	char start = 'A';
	char ch = start;

	printf("Please enter a letter: \n");
	scanf("%c", &end);
	for (int i = 0; i <= end - start; i++, ch = start)
	{
		for (int j = 0; j < end - start - i; j++)
			printf(" ");
		for (int k = 0; k <= i; k++, ch++)
			printf("%c", ch);
		ch = ch - 2;
		for (int c = 0; c < i; c++, ch--)
			printf("%c", ch);
		printf("\n");
	}

	return 0;
}

image.png


6.16第十二题:
相关代码及运行结果如下:
#include <stdio.h>

int main(void)
{
	int size;
	float sum1, sum2;
	float num;

	num = 1.0;
	printf("Please enter the sums size: ");
	scanf("%d", &size);

	while(size > 0)
	{ 
		sum1 = sum2 = 0;
		/*
		sum = 0;
		for (int i = 1; i < size +1 ; i++)
		{
			sum = sum + num / i;
		}
		*/
		for (int i = 1; i < size + 1; i++)
		{
			if (i % 2 == 1)
				sum1 = sum1 + num / i;
			if (i % 2 == 0)
				sum2 = sum2 - num / i;
		}

		printf("The first shulie result is  : %f\n", sum1 - sum2);
		printf("The second shulie result is : %f\n", sum1 + sum2);
		printf("Please enter the next sums size: ");
		scanf("%d", &size);
	}


	printf("Job Down!");
	return 0;
}

image.png


6.16第十八题:
相关代码及运行结果如下:
#include <stdio.h>
//#define DUNBARNUM 150

int main(void)
{
	int friends = 5;
	int weeks = 1;
	const int DUNBARNUM = 150;

	do
	{
		weeks++;
		friends = (friends - 1) * 2;
		printf("%d, %d\n", friends, weeks);
		//getchar();
	} while (friends < DUNBARNUM);
	printf("After %d weeks he's friends are more than 150.", weeks);

	return 0;
}

image.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


7.11第十题
#include<stdio.h>

int main(void)
{
	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;
}

image.png