课堂理论知识
运算符
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;
}
!真————>假
!假————>真
真&&假————> 假
假&&真————> 假
假&&假————> 假
真||假————>真
假||真————>真
真||真————>真
假||假————>假
2.C语言对真假的处理
非零是真 零是假
真是1表示 假是0
重点:1.&&当左边的表达式为假,右边的表达式肯定不会执行。
2.||当左边的表达式为真,右边的表达式肯定不会执行。
3.执行的优先级
优先级:算术>关系>逻辑>赋值
注:遇到优先级问题时,为提高代码可读性,尽量使用括号,不要写出有歧义的代码。一行代码不要出现多个自增自减符号,这会被视作垃圾代码。
流程控制
1.什么是流程控制
C———>C++ java C#
程序代码执行的顺序。
2.流程控制的分类
顺序执行
选择执行
定义:
某些代码可能执行,也可能不执行,有选择的执行某些代码。
分类:
- 1.if 最简单的用法
格式:
if(表达式)
语句 A;
功能:如果表达式为真,执行语句。
如果表达式为假,语句不执行。
#include<stdio.h>
int main()
{
if(5>4);
printf("AAAAAA");
return 0;
}
- 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;
}
- 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;
}
几个数中的最大值问题?
(代码为自己所打,与赫老师不同,其中运用到数组知识)
#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;
}
-8.if常见问题
if();<–错误(不能再if后加分号)if默认只能控制一个语句。
else if(条件语句)中的if不能省略不然不成立。
swith
循环执行
定义:某些代码会被重复执行。
分类:
for
格式:
for(1;2;3;)
{
语句A;
}
执行的流程:
执行的顺序:
1245A6(如果5成立)执行6A(5成立)6A……内循环结束才结束;
1245A6(如果5不成立)执行3245A同上执行。
例子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);
}
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;
}
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;
}
- i++与++i的讨论不重要
while
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
break和continue
只能终止离他最近的循环
continue
如何看懂一个程序
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;
}
课后作业
5.10
第七题
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
第三题
第八题
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;
}
第十八题
#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;
}
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;
}
问题列表:
强制类型转换:
格式:(数据类型)(表达式)
功能:把表达式的值强制转换为前面所执行的数据类型
例子:(int)(4.5+2.2)最终值为 6;
(float)(5) 最终值为5.000000
为什么循环中更新的变量不能用浮点型定义?
float和double不能保证能精确存储一个小数。
进制的转换问题
三目运算符
逗号运算符
j的值为1;从左到右运行.
输入字符时的空白符问题
输入字符时必须加个空白符scanf(“空格%c”,&ch)
可以重复运行此程序.