0707(003天 结构化编程)

每日一狗(边牧十一)
在这里插入图片描述

0707(003天 结构化编程)

结构化编程

文章目录

前言

1. 结构化编程

结构化程序设计(strutured programming)是1960年发展起来的一种编程典范。

  • 子程序
  • 程序码区块
  • 循环

1.1 指导思想

自顶向下:复杂问题细化
逐步求精:(心无杂念)
模块化:抛弃cv打法(封装)

1.2 编程过程

流程图是一个系统的信息流、观点流或部件流的图形代表。一图胜千言。

  1. 圆角矩形表示开始或结束
  2. 矩形表示行动方案、普通工作环节
  3. 菱形表示条件判定(审核)环节
  4. 平行四边形表示输入 输出
  5. 箭头表示工作流方向
    流程图参考网站
    在这里插入图片描述

1.3 结构化编程的推论

任何复杂的问题都可以三种基本算法结构来描述:顺序、选择、循环。因此用计算机语句描述的程序也
包含三种基本结构


2. 条件分支

if(条件1){
	条件为真时执行
}else if(条件2){
	当条件1为假条件2为真时执行
}else{
	所有条件都为假时执行
}

2.1 案例成绩分类(及格or不及格) if_else

package com.jintian;
import java.util.Scanner;
public class Test03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int score = 0;
		Scanner sc = new Scanner(System.in);
		score = sc.nextInt();
		if (score >= 0 && score < 100) {
			if (score >= 60) {
				System.out.println("及格");
			} else {
				System.out.println("不及格");
			}
		} else {
			System.out.println("您输入的心声成绩不合法");
		}
		if (score < 0 || score > 100) {
			System.out.println("您输入的成绩不合法");
		} else {
			if (score < 60) {
				System.out.println("不及格");
			} else {
				System.out.println("及格");
			}
		}
	}
}

在这里插入图片描述

2.2 案例成绩分类(不及格、及格、良好、优秀)(if_else)

不及格 60 及格 80 良好 90 优秀100

嵌套分支实现
package com.jintian;

import java.util.Scanner;

public class Test04 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入学生成绩");
		int score = sc.nextInt();
		if (score >= 0 && score <= 100) {
			if (score < 60) {
				System.out.println("不及格");
			} else {
				if (score < 80) {
					System.out.println("及格");
				} else {
					if (score < 90) {
						System.out.println("良好");
					} else {
						System.out.println("优秀");
					}
				}
			}
		} else {
			System.out.println("输入成绩不合法");
		}
	}

}

在这里插入图片描述
使用 if(){}else if(){}else{}实现

// 
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生成绩");
int score = sc.nextInt();
if(score>100) {
	System.out.println("非法输入");
}else if(score>=80) {
	System.out.println("优秀");
}else if(score>=70){
	System.out.println("良好");
}else if(score>=60) {
	System.out.println("及格");
}else if(score>=0) {
	System.out.println("不及格");
}else {
	System.out.println("非法输入");
}

2.3 (开关分支语言switch引入 )案例 输入年月分,显示对应的本月的天数

条件判断实现如下所示

// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份");
int nian = sc.nextInt();
System.out.println("请输入月份");
int yue = sc.nextInt();
if (yue < 1 || yue > 12 || nian < 0) {
	System.out.println("输入格式错误");
} else {
	if (yue == 1 || yue == 3 || yue == 5 || yue == 7 || yue == 8 || yue == 10 || yue == 12) {
		System.out.println("31天");
	} else if (yue == 4 || yue == 6 || yue == 9 || yue == 11) {
		System.out.println("30天");
	} else if (nian % 4 == 0 && nian % 8 == 0 || nian % 400 == 0) { // 判断闰年 可以被4整除但是不能被100整除 或者能够被400整除
		System.out.println("29天");
	} else {
		System.out.println("28天");
	}
}

switch 解决

// 需求:输入年月分,显示对应的本月的天数
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份");
int year = sc.nextInt();
System.out.println("请输入月份");
int month = sc.nextInt();

