1、该系列为ACWing中c++语法课,已购买正版,课程作者为yxc(请大家支持正版)。
2、为啥写在这儿,问就是oneNote的内存不够了QAQ
ACwing C++ 语法笔记3循环结构
一、while循环
可以简单理解为循环版的if
语句。if
语句是判断一次,如果条件成立,则执行后面的语句;while
是每次判断,如果成立,则执行循环体中的语句,否则停止。
#include <iostream>
using namespace std;
int main()
{
int i = 0;
while (i < 10)
{
cout << i << endl;
i ++ ;
}
return 0;
}
-
练习:求1~100中所有数的立方和。
#include <iostream> using namespace std; int main() { int i = 1, sum = 0; while (i <= 100) { sum += i * i * i; i ++ ; } cout << sum << endl; return 0; }
-
练习:求斐波那契数列的第n项。
f(1) = 1
,f(2) = 1
,f(3) = 2
,f(n) = f(n-1) + f(n-2)
。#include <iostream> using namespace std; int main() { int n; cin >> n; int a = 1, b = 1, i = 1; while (i < n) { int c = a + b; a = b; b = c; i ++ ; } cout << a << endl; return 0; }
-
死循环:循环永久执行,无法结束。我们要避免写出死循环。
#include <iostream> using namespace std; int main() { int x = 1; while (x == 1) puts("!"); return 0; }
二、do while循环
do while
循环不常用。
do while
语句与while
语句非常相似。唯一的区别是,do while
语句限制性循环体后检查条件。不管条件的值如何,我们都要至少执行一次循环。(区别在第一次执行循环)
#include <iostream>
using namespace std;
int main()
{
int x = 1;
while (x < 1)
{
cout << "x!" << endl;
x ++ ;
}
int y = 1;
do
{
cout << "y!" << endl;
} while (y < 1);
==================省略写法===============
do i++; while (i<=10);
return 0;
}
- 用
while
循环表示do-while
循环(通过抽出第一次执行过程):#include <iostream> using namespace std; int main() { int j = 1; r +=j; j ++; while(j<=1){ r += j; j ++; } cout << r <<endl; int i = 1; do { s+=i; i ++; } while (i<=1); cout << s << endl; return 0; }
三、for循环
基本思想:把控制循环次数的变量从循环体中剥离。
for (init-statement : condition: expression)
{
statement
}
-
init-statement
可以是声明语句、表达式、空语句,一般用来初始化循环变量; -
condition
是条件表达式,和while
中的条件表达式作用一样;可以为空,空语句表示true
; -
expression
一般负责修改循环变量,可以为空。#include <iostream> using namespace std; int main() { for (int i = 0; i < 10; i ++ ) { cout << i << endl; } =============省略的写法=============== for (int i = 0; i < 10; i ++ ) cout << i << endl; return 0; }
-
init-statement
可以定义多个变量,expression
也可以修改多个变量。例如求1 * 10 + 2 * 9 + 3 * 8 + 4 * 7 + 5 * 6
。#include <iostream> using namespace std; int main() { int sum = 0; for (int i = 1, j = 10; i < j; i ++, j -- ) { sum += i * j; } cout << sum << endl; return 0; }
四、跳转语句
1. break
可以提前从循环中退出,一般与if
语句搭配。
-
例题:判断一个大于1的数是否是质数:
#include <iostream> using namespace std; int main() { int n; cin >> n; bool is_prime = true; for (int i = 2; i < n; i ++ ) if (n % i == 0) { is_prime = false; break; } if (is_prime) cout << "yes" << endl; else cout << "no" << endl; return 0; }
2. continue
可以直接跳到当前循环体的结尾。作用与if语句类似。
- 例题:求1~100中所有偶数的和。
#include <iostream> using namespace std; int main() { int sum = 0; for (int i = 1; i <= 100; i ++ ) { if (i % 2 == 1) continue; sum += i; } cout << sum << endl; return 0; }
五、多层循环
#include <iostream>
using namespace std;
int main()
{
for (int i = 0, k = 1; i < 10; i ++ )
{
for (int j = 0; j < 10; j ++, k ++ )
{
cout << k << ' ';
}
cout << endl;
}
return 0;
}
-
练习:打印1~100中的所有质数
#include <iostream> using namespace std; int main() { for (int i = 2; i <= 100; i ++ ) { bool is_prime = true; for (int j = 2; j < i; j ++ ) { if (i % j == 0) { is_prime = false; break; } } if (is_prime) cout << i << endl; } return 0; }
-
练习:输入一个n,打印n阶菱形。n是奇数。
#include <iostream> using namespace std; int main() { int n; cin >> n; int cx = n / 2, cy = n / 2; for (int i = 0; i < n; i ++ ) { for (int j = 0; j < n; j ++ ) if (abs(i - cx) + abs(j - cy) <= n / 2) cout << '*'; else cout << ' '; cout << endl; } return 0; }
六、循环读取数据
1、c++语言
1.1 while-true
循环读取数据,当读到字符0时退出:
#include <iostream>
using namespace std;
int main()
{
int x;
while(true){
cin >> x;
if(!x) break;
for(int i=1; i<=x; i++) cout << i << ' ';
cout << endl;
}
return 0;
}
1.2 利用cin的返回值
-
返回0表示没有读到值(或读到文件结束符);文件结束符EOF(end of file)也表示
-1
,读到EOF,cin
会返回0
或false
; -
在C语言中,或C标准函数库中EOF表示文件结束符。在while循环中以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是
0~127
,不可能出现-1
,因此可以用EOF作为文件结束标志。 -
scanf(“%d”,&n) != EOF
相当于scanf(“%d”,&n) != EOF
,或~scanf(“%d”,&n)
(其中~
表示非),或scanf(“%d”,&n) == 1
。scanf的返回值由后面的参数决定。 -
cin
读取文件代码:#include <iostream> using namespace std; int main() { int x; int cnt = 0; while(cin >> x) cnt ++; cout << cnt << endl; return 0; }
-
循环读取数据,当读到字符0时退出:
#include <iostream> using namespace std; int main() { int x; while(cin >> x && x){ //如果x是0则退出; if(!x) break; for(int i=1; i<=x; i++) cout << i << ' '; cout << endl; } return 0; }
-
逗号表达式是用逗号隔开的表达式,逗号表达式的值等于最后一个数的值,因此
(cin >> x , x)
的值等于x
的值,因此x是0就退出。且只在逻辑表达式中有用;#include <iostream> using namespace std; int main() { int x; while(cin >> x , x){ //如果x是0则退出; if(!x) break; for(int i=1; i<=x; i++) cout << i << ' '; cout << endl; } return 0; }
-
另外,在返回值中也可以使用逗号表达式:
#include <iostream> using namespace std; int main() { int x=5; int cnt = 0; if(cnt !=0, x==5) cout << "!" << endl; for(int i=0; false, i <=10; i++) cout << i << endl; return x=6, 0; //return 也可以用逗号表达式 }
1.3 用while(x!=0)的方法(java通用)
1.4 scanf 循环读取数据
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int x;
int cnt = 0;
while(scanf("%d", &x) != -1) cnt ++;
while(~scanf("%d", &x) ) cnt ++; //~表示取反
cout << cnt << endl;
return 0;
}
2、java语言
java中用字节流BufferedInputStream或字符流BufferedReader循环读取数据。
2.1 字节流
public class Demo01{
public static void main(String[] args) throws IOException{
FileInputStream fis = new FileInputStream("c:\\1.jpg");
FileOutputStream fos = new FileOutputStream("d:\\1.jpg");
int len = 0;
while((len = fis.read())!=-1){
fos.write(len);
}
fos.close();
fis.close();
}
}
2.2 字符流
public class Demo02{
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("c:\\1.jpg");
int len = 0;
while((len = fr.read())!=-1){
System.out.print((char)len);
}
fr.close();
}
}