上节课的题
上节课的题,大家都做出来了吗?
看一下这道题:
题目描述
N!=1*2*...*N;
例5!=1*2*3*4*5=120.
编程求1!+2!+3!+...+N!.
输入
输入一行,只有一个整数n (1<=n<=10)
输出
输出只有一行(这意味着末尾有一个回车符号),包括1个整数。
代码
#include <iostream>
#include <cstdio>
using namespace std;
int n,c=1,v; //变量,n是题目中的,c是单次阶乘的积,v是总和
int main(){
cin>>n; //输入
for(int i=1;i<=n;i++){ //从1~n,进行的n次阶乘
for(int j=1;j<=i;j++){ //阶乘,(为什么是"j=1;j<=i;j++"呢),因为第一次阶乘乘到1,第二次乘到2........
c*=j; //一次一次乘
}
v+=c; //一个数乘完后,加给总和
c=1; //重置
}
cout<<v<<endl; //最后输出
return 0;
}
好了,非好不多说,我们直接进入正课.
五.大名鼎鼎的while循环
1.while格式
学过Python的朋友应该知道while.
while的格式是:
while(条件){
需要执行的代码(循环节);
......
}
非常的简单.
2.通俗易懂的讲解
while循环,用Scratch的话来说,就是循环执行至...
但在C++中,while是: 只要.....,就循环
它是这样的,如上述代码,每次循环前,while循环都会进行一次判断.
若条件成立(返回值为true),执行"循环节"
若条件不成立(返回值为false),跳出循环,来到循环下面,继续执行
3.while循环的好处
while循环的好处有以下几点:
1. 灵活性:while循环允许根据特定的条件来重复执行一段代码,因此可以根据不同的情况来灵活地控制循环的次数。
2. 可读性:while循环的结构相对简单,易于理解和阅读。它只需要检查条件是否为真,然后执行循环体中的代码,这使得代码的逻辑更加直观。
3. 适用性:while循环适用于不确定循环次数的情况。当循环次数不能提前确定时,可以使用while循环来实现灵活的循环控制。
4. 有效性:由于while循环只需要检查条件是否为真,而不需要进行其他额外的操作,因此执行效率相对较高。
5. 可控性:while循环可以结合其他控制语句(如break和continue)来实现更复杂的控制流程,从而更灵活地控制循环的执行。
总的来说,while循环具有灵活性、可读性、适用性、有效性和可控性等优点,能够满足各种循环需求,是程序中常用的循环结构之一。
4.and or not
这三个东西,想必大家都不陌生
(1).and
and,与的意思,在代码中,and的左右两头各接一个表达式,起到胶水的作用.
int a=8; int b=4; if(a>b and a/b==2){ cout<<"Yes"; }
你说代码会输出什么?
答案:输出Yes
and两头有两个条件
a>b
a/b==2
先看第一个,a是8,b是4,a>b,成立
第二个,a/b=8/4=2 成立
故输出Yes
and两边只要有false,不管有几个,都返回false,只有都是true的情况下,才返回true,明白了吗?
(2).or
or,或的意思,在代码中,or的左右两头也是各接一个表达式
int a=4; int b=12; if(a>b or a*3==b){ cout<<"Yes"; }
来,看第一个条件表达式,a>b,4不大于十二,不成立(False)
第二个条件表达式,a*3==b,4*3=12,成立(True)
or和and不同,只要两边有true,不管几个,都返回true
如果全是false,那就返回false
(3).not
这里的not,是取反的意思,它后面只跟一个条件表达式,但它可以让那个表达式的结果反转
not 1>3
看上面代码,1>3,很显然是False
但前面有个not,就不一样了,not可以让True变False
也可以让False变True
所以,not 1>3 的结果是:True
5.优先级那些事
优先级大全一览
C++中and、or和not运算符的优先级从高到低分别为not、and、or。not运算符的优先级最高,and运算符次之,or运算符的优先级最低1。
运算符的优先级顺序
在C++中,运算符的优先级顺序如下:
- 圆括号【()】:最高优先级,用于改变运算顺序。
- 下标运算符【[]】:第二级,用于访问数组元素。
- 成员访问运算符【.】和指向成员运算符【->】:第三级,用于访问对象的成员。
- 逻辑非运算符【!】:第四级,用于逻辑非操作。
- 按位取反运算符【~】:第五级,用于按位取反操作。
- 自增自减运算符【++ --】:第六级,用于自增和自减操作。
- 负号运算符【-】:第七级,用于取负值。
- 类型转换运算符【(类型)】:第八级,用于类型转换。
- 指针运算符和取地址运算符【*和&】:第九级,用于指针操作。
- 长度运算符【sizeof】:第十级,用于获取对象或类型的大小。
- 乘法运算符【*】和除法运算符【/】:第十一级,用于乘法除法运算。
- 取余运算符【%】:第十二级,用于取余操作。
- 加法运算符【+】和减法运算符【-】:第十三级,用于加法和减法运算。
- 左移运算符【<<】和右移运算符【>>】:第十四级,用于位移操作。
- 关系运算符【< > <= >=】:第十五级,用于比较操作。
- 等于运算符【==】和不等于运算符【!=】:第十六级,用于等于和不等于比较。
- 按位与运算符【&】:第十七级,用于按位与操作。
- 按位异或运算符【^】:第十八级,用于按位异或操作。
- 按位或运算符【|】:第十九级,用于按位或操作。
- 逻辑与运算符【&&】:第二十级,用于逻辑与操作。
- 逻辑或运算符【||】:第二十一级,用于逻辑或操作。
- 条件运算符【?:】:第二十二级,用于条件判断。
- 赋值运算符【= += -= *= /= %= >>= <<= &= |= ^=】:第二十三级,用于赋值操作。
- 逗号运算符【,】:第二十四级,用于顺序执行多个表达式。
逻辑运算符的优先级和用法
- not(!):逻辑非运算,优先级最高。例如:
!a
表示a为假时结果为真。 - and(&&):逻辑与运算,优先级高于or(||)。例如:
a && b
表示a和b都为真时结果为真。 - or(||):逻辑或运算,优先级最低。例如:
a || b
表示a或b为真时结果为真。
小知识
not可简写为!
and可简写为&&
or可简写为||
我标蓝的是位运算,大家注意一下
6.来个题
题目描述
所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。如,假定初始整数为5,计算过程分别为16、8、4、2、1。
程序要求输入一个整数,将经过处理得到1的过程输出来。
输入
一个正整数N(N <= 2,000,000)
输出
从输入整数到1的步骤,每一步为一行,每一部中描述计算过程。最后一行输出"End"。如果输入为1,直接输出"End"。
样例输入
5
样例输出
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
End
代码
#include <iostream> //头文件
#include <cstdio>
using namespace std;
int n; //n,为初始数
int main(){
cin>>n; //输入n
while(n!=1){ //进行"角谷猜想"的运算(到1为止)
if(n%2==0){ //n只要除得开2,就是偶数
cout<<n<<"/2="<<n/2<<endl; //按格式输出一步
n/=2; //n进行除以2的运算
}
else if(n%2==1){ //n只要除不开2,就是奇数
cout<<n<<"*3+1="<<n*3+1<<endl; //按格式输出一步
n=n*3+1; //对n进行乘3加1的运算
}
}
cout<<"End"; //输出"End"
return 0; //没有return 0就毁了
}
好了.这个题到这,不再做赘述
六.一维数组登场
一维数组,是由数字组成的以单纯的排序结构排列的结构单一的数组,是计算机程序中最基本的数组。二维及多维数组可以看作是一维数组的多次叠加产生的。
在程序中可以使用下标变量,即说明这些变量的整体为数组,数组中的每个变量的数据类型是相同的。
当数组中每个元素都只带有一个下标时,称这样的数组为一维数组。
数组是计算机编程中的重要概念,运用数组可以方便地处理大规模的数据。
定义
数组的定义格式如下:
类型标识符 数组名[常量表达式]
说明:
①数组名的命名规则与变量名的命名规则一致
②常量表达式表示数组元素的个数。可以是常量或符号常量,不能为变量。
例如:
int a[10]; //数组a的定义是合法的 int a[n]; //若n为变量,则数组a的定义是非法的
使用
一维数组的引用主要通过下标法来实现,引用格式为:数组名[下标]。 在C语言中,数组的下标从0开始,因此一个具有N个元素的数组,其下标的范围是0到N-1。例如,定义一个数组int a;
后,可以通过a
来引用数组中第7个元素(因为下标从0开始计数)。12
一维数组的定义和初始化
一维数组的定义格式为:类型说明符 数组名[常量表达式];例如,int a;
定义了一个包含10个整数的数组。在定义数组时,可以初始化部分或全部元素,例如:
int a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
初始化前5个元素,其余自动填充为0。int a = {0, 1, 2, 3, 4};
初始化前5个元素,其余自动填充为0。int a[] = {1, 2, 3, 4, 5};
不指定数组长度,编译器会自动计算长度。
一维数组的引用示例
假设有一个数组int a = {1, 2, 3, 4, 5};
,可以通过以下方式引用其元素:
a
引用第一个元素,值为1。a[0]
a
引用第五个元素,值为5。
a[4]
一维数组的遍历
由于一维数组的元素只能逐个引用,不能一次性引用所有元素,通常需要使用循环语句逐个输出各元素的值。例如:
for (int i = 0; i < 5; i++) {
printf("%d ", a[i]);
}
这段代码会输出数组a
的所有元素。
也可以在后面定义
int a = {1, 2, 3, 4, 5};
......
......
......
a[0]=100;
a[1]=200;
像这样
练习
题目描述
给你m个整数,将其逆序输出
输入
第一行一个整数m(3 <= m <= 100 ):数的个数 第二行m个整数(空格隔开)(这些数在0-9999999之间)
输出
m个整数(空格隔开)
样例输入
3
1 7 5
样例输出
5 7 1
代码
#include<iostream>
using namespace std;
int n[101]; //它说最多100个数,但要有预留空间
int m; //这就是题中的m
int main(){
cin>>m; //先输入
for(int i=0;i<m;i++){ //从0开始,到m-1结束(正好m次)
cin>>n[i]; //输入
}
for(int j=m-1;j>=0;j--){ //从m-1开始,到0结束(正好反着来)[这里是j--]
cout<<n[j]<<" "; //别忘空格
}
return 0;
}
ok.
好了,今天的学习就到这里,我们下节课见.
下节预告
1.进行and or not 的练习
2.二维数组来了
3.一些零碎,但有用的知识
4.冒泡排序(初步尝试)