int days = 0;
if (month > 12 || month < 1) {
	System.out.println("您输入的月份错误");
} else {
	switch (month) {
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		days = 31;
		break;
	case 4:
	case 6:
	case 9:
	case 11:
		days = 30;
		break;
	default:
		if (year % 4 == 0 && year % 8 == 0 || year % 400 == 0) {
			days = 29;
		} else {
			days = 28;
		}
		break;
	}
}
System.out.println(year + "年" + month + "月有" + days + "天");

补充
switch语法

switch(num2) {
case 1:// 判断表达式的值是否在值1,如果相等则执行代码块1
	代码块1;break; // 执行完代码块1后如果不跳出,则会接着向下匹配,知道遇到跳出语句货语句执行完毕
.....
default://如果素有的case都不成立则执行代码块n
	代码块n;break;

注意点

  • 表达式的计算结果可以是整形(不能是长整型),可以是字符或者字符串
  • 也可以是美剧类型
  • case值类型必须和switch条件类型相同或者能进行隐式转换(毕竟是要进行比较的)
  • case值必须唯一,不能余其他的重复
  • defaul语法上对位置没有任何要求,但是从逻辑上它表示的是其它的都匹配失败是才上的,所以放到最后可以增强代码的可读性

2.4 三目运算符

三目条件运算符(?:)规则是完全一致的,使用的形式是: x ? y:z;
x:条件表达式
y:x表达式为 真 时整体返回的值
z:x表达式为 假 时整体返回的值
应用小技巧

  • 要求表达式1必须返回值为boolean类型
  • 要求表达式2和表达式3的返回值类型一致
    • Object max = num1 > num2 ? num1 : "num2";
// 需求:要求输入两个整数,输出最大的整数
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个整数");
int num1 = sc.nextInt();
System.out.println("请输入第二个整数");
int num2 = sc.nextInt();
// 使用if_else
int max = num1;
if (num1 < num2) {
	max = num2;
}
// 使用三目运算符平替条件判断
int max = num1 > num2 ? num1 : num2;
System.out.println("两个整数" + num1 + "," + "num2" + "中最大的值为:" + max);
sc.close();

3. 循环结构

计算 1+2+3+…+100

3.1 for循环

在这里插入图片描述
在这里插入图片描述

  • for循环中一般用于提前知道明确执行次数的场景中
  • while循环一般用于无法预先知晓次数的场景中
  • do_while循环一般用于不知晓运行次数且循环体最少要执行一次的场景中

3.2 while循环

// TODO Auto-generated method stub
int loop = 1; // 控制循环
int res = 0; // 累加器
while (loop <= 100) {
	// loop++;
	// res+=loop;
	res += loop++;
}
System.out.println("1+2+3+...+100 = " + res);

3.3 do_while

循环体最小运行一次
do_while循环的应用引用地址

在一个图书系统的推荐图书列表中保存了 50 条信息,现在需要让它每行显示 10 条,分 5 行进行显示。下面使用 do-while 循环语句来实现这个效果,其具体代码如下所示。


public static void main(String[] args) {
    int bookIndex = 1;
    do {
        System.out.print(bookIndex+"\t");
        if(bookIndex%10 == 0) {
            System.out.println();
        }
        bookIndex++;
    }while(bookIndex<51);
}

3.4 跳出循环

  • break:跳出并结束当前循环
  • countion:仅跳出当次循环,开始执行下一次循环

3. 练习题

在这里插入图片描述

3.1 计算输入数据的阶乘(注意数据溢出)

System.out.print("请输入一个正整数:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
if (num < 0 && num >= 13) {
	// 12!*13 = 479001600*13 = 6,227,020,800
	// 13! = 1,932,053,504
	System.out.println("本程序仅能计算1-12的阶乘");
} else {
	int res = 1;

	for (int i = 1; i <= num; i++) {
		res *= i;
	}
	System.out.println(num + "! = " + res);
}

3.2 互换两个数的值(不允许使用中间变量)

  • 建立临时变量
  • 加减运算交换
  • 位运算方法
    加减法
num1 = 10, num2 = 6;
num1 = num1 + num2; // num1 = 16 num2 = 6
num2 = num2 - num1; // num1 = 16 num2 = 10
num1 = num1 - num2; // num1 = 6  num2 = 10

3.3 输出三个数中的最大值和最小值


// 3、输出三个数中的最大值和最小值
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个整数:");
int num1 = sc.nextInt();
System.out.println("请输入第二个整数");
int num2 = sc.nextInt();
System.out.println("请输入第三个整数");
int num3 = sc.nextInt();
int max = num1;

if (num2 > max) {
	max = num2;
}
if (num3 > max) {
	max = num3;
}
int min = num1;
if (num2 < min) {
	min = num2;
}
if (num3 < min) {
	min = num3;
}
System.out.println(
		"num1 = " + num1 + ", " + "num2 = " + num2 + ", num3 = " + num3 + ", max = " + max + ", min = " + min);
	

在这里插入图片描述

3.4 输出1-100的奇数(每行输出6个)

// 输出1-100的奇数(每行输出6个)

for (int i = 1; i <= 100; i++) {
	if (i % 12 == 0) {
		System.out.println("");
	}
	if (i % 2 == 1) {
		System.out.print(i + "\t");
	}

}

3.5 1-100求和(for while以及do/while的写法)

// 1-100求和(for while以及do/while的写法)
// for
int res = 0;
for (int i = 1; i <= 100; i++) {
	res += i;
}
System.out.println("sum(1-100) = " + res);
// while
res = 0;
int i = 0;
while (++i <= 100) {
	res += i;
}
System.out.println("sum(1-100) = " + res);
// do/while
res = 0;
i = 1;
do {

	res += i;
	i++;
} while (i <= 100);
System.out.println("sum(1-100) = " + res);

3.6 1-100奇数求和

// 1-100奇数求和
int res = 0;
for (int i = 1; i < 100; i += 2) {
	res += i;
}
System.out.println("1-100奇数和为" + res);

3.7 1~100可以被3整除的数

// 1~100可以被3整除的数
int res = 0;
int n = 0;
for (int i = 0; i <= 100; i++) { // 这里可以将步长设定为 3 从0开始加3肯定可以被3整除
	if (i % 3 == 0) {
		res += i;
		n++;
	}
}
System.out.println("1~100可以被3整除的数有" + n + "个,求和为" + res);

3.8 求100 以内所有能被3 整除但不能被5 整除的个数

// 求100 以内所有能被3 整除但不能被5 整除的个数
int n = 0;
for (int i = 0; i <= 100; i++) {
	if (i % 3 == 0 && i % 5 != 0) {
		n++;
	}
}
System.out.println("100以内能被 3 整除不能被 5 整除的个数有 " + n);

3.9 打印出所有的水仙花数

// 打印出所有的水仙花数
// 水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身
// (例如:1^3 + 5^3+ 3^3 = 153)。
System.out.print("水仙花数:有");
for (int i = 100; i < 1000; i++) {
	int num1 = i % 10;
	int num2 = (i / 10) % 10;
	int num3 = i / 100;
	//System.out.println(i + " 1 = " + num1 + " 2 = " + num2 + " 3 = " + num3);
	if ((num1 * num1 * num1 + num2 * num2 * num2 + num3 * num3 * num3) == i) {
		System.out.print(i + "、");
	}
}

3.10 判断一个数是否质数

// 判断一个数是否质数
// 质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数
// 否则称为合数(规定1既不是质数也不是合数)。
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个需要判断的整数");
int num1 = sc.nextInt();
if (num1 < 1) {
	System.out.println("请输入一个大于1的自然数");
} else if (num1 == 1) {
	System.out.println(num1 + "既不是质数也不是合数");
} else {
	int i = 1;
	while (++i < num1) {
		if (num1 % i == 0) {
			System.out.println(num1 + "不是质数");
			break;
		}
	}
	if (num1 == i) {
		System.out.println(num1 + "是质数");
	}
}

3.11 编程求出自然数101-205中的所有质数

// 编程求出自然数101-205中的所有质数
System.out.println("101-205中所有的质数如下所示:");
for (int i = 101; i <= 205; i++) {
	int n = 2;
	for (; n <= i; n++) {
		if (i % n == 0)
			break;
	}
	if (n == i) {
		System.out.println(i);
	}
}
System.out.println("结束");

3.12 输入两个正整数m和n,求其最大公约数和最小公倍数

// 输入两个正整数 m 和 n ,求其最大公约数和最小公倍数
System.out.println("请输入第一个正整数");
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
System.out.println("请输入第二个正整数");
int num2 = sc.nextInt();
// 小值 往最大公约数 大值 往最小公倍数
int min = num1 < num2 ? num1 : num2;
int max = num1 < num2 ? num2 : num1;

while (true) {
    if (min <= 1) {
        System.out.println(num1 + "和" + num2 + "没有最大公约数");
        break;
    }
    if (num1 % min == 0 && num2 % min == 0) {
        System.out.println(num1 + "和" + num2 + "的最大公约数为" + min);
        break;
    }
    min--;

}
while (true) {
    if (max % num1 == 0 && max % num2 == 0) {
        System.out.println(num1 + "和" + num2 + "的最小公倍数为" + max);
        break;
    }
    max++;
}

3.13 100 ~ 50000之间有多少整数,其各位数字之和为5,分别是哪些数(例如整数1324的各位数字之和为 1+3+2+4 等于10(不为5)),并统计满足条件的整数有多少个

// 100 ~ 50000之间有多少整数,其各位数字之和为5,
// 分别是哪些数(例如整数1324的各位数字之和为 1+3+2+4 等于10(不为5)),并统计满足条件的整数有多少个

// 其各位数字之和为5,
int n = 0; // 计数器
for (int i = 100; i <= 50000; i++) {
    int num1 = i % 10;
    int num2 = (i / 10) % 10;
    int num3 = (i / 100) % 10;
    int num4 = (i / 1000) % 10;
    int num5 = (i / 10000) % 10;
    // System.out.println(num1 + "、" + num2 + "、" + num3 + "、" + num4 + "、" + num5);
    if ((num1 + num2 + num3 + num4 + num5) == 5) {
        n++;
        System.out.println(i + "其各位数字之和为5,");
    }

}
System.out.println("100 ~ 50000之间有" + n + "个整数,其各位数字之和为5");

3.14 鸡兔同笼共80个头,208只脚,鸡和兔各有几只

// 鸡兔同笼共80个头,208只脚,鸡和兔各有几只
int ji = 0;
int tu = 80;
while ((ji * 2 + tu * 4) != 208) {
    ji++;
    tu--;
}
System.out.println("鸡兔同笼共80个头,208只脚,鸡有" + ji + "只、兔有" + tu + "只");

3.15 鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何

// 鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何
int jiWong = 0;
int jiMu = 0;
int jiChu = 0;
for (; jiWong <= 20; jiWong++) {
    for (jiMu = 0; jiMu <= 34; jiMu++) {
        for (jiChu = 0; jiChu <= 300; jiChu += 3) {
            //System.out.println((jiWong + jiMu + jiChu) + "只" + (jiWong * 5 + jiMu * 3 + (int) (jiChu / 3)) + "钱");
            if ((jiWong + jiMu + jiChu) == 100 && (jiWong * 5 + jiMu * 3 + (int) (jiChu / 3)) == 100) {
                System.out.println("鸡翁" + jiWong + "只、鸡母" + jiMu + "只、鸡雏" + jiChu + "只满足百钱买白鸡");
            }
        }
    }
}
System.out.println("结束");

扩展小芝士

互换两个数的值(不使用中间变量)java中没有(x, y = y, x)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值