c语言集训-王羿磐-第三次作业

238 阅读6分钟

课堂笔记

算术运算符

+(加)
-(减)
*(乘)
/(除) (注意:除法的运算结果和运算对象的数据类型有关,两个数都是int,则商就是int,若商有小数,则截取小数部分;被除数和除数中只要有一个或者两个都是浮点类型数据,则商也是浮点型,不截取小数部分 )
%(取余数) (注:取余的运算对象必须是整数,结果是整数后的余数,其余数的符号与被除数相同)

测试取模运算字符的例子


#include<stdio.h>
 
int main(void)
{
    printf("%d %d %d %d %d %d %d",3%3,13%-3,-13%3,-13%-3,-13%23,3%5);
    return 0;
}

运行结果为下图

测试取模运算字符的例子.png

逻辑运算符

c语言的真假处理

  • 非零为真
  • 零是假
  • 真是用1表示,假是用0表示

!(非)

  • !真 即假
  • !假 即真

&&(并且)

  • 真&&真 即真
  • 真&&假 即假
  • 假&&真 即假
  • 假&&假 即假 &&左边的表达为假,右边的表达肯定不会执行

逻辑运算符1.png 如上图1,左边的表达(3>2)为真,所以能执行右边的表达(k=8) 代码为

# include<stdio.h>
int main(void)
{
    int i = 10;
    int k = 20;
    int m;
    m = (3>2) && (k=8);// 不含有分号的是表达式 含有分号的是语句
    printf("m = %d, k = %d\n",m ,k);
    return 0;
}

逻辑运算符2.png 如上图2,左边的表达(1>2)为假,所以不能执行右边的表达 其代码为

# include<stdio.h>
int main(void)
{
    int i = 10;
    int k = 20;
    int m;
    m = (1>2) && (k=5);// 不含有分号的是表达式 含有分号的是语句
    printf("m = %d, k = %d\n",m ,k);
    return 0;
}

||(或者)

  • 真||假 即假
  • 假||真 即真
  • 真||真 即真
  • 假||假 即假 ||左边的表达式为真,右边的的表达式肯定不会执行

优先级别

算术>关系>逻辑>赋值

赋值运算符

1.=
2.+=
3.*=
4./=
5.-=
eg:a+=3等价于a=a+3

流程控制(重点)

什么是流程控制?

  • 流程控制就是流程代码执行的顺序

流程控制的分类

1.顺序

2.选择

  • 定义:某些代码可能执行,也有可能不执行,有选择的执行某些代码
分类
If
  • 1.if最简单的用法
    格式:
    if(表达式)
    语句
    功能:如果表达式为真,执行语句;如果表达式为假,语句不执行

if函数的基本用法.png

  • if的范围问题

if(表达式)
语句A;
语句B;
解释:if默认只能控制语句A的执行或不执行,if无法控制语句B的执行或不执行。换句话讲就是B语句一定会执行

if(表达式)
{
语句A;
语句B;
}
注意:此时if可以控制A的和B
故如果想控制多个语句的执行或者不执行就必须把这些语句用{}括起来

  • if····else····的用法

  • if···else if····else···的用法

  • f举例——分数的等级

//逻辑表达式最终值的测试,if秋分数的等级
# include<stdio.h>
int main(void)
{
     float score;
     printf("输入你的成绩\n");
     scanf("%f",&score);

     if (score>100)
     printf("不可能\n");
     else if (score>=90 && score<=100)//不能写成90<=score<=100,因为无论90<=score为真或为假输出的值只会是1或0,而1或0始终小于100
     printf("优秀");
     else if (score>=80 &&score<=90)
     printf("良好");
     else if (score>=60 &&score<=90)
     printf("及格");
     else if (score<=60 && score>=0)
    printf ("不及格");
    return 0;
}

if的分数等级例子.png

  • if的常见问题 1>. 空语句的问题

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

2>.
if (表达式1)
else
B;(是正确的)

3>.
if (表达式1);
A;
else
B;(是错误的)
if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
else
(即便表达式1和2都成立,也只会执行A语句)

4>.
if (表达式1)
A; else if (表达式2)
B;
else if (表达式3)
C;
(这样写语法不会出错,但逻辑上有漏洞)

5>.
if(表达式1)
A;
else if(表达式2)
B ; else if(表达式3)
C; else(表达式4)
D;
(这样写是错误的,正确的写法是
要么去掉(表达式4)保留else
要么else后面加上if且保留(表达式4))

