C语言集训-李明航-第四次作业

175 阅读3分钟

课堂笔记

运算符

1.算术运算符
名称符号
+
-
*
/
取余数%
2.关系运算符
名称符号
大于>
大于等于>=
小于<
小于等于<=
不等于!=
等于==
3.逻辑运算符
名称符号
并且&&
两个竖杠
4.赋值运算符
标题
等于=
加等+=
乘等*=
除等/=
减等-=
5.优先级别

算数>关系>逻辑>赋值

6.特别注意
  • 除法的时候在计算机中如果除数和被除数都是整数那么取值也是整数(不精确)
  • 除法的时候如果除数或被除数有一个是小数那么得数也将是小数
  • 取余数的计算中运算对象必须是整数,结果是整出后的余数
  • 除法和取余数的计算中结果的正负与除数保持一致
  • ||左边的表达式是假的时候,右边的表达式不再执行
  • &&左边的表达式是真的的时候,右边的表达式不再执行 下面是取余数的运算示范:

QQ截图20211123162643.png

*流程控制

1.是那么是流程控制

答.程序代码的执行顺序

2.流程控制的分类

  • 顺序执行:按照顺序执行
  • 选择执行:定义:某些代码可能执行也可能不执行,进行选择性地执行
  • 循环执行:部分多次执行

3.流程控制的重要性

答.学习C语言必须彻底掌握流程控制,对于学习类c语言也有总大作用 选择执行:

4.if

1).if的最简单用法

if(表达式)如图所示

QQ截图20211123171424.png

{
    if (3>2);
    printf("AAAA\n");
    return 0;
}

if(功能)如图所示

QQ截图20211123172152.png

    if(3)
    printf("AAAA\n");    //会输出
    if(0)            
    printf("BBBB\n");    //不会输出
    if(0==0)
    printf("CCCC\n");    //会输出
    
    return 0;
}
2)if的范围问题

如图所示:

QQ截图20211123172558.png

QQ截图20211123172538.png 其中一个的代码:

```int main (void)
{
    if(3 > 2)
    printf("aaaa\n");
    printf("bbbb\n");

    return 0;
}

由两图的运算结果可知if默认的仅仅只能控制一个语境 如图所示:

QQ截图20211123190435.png

{
    if(3 > 2)
    {
        printf("aaaa\n");
        printf("bbbb\n");
    }
    return 0;
}

如图可知当if之下的条件被大括号括起来之后可以一并执行

3)if..else..的用法

如图所示:

QQ截图20211123191923.png


int main (void)
{

    if("3 > 5")
     printf("aaaa\n");
    else
     printf("bbbb\n");
    return 0;
}
4)if..eles if..else...的用法

QQ截图20211123193733.png

{
    if (3 > 5)
        printf ("aaaa\n");
    else if (3 == 5)
        printf ("bbbb\n");
    else
        printf ("cccc\n"); 

    return 0;
}

遇到的问题;1.判断语句后不能加引号,不然会恒成立。2.最后的else不能加条件

5)C 语言的真假处理

答.C语言对真假的处理非零就是真,真是1,假是0

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

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>=60 && score<=90)
    printf("良好\n"); 
    else if(score>=0 && score<=60)
    printf("不合格\n");
    else
    printf("输入错误\n");
    return 0;
}

在终端就可以进行分数的输入以及等级的评判

如图所示:数字变换程序

QQ截图20211124164807.png

```int main(void)
{
    int j = 3;
    int i = 5;
    int t;

    t = i;
    i = j;
    j = t;
    printf("i = %d j = %d", i , j);
    
    return 0;
}

如图所示:三个数互相比较的代码


