C语言(3)

本文介绍了C语言中的运算符,包括除法与取模、逻辑运算符的真假处理,以及流程控制结构如if、if...else...和循环(for、while)。特别强调了if的范围问题和优先级规则,同时提供了代码示例来解释如何交换变量和找出一组数字中的最大值。此外,还讨论了浮点数在循环中的精度问题和输入字符时的空白符处理。
摘要由CSDN通过智能技术生成

课堂理论知识

运算符

image.png

image.png

image.png

1.除法与取模的运算
  • 其中除法的运算结果与预算对象有关,两个书都是int,则商也是int,若商有小数,则截取小数部分;被除数和除数只要有一个是浮点型,则商也是浮点型,不截取小数部分。
    如:16/5=3,16/5.0=3.20000,-13/4=-4.
  • 取余%的运算对象必须是整数,结果是整除后的余数,其余数的符号与被除数相同。
    如13%3=1,13%-3=1,-13%-2=-1

测试运算符的代码例子

#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
!真————>假
!假————>真
真&&假————> 假
假&&真————> 假
假&&假————> 假

真||假————>真
假||真————>真
真||真————>真
假||假————>假

2.C语言对真假的处理

非零是真 零是假
真是1表示 假是0

重点:1.&&当左边的表达式为假,右边的表达式肯定不会执行。
2.||当左边的表达式为真,右边的表达式肯定不会执行。

3.执行的优先级

image.png

优先级:算术>关系>逻辑>赋值
注:遇到优先级问题时,为提高代码可读性,尽量使用括号,不要写出有歧义的代码。一行代码不要出现多个自增自减符号,这会被视作垃圾代码。

流程控制

1.什么是流程控制

C———>C++ java C#
程序代码执行的顺序。

2.流程控制的分类

顺序执行
选择执行

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

- 1.if 最简单的用法

格式:

if(表达式)  
语句 A; 

功能:如果表达式为真,执行语句。
如果表达式为假,语句不执行。

#include<stdio.h>
int main()
{
	if(5>4);
	printf("AAAAAA");
	return 0;
}

image.png

- 2.if的范围问题

if默认只能控制一个语句的执行;

if(表达式)
语句A;
语句B; 

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

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

此时if能控制多个语句,要想控制多个语句用{}括起来。

- 3.if…else…的用法
  • 4.if…else if…else…的用法
    格式:
if()
语句A;
else()
语句B;
else()
语句C;
else()
语句D:
- 5.C语言对真假的处理

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

- 6.if举例–求分数的等级
#include<stdio.h>
int main()
{
	float score;//定义score
	printf("请输入你的考试分数:");
	scanf("%f", &score);
	if(score > 100)
	printf("做梦吧");
	else if(score<=100 && score>=90)//不能写成90<=score<=100
	printf("优秀");
	else if(score<90 && score>=60)
	printf("良好");
	else if (score<60 && score>=0)
	printf("学废啦");
	return 0;


}

image.png

- 7.if的常见问题解析
如何交换A,B的值?

找一个中间变量C

#include<stdio.h>
int main()
{
  int i=4;
  int j=6,t;
   t=i;
   i=j;
   j=t;
   printf("i=%d,j=%d",i,j);
  return 0;
}

image.png

几个数中的最大值问题?

(代码为自己所打,与赫老师不同,其中运用到数组知识)

#include<stdio.h>
int main()
{
	int num[10];
	int i;
	printf("请输入十个数:");
	for (i = 0; i < 10; i++)
	{
		scanf("%d", &num[i]);
	}
	int temp;
	temp = num[0];
	int j;
	for (j = 0; j < 10; j++)
	{
		if (temp < num[j])temp = num[j];
	}
	printf("其中最大的数为:%d\n", temp);
	return 0;
}

image.png

-8.if常见问题

if();<–错误(不能再if后加分号)if默认只能控制一个语句。
else if(条件语句)中的if不能省略不然不成立。
swith

循环执行

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

for

格式:

  for(1;2;3;)
  {
     语句A;
  }
执行的流程:

image.png
执行的顺序:
1245A6(如果5成立)执行6A(5成立)6A……内循环结束才结束;
1245A6(如果5不成立)执行3245A同上执行。
image.png

例子1×2+3×4+5×6+…+99×100(为个人所写的题)
#include<stdio.h>
int main()
{
	int i, sum=0;
	for (i = 1; i<= 99; i=i+2)
	{
		printf("%d*%d\n",i,i+1);
		sum+=i*(i+1);
	}
	printf("%d\n",sum);
}

image.png

i的循环.
#include<stdio.h.>
int main()
{
int i,sum=0;
for (i=3;i<=10;i++)
{
    if(i%3 == 0)
       sum=sum+i;
    printf("sum=%d\n",sum);
}
    return 0;
}

image.png

1+2+3+…+99+100=?
#include<stdio.h.>
int main()
{
int i,sum=0;
for (i=1;i<=100;i++)
{
       sum=sum+i;
    printf("sum=%d\n",sum);
}
    return 0;
}

image.png

  • i++与++i的讨论不重要
while

image.png

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;
}
 do
 { 
 
 }while(1)
switch

传送门
image.png

image.png

break和continue

image.png
只能终止离他最近的循环
continue

image.png

如何看懂一个程序

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

对一些小算法的程序

对一些小算法的程序尝试自己去编程解决它,大部分人都自己无法解决,如果解决不了,就看答案关键是把答案看懂,这个要花很大的精力,也是我们学习的重点看懂之后尝试自己去修改程序,并且知道修改后程序的不同输出结果的含义照着答案去敲,调式错误,不看答案自己把答案敲出来,如果实在没法理解,就背会。

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

image.png

课后作业

5.10

第七题

image.png
sos:4 4.00

第十三题

1.x–或x-=1或x=x-1
2.m=n%k
3.p=q/b-a
4.x=(a+b)/(c*d)

5.11

第三题

image.png

第八题

image.png

6.16

第五题

不会做,把答案看懂了这里把答案贴出来。加了些注释

#include <stdio.h>

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(" ");
	}
}
第十二题

看答案看懂的

#include <stdio.h>
int main(void)
{
	long int a;
	float b = 1.0f;
	float c1 = 0, c2 = 0;

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

	for (long int i = 1; i <= a; i++)
	{
		c1 += 1.0f/i;
		c2 += (1.0f/i) * b;
		b = -b; // 切换 b
	}

	printf("The %ldth partial sum for c 1 is: %.5f\n", a, c1);
	printf("The %ldth partial sum for c 2 is: %.5f\n", a, c2);

	// 答:系列 1 没有限制。系列 2 似乎在上面有界限

	return 0;
}

image.png

第十八题
#include<stdio.h>
int main()
{  int friends = 5;
   int weeks  = 1;
   const int number=150;
    do
    {
        weeks++;
        friends= ( friends - 1 )*2;
        printf("第%d周,还有%d个朋友\n",weeks,friends);
    } while (friends < number);
    printf("After %d weeks he's friend are more than 150.", weeks);
    return 0;
}

image.png

7.11

第二题
1. number>=90 && nuber<100
2.ch != 'q' && ch != 'k'
3.(number>=1 && number<=9) && number! = 5
4.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;
}

image.png

问题列表:

强制类型转换:

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

为什么循环中更新的变量不能用浮点型定义?

float和double不能保证能精确存储一个小数。

进制的转换问题

image.png

三目运算符

image.png

逗号运算符

image.png
j的值为1;从左到右运行.

image.png

输入字符时的空白符问题

image.png
输入字符时必须加个空白符scanf(“空格%c”,&ch)
可以重复运行此程序.
杭电oj账号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值