6>.
if(表达式1)
A;
else if(表达式2)
B ; else if(表达式3)
C; else(表达式4);
D;
(这样写语法上不会错,但逻辑上是错误的,相当于else执行的是(表达式4))

else(表达式4);
D;
等价于
else
(表达式4);
D;

switch

需要看懂电梯程序

int main(void)
{
    int a;
    printf("请输入楼层: ");
    scanf("%d",&a);
    switch (a)
    {
    case 1:
       printf("1层");
        break;
    case 2:
       printf("2层");
        break;
    case 3:
       printf("3层");
        break;

    default:
       printf("还没那么高");
        break;
    }
    return 0;
}

电梯程序.png

3.循环

定义:某些代码会被重复执行
分类
for
  • 格式
    for(1;2;3)
    语句A;
    注意:第一次循环执行顺序先执行1再执行2再执行A最后执行3,之后每一次循环不执行1先执行2再执行A最后执行3
//for循环例子
int main(void)
{
    int i;
    int sum = 0;
     
    for ( i = 1; i < 10; i+=2)  
        sum = sum + i;//++1就是1+i
    printf("i = %d",i);//此时i的值为11,并不为9,因为每次循环都要执行完所有步骤
    printf("sum = %d",sum);

    return 0;
}

for循环简单例子2.png

  • 执行的流程(重点) 1.for和if的嵌套使用
    图1:

for和if嵌套使用1.png

图2:

for和if嵌套2.png
由上两图得知printf的位置不同,输出结果也不同

2.单个for循环使用
3.多个for循环的嵌套使用(重点)
for(a;b;c) // 1
for(d;e;f) // 2
A; // 3
B; // 4
整体是两个语句,1,2,3是第一个语句。4是第二个语句
执行顺序先执行a->b->d->e->A->f->e->A······->c(一直执行到e不成立后执行c)-> b->d->e->A->f->e->A·····一直循环执行直到b不成立后最后执行B

int main (void)
{
    int i,j;
    for (i=0;i<3;++i)
    {
        printf("111\n");
        for ( j = 2; j< 5; ++j)
        {
            printf("222\n");
            printf("333\n");
        }
        printf("444\n");
    }
    return 0;
}

运行结果如图

for嵌套循环.png

  • for的范围问题

for(表达式)
语句A;
语句B;
解释:if默认只能控制语句A的执行或不执行,if无法控制语句B的执行或不执行。换句话讲就是B语句一定会执行

for(表达式)
{
语句A;
语句B;
}
注意:此时for可以控制A的和B
故如果想控制多个语句的执行或者不执行就必须把这些语句用{}括起来

  • for的例题
    1+1/2+1/3····+1/100
# include<stdio.h>
int main(void)
{
     int i;
     float sum = 0;
     for (i=1;i<=100;++i)
     {
         sum = sum+ 1/(float)(i);//sum = sum + (float)(1/i),这样写是不对的
         //上式也可以写成:sum = sum + 1.0/i;
     }
     printf("sum=%f\n",sum);
    return 0;
}

输出结果

1.png

while
  • 1.执行顺序
    格式:
    while (表达式)
    语句;
    while的简单用法
# include<stdio.h>
int main(void)
{
    int i;
    int sum = 0;
    i =1;
    while (i<101)
    {
        sum = sum +i;
        ++i;
    }
    printf("sum=%d\n",sum);
    
    return 0;
}

输出结果如下图

while的普通用法.png

  • 2.与for的相互比较
    for(1;2;3)
    A;
    等价于
    1;
    while(2)
    {
    A;
    3;
    }
    注:while和for可以互相转化,但for的逻辑性更强,推荐多使用for

  • 3.举例

从键盘输入一个数字,如果该数字是回文数,则返回yes,否则返回no
回文数:正着写和倒着写都一样 eg:121

do ····while

格式:
do
{
·····
} while (表达式);
注:主要用于人机交互
do···while并不等价于for,也不等价于while

例子:一元二次方程

# include <math.h>

int main(void)
{
    
    double a, b, c;
    double delta;
    double x1,x2;
    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) / (2*a);
        x2 = x1; 
        printf("该一元二次方程有一个唯一解, x1 = x2 = %lf\n", x1, x2);
    }
    else
    {
        printf("无解\n");
    }

    }  while (1);
   
    return 0;
} 


运行结果如下图

while一元二次方程.png

break和continue

1.break

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

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

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

例子:

for (i=0; 1<3; ++i )
{
if (3>2)
break; (break虽然是if内部的语句,但break終止的确是外部的for循环)
printf("aasss\n"); (此表达式永远不会输出) }

  • 在多层循环中,break只能终止最里面包裹它的那个函数 例子: .

    for (i=0; i<3; ++i)
    { for (j=1; j<4; ++j)//break能终止距离它最近的循环
    printf("同志们好!\n"); }

  • 在多层switch嵌套中,break只能终止距离它最近的switch  例子:

2.jpg

2.continue

用于跳过本次循环余下的语句,

转去判断是否需要执行下次循环
例子1:
for (1; 2; 3)
{
A;
B;
continue; //如果执行该语句,则执行完该语句后,会执行语句3, C和D都会被跳过去,C和D不会被执行
C;
D;
}

例子2:
while (表达式)
{
A;
B;
continue; //如果执行该语句,则执行完该语句后,会执行表达式,C和D都会被跳过去,C和不会被执行
C;
D;

其他课堂笔记

如何看懂一个程序

1.流程
2.每个语句的功能
3.试数

强制类型转化

格式:(数据类型)(表达式)
功能: 把表达式的值强制转化为前面所执行的数据类型
eg:(int)(4.5+2.2)最终值为6
(float)(5)最终值为5.000000

课后作业

5.10第七题

int main(void)
{
    char c1,c2;
    int diff;
    float num;

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

输出结果如下

1125第七题.png 5.10第13题

1125第13题.jpg

5.11第3题


int main()
{
    int a,b,c;
     printf("请输入总天数:");
     scanf("%d",&a);
     b=a/7;//算有多少周
     c=a%7;//算还剩多少天
     printf("%d days are %d  weeks %ddays\n",a,b,c);

    return 0;
}

5.11第3题.png 5.11第8题(参考了答案自己对着敲了一遍 )

int main(void)
{
	int second_operand = 0;
	int first_operand = 0;
	
	printf("This program computers moduli.\n");
	printf("Enter an integer to serve as the second operand: \n");
	scanf("%d",&second_operand);
	printf("Now enter the first operand: \n");
	scanf("%d",&first_operand);
	printf("%d %% %d is %d\n",first_operand,second_operand,first_operand%second_operand);
	printf("Enter next number for first operand (<= 0 to quit): \n");
	scanf("%d",&first_operand);
	while (first_operand > 0)
		{
			printf("%d %% %d is %d\n",first_operand,second_operand,first_operand%second_operand);
			printf("Enter next number for first operand (<= 0 to quit): \n");
			scanf("%d",&first_operand);
		}
		
	printf("Done\n");
}




511 8.png

6.16第五题(参考了答案后自己背着打出来的)

int main(void)
{
	int i,j,k;
	char letter;
	printf("Please enter a capital letter.\n");
	scanf("%c",&letter);
	k = letter - 'A' + 1;
	
	for (i = 0; i < k;i++)         //确定行数 
	{
		for (j = 0; j <=k-i; j++)  //除输出的那个字符外,其余用空格填充 
			printf(" ");
		for (j = 0;j <= i;j++)     //升序输出 
			printf("%c",'A' + j);
		for (j = i - 1;j >= 0;j--) //降序输出 
			printf("%c",'A' + j);
	    printf("\n");//该表达式作用为让每次输出都要换行
	}
	
	return 0;
} 



6.165.png 6.16第12题(实在做不出来看的答案,但是大概能看懂答案)

#include<math.h>
int main(void)
{
	int limit;
	int i;
	float sum1,sum2;
	
	printf("Please enter the limit.\n");
	while(scanf("%d",&limit) == 1 && limit>0 )
	{
		for (i = 0;i < limit;i++)
		{
			sum1 +=  1.0/(1.0 + i);
			sum2 += 1.0/(1.0 + i)*pow(-1,i);
		}
		printf("The firse result is %f\n",sum1);
		printf("The second result is %f\n",sum2);
	}
	
	return 0;
}



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

7.11第10题

int main(void)
{
    char ch;
    while ((ch == getchar()) !='#')
    { 
        if(ch !=='\n');//让下个表达式独立于if函数
        printf("step 1\n");
        if (ch 1!=='c')
        else if (ch == 'b')
        else if (ch == 'h')
        printf("step 2\n");
        printf("step 3\n");
    }

        printf("done\n");
        return 0;
    
}