- for循环
- break语法
- continue语法
for循环
for是把循环三要素定在头上的while(初值,判断,更新)
语法
表达式1:变量初值 可省略
表达式2:判断条件 可省略
表达式3:循环变量的更新 可省略
分号不能省略 for(;?
for(表达式1;表达式2;表达式3)
{
语句;
}
const 常量/只读变量
帕斯卡命名法要求常量需要大写
const int NUM =100;
循环6个月的工资,计算平均工资
#include <stdio.h>
int main() {
int i;
double salary;
double total_salary = 0;
double avg_salary;
for(i = 0; i < 6; i++)
{
printf("输入第%d个月工资\n", i+1);
scanf("%lf", &salary);
//累加
total_salary += salary;
}
printf("%lf", avg_salary = total_salary / 6);
}
打印简易加法表:
int main() {
int num;//创建数字变量
printf("请输入一个数字:"); //录入数字
scanf("%d", &num);
int i;
for(i=0; i<num; i++){
if (i%2 == 0) {
printf("%d + %d = %d\t", i, num - i, num);
}
if (i%2 == 1) {
printf("%d + %d = %d\n", i, num - i, num);
}
}
}
小结
for循环常见问题:
- 忘记定义循环变量或初始化
- 循环条件缺少时造成死循环
- 循环变量不更新可能造成死循环
- 不可省略分号
Break语句
跳出循环,执行循环之后的语句
循环输入玩家年龄,如果为负跳出循环
两种死循环 1. while(1) 2. for(;?
int main() {
int age;
while(1){
printf("输入年龄\n");
scanf("%d", &age);
if(age<0){
break;
}
}
}
猜商品价格的游戏
- 设定商品价格
- 用户输入猜测价格后,系统给出大小提示
- 如果在5轮内猜中,提示恭喜
// 循环次数是多少,每猜一次加一
#include <stdio.h>
int price = 50; //商品价格
int main() {
int price = 50; //商品价格
int i; //猜测次数
for(i=0; i<5; i++){
printf("你觉得值多少钱?\n");
scanf("%d",&price);
if(i == 4){
printf("你没机会了sb\n");
break;
}
if(price < 50){
printf("垃圾,猜小了\n");
}
if(price > 50){
printf("垃圾,猜大了\n");
}
if(price == 50){
printf("你牛逼\n");
break;
}
}
}
上边那个应该用else if
老九答案:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main() {
int price; //目标价格
int guessPrice; //用户猜测商品价格
int count = 0; //用来记录猜测次数
srand((unsigned)time(NULL));
price = rand() * 1000 % 10000; //%1w生成四位数字
for(;;count++)
{
printf("输入价格");
scanf("%d", &guessPrice);
if(guessPrice > price){
printf("大了\n");
}
else if(guessPrice < price){
printf("小了\n");
}
else{
printf("对了\n");
break;
}
}
printf("你猜了%d次\n", count+1);
if(count+1<5){
printf("牛逼");
}
}
**输入性别m/M/f/F,输入错误即结束"有空再写吧脑袋大了
在这里插入代码片
continue语法
问题:输入五个玩家年龄,统计为负的录入次数
#include <stdio.h>
int main() {
int age;
int wrong_count = 0;
int right_count = 0;
while(1){
printf("请输入年龄\n");
scanf("%d", &age);
if(age < 0){
wrong_count += 1;
printf("输入错误%d次\n",wrong_count);
continue;
}
right_count += 1;
if(right_count > 4){
break;
}
}
}
注意:
- break可以用于switch和循环
- break终止循环,调到循环块外
- continue只能用于循环结构
- continue跳出本次循环,进入下一次
问题:求1~100之间的偶数和
循环结构总结
5. 多次执行重复任务的时候用循环
6. 注意判断和执行顺序
7. 循环次数不确定的情况下用 while 或者 do-while循环
题目:用*打出一个菱形
模拟转换
###*
##***
#*****
##***
###*
*
***
*****
*******
*******
*******
*******
*******
由此可知打印星号的两个问题
- 行数:几行星
- 列数:每行几个星
int i, j;
for(i = 0; i < 7; i++){
for( j = 0; j < 7; j ++){
printf("*");
}
printf("\n");
}
启示:
- 外层循环控制行(行数, 换行)
- 内层循环控制列(列数, 打印的符号)
*
***
*****
*******
每一行中,行数和列数之间的关系
i | j |
---|---|
0 | 0 |
1 | 2 |
2 | 4 |
3 | 6 |
- 结论j <= i *2
- 修改j的值
int main() {
int i, j;
for(i = 0; i < 10; i++)
{
for( j = 0; j <= i*2; j ++)
{
printf("%c", '*');
}
printf("\n");
}
}
最终答案:
#include <stdio.h>
int main() {
int i, j;
for(i = 0; i < 4; i++) //上半部分
{
for( j = 0; j <= 2-i; j ++) //打印空格
{
printf("%c", ' ');
}
for( j = 0; j <= i*2; j ++) //打印星号
{
printf("%c", '*');
}
printf("\n");
}
for(i = 0; i < 3; i ++) //下半部分
{
for (j=0; j <= i; j++) {
printf("%c", ' '); //打印空格
}
for ( j = 0; j < 5 - 2*i ; j ++ )//打印星号
{
printf("%c", '*');
}
printf("\n");
}
}
总结:
- 双for模型
- 抽象问题(空格)具象化(#)
- 寻找#(j)与*(j) 与i的关系
- 分上下写
作业: