C语言集训-谢世轩-第三次作业

202 阅读5分钟

课堂笔记

运算符

  • 算术运算符:+-、* (乘)、/(除)、%(取余)

  • 关系运算符:>>=(大于等于)、<<=(小于等于)、!=(不等于)、==(等于)

  • 逻辑运算符:(非)、&&(并且)、||(或)

&&的执行情况记录

//&&的执行情况
#include<stdio.h>
int main()
{
int m;
int k=20;
m=(5<3)&&(k=5);

printf("%d %d",m,k);
    return 0;
}

score.cpp - Visual Studio Code 2021_11_24 21_15_30.png

  • 赋值运算符:=+=(例a+=3的意思为a=a+3下同)、-=、*=、/=

  • 三目运算符

    A?B:C 等价于 if else语句

  • 逗号表达式

    (A,B,C,D)从左到右执行,且值为D的值

【运算符优先级】 算术>关系>逻辑>赋值

【Tip】

1.除法运算符的注意事项:除法的运算结果和运算对象的数据类型有关,若两个数都是int类型则商也为int类型,若存在小数则将小数部分舍去。如果两个数中有一个或两个为浮点型则商是浮点也是浮点型

2.取余运算符的运算对象只能为int类型,结果为整除后的余数,余数符号与被除数相同

3.关系运算和逻辑运算结果为逻辑值

流程控制【重点】

什么是流程控制

代码执行的顺序

流程控制的分类

顺序

选择:有选择的执行某些语句

分类

1.if

  • if的最简单用法

if后面括号内的表达式为真,则执行if后面的语句

#include<stdio.h>
int main()
{   if (6>5)
   {
        printf("aaaa");
   }
    return 0;
}
  • if的范围问题

if默认控制其后的第一个语句,若要控制两个或两个以上的语句则要用大括号{}

#include<stdio.h>
int main()
{   if(9>8)
         printf("aaaa");
         printf("bbbb");//if不控制printf("bbbb");

    return 0;
}
#include<stdio.h>
int main()
{   if(9>8)//if控制一下两个语句
    {    printf("aaaa");
         printf("bbbb");
    }
    return 0;
}
  • if...else...的用法
#include<stdio.h>
int main()
{   int i;
    int j;
    
    scanf("%d %d",&i,&j);
    
    if (i>j)
        printf("i>j");
    else//否则(if不成立)
        printf("I<j");
        
    return 0;
}

else和if一样默认只控制后面的一个语句,若要控制多个语句要使用{}

  • if...else if...if的用法

#include<stdio.h>
int main()
{  int i;
   int j;
   
   scanf("%d %d"&i,&j);
   
   if(i>j)
      printf("i>j");
   else if(i==j)
      printf("i==j");
   if(i<j)
      printf("i<j");
        
   return 0;
}
  • C语言对真假的处理

    非零为真,零就是假。真用零表示,假用零表示。

  • if的用法举例

“分数分级”

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

    printf("请输入你的分数:",score);
    scanf("%f",&score);

    if (score > 100)
        printf("这是做梦");
    else if(score >= 90 && score <= 100)
        printf("优秀");
    else if(score < 90 && score >= 80)
        printf("良好");
    else if(score < 80 && score >=60)
        printf("及格");
    else if(score < 60 && score >0)
        printf("不及格");
    if (score == 0)
        printf("李在干神魔");


    return 0;
}

注意表达变量的范围时与数学上不同,例如不能写成2<a<4,来表示a位于(2,4)区间内 score.cpp - Visual Studio Code 2021_11_24 21_05_17.png

  • if常见问题

    1.空语句,一般来说if()后不加分号

    2.if后加;导致错误

if(...);//if后加;导致错误
 ptintf();
else()
 printf();

3.即使条件1和条件2都成立也只会执行A语句

if(条件1)
    A;
else(条件2)
    B;
else(条件3)
    c;

4.if...else if...else if最后不写else不会有语法错误但逻辑上有漏洞

5.else后有条件的话要写成else if

6.最后一个else();等价于执行d语句

if()
    a;
else if()
    b;
else if()
    c;
else ();
    d;

互换数字

关键引入中间变量存储数据

#include<stdio.h>
int main()
{  
    int i=89;
    int j=2;
    int x;


    x=i;
    i=j;
    j=x;

    printf("%d %d",i,j);

    return 0;
}
 

三个数的排序

2.switch

  • switch后面的表达式可以是任何形式

  • case后面的常量表达式必须为枚举常量、数字常量、字符常量

  • case不起判断的作用

  • switch不是循环是选择 例子

#include<stdio.h>
int main()
{   
    int x;
    printf("你要进入的楼层是");
    scanf("%d",&x);
    
    switch(x)
    case 1:
    printf("1层");
    break;
    case 2:
    printf("4层");
    break;
    case 3: 
    printf("3层");
    break;
    
    return 0;
}

break的用法【重点】

1.break用于循环表示终止循环

2.break用于switch则终止switch

3.break不能直接用于if,除非if属于循环内的子句

4.break只能用于终止与它最近的循环

5.多层switch中只能用于终止与它最近的swtich

continue

  • 用于跳过本次循环剩下的语句,转去判断是否需要执行下一次循环

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

分类

1.for

2.while

3.do while

4.break和continue

for循环
  • for的简单使用

i=1为第一步且只执行一次,i<=100为第二步,++1为第三步且第三步结束后为一次循环

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

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

    printf("%d",sum);

    return 0;
}

循环.cpp - Visual Studio Code 2021_11_25 12_41_05.png

  • for和if嵌套的使用 1.基础例子
#include<stdio.h>
int main()
{
    int i;
    int sum=0;

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

2.视频中的问题 求1-100间的奇数和,偶数和,奇数个数,奇数和的平均数

#include<stdio.h>
int main()
{
    int i;
    int sum1=0;
    int x=0;
    int average=0;
    int sum2=0;
    for(i=1;i<=100;++i)
    {
        if(i%2)
        {   x+=1;
            sum1=sum1+i;
        }
        else 
        {
         sum2=sum2+i;
        }
    }
    average=sum1/x;

    printf("奇数的个数为%d\n",x);

    printf("奇数和为%d\n",sum1);

    printf("平均数为%d\n",average);

    printf("偶数和为%d",sum2);

    return 0;
}
/*输出结果为
奇数的个数为50
奇数和为2500
平均数为50
偶数和为2550
*/

for和if嵌套.cpp - Visual Studio Code 2021_11_25 13_47_41.png

  • 强制类型转换:

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

2.例子

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

    for(i=1;i<=100;++i)
    {
        sum = sum + 1/(float)(i);
        //(float)(1/i)错误,这样并没转换类型
        //还可以写为sum = sum + 1.0/i;(推荐使用这种方式)
    }
    printf("sum = %f\n",sum);

    return 0;
}

强制类型转换.cpp - Visual Studio Code 2021_11_25 21_10_48.png

  • 浮点数存错带来的问题

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

2.循环更新的变量不能定义成浮点型因为浮点型不能保证准确存储一个数

3.举例:如何判断浮点型变量x是否为零,将x与一个很接近零的数进行比较

  • 多层for的嵌套使用【极重要】 1.基本
for ( 1 ; 2 ; 3 )
    /*先执行1,然后执行2若为真则执行4,再执行5若为真则执行a;再执行6再执行5若为真则继续循环,若为假则执行3
      先执行1,然后执行2若为真则执行4,再执行5若为假则执行3
      先执行1,然后执行2若为假停止循环
    */
    for ( 4 ; 5 ; 6)//相当于一个语句
        a;

2.例子

#include<stdio.h>
int main()
{ int i;
  int j;
  
  for(i=0;i<3;++i)
      for(j=2;j<6;++j)
          printf("xixi")
      printf("haha")
      
    return 0;
}

while

1.for和while的比较

  • for和while可以互相转化

  • while的()内只有执行条件

  • 推荐多使用for因为for的逻辑性更强

do...while(不经常使用)

  • 与while、for的比较

  • 多用于人机交互

  • 不等价于while、for

  • 举例(一元二次方程)

#include<stdio.h>
#include<math.h>
int main()
{
    double a;
    double b;
    double c;
    char ch;
    do
    {
        printf("输入二次项系数:");
         scanf("%d",&a);
        printf("输入一次项系数:");
         scanf("%d",&b);
        printf("输入常数项");
         scanf("%d",&c);
        double  delta;
        delta=b*b-4*a*c;
        if(delta>0)
        {
         double x1=(-b+sqrt(delta))/2*a;
         double x2=(-b-sqrt(delta))/2*a;
         printf("该方程有两根x1=%f,x2=%f",x1,x2);
        }
        else if(delta==0)
        {
         double x=-b/2*a;
         printf("该方程有两个相同的根%f2",x);

        }
        else
        printf("无解");
        printf("continue(Y/N)\n");
        scanf(" %c,ch");
    }
        while ('y'==ch || 'Y'==ch);
        
        
    
    return 0;
}

一元二次方程.cpp - Visual Studio Code 2021_11_25 22_44_18.png

自增自减

  • 自增或自减

分类

1.前自增 -- ++i

2.后自增 -- i++

前后自增的异同 1.相同:都使i加1

2.不同:前自增是i加1后的值,后自增为i+1前的值

为什么有自增

1.这样代码更简练

2.自增的速度更快

流程控制为什么重要

图灵指出无论程序多么复杂,顺序,选择,循环这种流程控制的思想可以解决所有的问题

怎么看懂一个程序

1.流程

2.每个语句的功能

3.试数

C Primer Plus

  • 5.10 7.输出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 day1;
        int day2;
        int day3;
        

	printf("输入天数 : ");
	scanf("%d", &day1);
	day2=(day1)/7;
        day3=(day1)%7;
       
		printf("这些 %d 天是 %d 周, %d 天.\n", day1,day2,day3);


	return 0;
}


看答案之后得出

#include <stdio.h>

int main()
{
	int first;
	int second;
	printf("This program computes moduli.\n");
	printf("Enter an integer to serve as the second operand: ");
	scanf("%d", &second);
	printf("Now enter the first operand: ");
	scanf("%d", &first);
	while (first > 0)
	{
            printf("%d %% %d is %d\n", first, second, first % second); 

            printf("Enter next number for first operand (<= 0 to quit): ");
            scanf("%d", &first); 
	}

    return 0;
}

  • 6.16

不会做

/*#include<stdio.h>
int main()
{
	printf("请输入大写字母");
	int i;
	char ch[10];

	scanf("%s",&ch);

	for(i=1;i<=5;++i)
		printf("%s\n",ch);
	return 0;
}
*/
#include <stdio.h>

void print_spaces(unsigned int n);

int main(void)
{
	char uppercase_letter;
	char c1, c2;

	do // get uppercase letter from user
	{
		printf("Enter an uppercase letter: ");
		scanf(" %c", &uppercase_letter);
	} while (uppercase_letter < 'A' || 'Z' < uppercase_letter);

	for(c1 = 'A'; c1 <= uppercase_letter; c1++)
	{
		// print opening spaces
		print_spaces(uppercase_letter - c1);

		// print letters
		// ascending
		for (c2 = 'A'; c2 < c1; c2++)
		{
			printf("%c", c2);

		}
		// descending
		for (; 'A' <= c2; c2--)
		{
			printf("%c", c2);
		}

		// print closing spaces
		print_spaces(uppercase_letter - c1);
		printf("\n");
	}

	return 0;
}

void print_spaces(unsigned int n)
{
	for (int i = 0; i < n; i++)
	{
		printf(" ");
	}
}

不会

#include <stdio.h>

int main(void)
{
	long int limit;
	float sign = 1.0f;
	float series1 = 0, series2 = 0;

	printf("Enter a number of terms to sum: ");
	scanf("%ld", &limit);

	for (long int i = 1; i <= limit; i++)
	{
		series1 += 1.0f/i;
		series2 += (1.0f/i) * sign;
		sign = -sign; // toggle sign
	}

	printf("The %ldth partial sum for series 1 is: %.5f\n", limit, series1);
	printf("The %ldth partial sum for series 2 is: %.5f\n", limit, series2);

	// Answer: Series 1 has no limit. Series 2 appears to be bounded above

	return 0;
}

#include <stdio.h>

int main(void)
{
	const int DUNBARS_NUMBER = 150;

	int friends = 5, week = 0;

	printf("Week | Friends\n");
	printf("-----+--------\n");
	while (friends < DUNBARS_NUMBER)
	{
		printf("%4d | %7d\n", week, friends);
		week++;
		friends -= week;
		friends *= 2;
	}

	return 0;
}

wuwu.cpp - Visual Studio Code 2021_11_25 23_47_41.png

  • 7.11

a.number>=90 && number<100

b.ch!=q || ch!=k

c.number>=1 && number<=9 && number!=5

d.number>9 && number<1

q
c
h
b
#include<stdio.h>
int main()
{
    char ch;
    
    while((ch=getchar())!='#')
    {
        if(ch=='\n')
        printf("step 1\n")
        if (ch=='c')
        else if(ch=='b')
            break;
       else if(ch=='h')
       printf("step 2\n")
      laststep:printf("step 3\n");
    }
    printf("done\n")
    return 0;
}