int main(void)
{
    int a;
    int b;
    int c;
    int t;
    printf("请输入三个整数、n");
    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;

5.switch

  • switch
  • 循环
  • 定义:某些代码会被重复执行
  • 分类: for(最重要也是最难的)
  • 1.格式:
  • for(1;2;3;)
  • 语句A
  1. 执行的流程(重点)
  2. 范围的问题
  3. 举例 如图所示:

QQ截图20211125123705.png

{
    int i;
    int sum = 0;

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

    return 0;
}

循环举例(for的应用)

QQ截图20211125123858.png

{
    int i;
    int sum = 0;

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

    return 0;
}

可以被三整除的数的加和(for和if的合并应用)

QQ截图20211125124150.png

{
    int i;
    int sum = 0;

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

    return 0;
}

如果将printf与if放在一个大括号里结果如何 如图所示:

QQ截图20211125124507.png

{
    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;
}
  • (int)(4.5+2.2) 最终值是 6
  • (float)(5) 最终值是5.00000 用单精度浮点型计算 如图所示:

QQ截图20211125160206.png

{
    float i;
    float sum = 0;

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

    return 0;
}

错误程序示范:循环中更新的变量不能定义为浮点型

QQ截图20211125161005.png

{
    float i;          //错误程序,因为for循环中更新的变量不能定义为浮点型
    float sum = 0;

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

练习:把前一百位的奇数和计算出来

QQ截图20211125162123.png


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

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

用for和if取平均值的 如图所示:

QQ截图20211125181143.png

{
    int i;
    int sum = 0;
    int cnt = 0;
    float avg;

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

多个for的执行流程 for(1;2;3)

for(4;5;6)

A

B

答:以上为两个语句分别是上B上边的全部,和B两个部分,执行顺序为1-2-4-5-a-6-5-a(不可行时)-1-2-3-b 示例 如图所示:

QQ截图20211125191205.png

{
    int i , j;
    
    for(i=0;i<3;++i)
        for(j=2;j<5;++j)
        printf("aaaa\n");
    printf("bbbb\n");    
    return 0;
}

出现了九个aaaa 一个bbbb 示例2:如图所示:

QQ截图20211125192121.png

{
    int i , j;
    
    for(i=0;i<3;++i)
    {    printf("cccc\n"); 
        for(j=2;j<5;++j)
        {
           printf("aaaa\n");
           printf("bbbb\n");
        }  
        printf("dddd\n");
    }      
    return 0;
}

结果:

  • cccc
  • aaaa
  • bbbb
  • aaaa
  • bbbb
  • aaaa
  • bbbb
  • dddd
  • cccc
  • aaaa
  • bbbb
  • aaaa
  • bbbb
  • aaaa
  • bbbb
  • dddd
  • cccc
  • aaaa
  • bbbb
  • aaaa
  • bbbb
  • aaaa
  • bbbb
  • dddd 可知for的应用

如何学习一些需要算法的程序

  1. 尝试自己去编程解决它
  2. 如果解决不了那就看答案
  3. 看懂之后自己去修改程序
  4. 照着答案去敲
  5. 调试错误
  6. 不看答案,自己独立的把答案敲出来
  7. 如果程序实在无法理解,那就把他背会

6.一些琐碎的运算符知识

自增(或者自减)

  • 前自增 -- ++i
  • 后自增 -- i++ 前自增和后自增的区别:

QQ截图20211125181859.png

{
    int i, j, k, 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的值都加1
  • 不同:后自增整体表达式的值是i加一之前的值,前自增是表达式加1后的值
为什么会出现自增;
  1. 代码更精炼
  2. 自增的速度更快
学习自增要明白的几个问题
  1. 我们学习编程要尽量屏蔽到前自增和后自增的差别
  2. 自增的表达式更好不要作为一个更大的表达式的一个部分
  3. i++ 和 ++i单独成一个语句,不要把他作为一个完整的复合语句来使用
  4. int m = i++ + ++i + i + i++这样写不仅不正确,无法移植

2.三目运算符

格式 A ? B : C

等价于if(A)

B;

else

C;

3.逗号表达式

  • 格式(A,B,C,D)
  • 功能从左向右执行 最终表达式的值是最后一项的值

QQ截图20211125185947.png

{
    int i;
    i = (3,2,5,6);
    printf("%d\n",i);
    return 0;
}

while

1.执行顺序 格式 :

while(表达式)

 语句;

2.与for之间的相互比较

while和for可以相互转化但是for的逻辑性更强更推荐你用for

3.举例

  • 从键盘中输入一个数字,如果改数字为回文数
  • 则返回yes,否则就返回no
  • 回文数:正着写和倒着写都一样121 12321

switch

switch的应用举例:

{
    int val;

    printf("请输入你要进入的楼层:");
    scanf("%d",&val);

    switch(val)
    {
        case 1:
           printf("一层开\n");
           break;
        case 2;
           printf("二层开\n");
           break;
        case 3;
           printg("四层开\n");
           break;
        default:
           printf("没有盖到这一层\n");
           break;
    }    
    return 0;
}

输入相应的数字将得到相应的结果

break的作用是终止程序的作用
  1. 所有case后面的常量表达式为便于描述我们姑且称之为标签,这些标签只能是(1)枚举变量(2)数值变量(3)常数变量(4)常变量(5)宏名中的一种
  2. switch后边的括号里的表达式允许是任何类型。但是vc++只允许是int或者是char类型
  3. switch是选择不是循环,如果switch中出现了break语句。该语句的功能只是推出switch语句转去执行他下面的语句。在switch中出现continue是错误的,除非switch本身就属于for或while循环的一部分。
break
  • break如果用于循环是用来终止循环
  • break如果用于switch,则是用于终止switch
  • break不能直接用于if,除非if属于循环内部的一个子句
  • 在多层循环中,break只能终止距离他最近的那个循环
  • 多层switch嵌套中break只能终止距离他最近的switch
continue

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

随堂作业

第七题 如图所示:

QQ截图20211125224841.png 第十三题

  • a.x-=1
  • b.m = n % k
  • c.p = (q / b) - a
  • d.x = (ab) / (cd)

第三题

QQ截图20211125225429.png

{
    int a,b,c;
     printf("请输入天数:");
     scanf("%d",&a);
     b=a/7;
     c=a%7;
     printf("%d周%d天",b,c);

    return 0;
}

第八题

QQ截图20211125225824.png

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

第五题

QQ截图20211125230802.png


void print_spaces(unsigned int n);

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

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

	for(c1 = 'A'; c1 <= uppercase_letter; c1++)
	{
		print_spaces(uppercase_letter - c1);

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

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

		print_spaces(uppercase_letter - c1);
		printf("\n");
	}

	return 0;
}

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

做不出来了跟着答案敲出来的 十二题


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


	return 0;
}

还是答案

第二题

  1. num >= 90 && num < 100;
  2. char ch!='q'&&ch!='k'
  3. num>=1&&num<=9&&num!=5;
  4. num<1||num>9; 第十题

#define SINGLE 1
#define HEAD_OF_HOUSEHOLD 2
#define MARRIED_JOINT 3
#define MARRIED_SEPARATE 4
#define EXIT 5

#define RATE_1 0.15f
#define RATE_2 0.28f

void flush_input_buffer(void);

int main(void)
{
	int category;
	float income, bracket, taxes;

	printf("US 1988 Tax Calculator\n");

	while(1)
	{
		printf("1) Single  2) Head of Household  3) Married, Joint  4) Married Separate\n");
		printf("Enter your tax category (1-4) or 5 to quit: ");
		scanf("%d", &category);

		switch (category)
		{
			case (SINGLE) :	
					bracket = 17850.0;
					break;
			case (HEAD_OF_HOUSEHOLD) :
					bracket = 23900.0;
					break;
			case (MARRIED_JOINT) :
					bracket = 29750.0;
					break;
			case (MARRIED_SEPARATE) :
					bracket = 14875.0;
					break;
			case (EXIT) : 
					printf("Bye.\n");
					return 0; // Exit Program
			default :
					flush_input_buffer();
					printf("Invalid input: please enter an integer between 1 and 5.\n");
					continue;
		}
		printf("Enter your income: ");
		while (scanf("%f", &income) != 1 || income < 0)
		{
			flush_input_buffer();
			printf("Invalid input: please enter a positive number.\n");
			printf("Enter your income: ");
		}

		if (income > bracket)
			taxes = RATE_2 * (income - bracket) + RATE_1 * bracket;
		else
			taxes = RATE_1 * income;

		printf("You will owe $%.2f in taxes.\n\n", taxes);
	}
}

void flush_input_buffer(void)
{
	while (getchar() != '\n')
		;
}

作业总结:丝毫没有自己动手能力,几乎都是全照着答案敲或者借鉴

注册杭电oj账号

微信图片_20211125232947.jpg