观课笔记
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;
}
总结:取余%的运算对象必须是整数,结果是整除后的余数,其余数的符号与被除数相同
逻辑运算符的拓展讲解
| 类别 | 真假 |
|---|---|
| 真&&真 | 真 |
| 真&&假 | 假 |
| 假&&真 | 假 |
| 假&&假 | 假 |
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;
}
注意:只要看k不等于零,都认为是给k赋了一个值
2.流程控制的分类
分类:
if
if最简单的用法
1.格式:if(表达式)
语句A:
语句B:
解释:if默认只能控制语句A的执行或不执行,if无法控制语句B的执行或不执行;或者讲:语句B一定会执行
功能:
如果表达式为真,执行语句;如果表达式为假,语句不执行
运行实例如下:
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;
}
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;
}
求三个数字的最大值
代码及运行情况如下
#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;
}
7.if的常见问题的解析
- 1.空语句的问题
-
if(3>2); - 等价于
-
if(3>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;
}
#include<stdio.h>
int main()
{
if(3>1)
printf("AAAA\n");
else if(3>2)
printf("BBBB\n");
else
printf("CCCC\n");
return 0;
}
总结:即便表达式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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
while
- 1.执行顺序: 格式:
while(表达式)
语句;
- 2.与for的相互比较 for和while可以相互转换
for(1;2;3)
A;
等价于
1;
while(2)
{
A;
3;
}
while和for可以相互转化
但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;
}
关于代码的解释:
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第七题:
运行结果:
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}