每日一狗(边牧十一)
0707(003天 结构化编程)
结构化编程
文章目录
- 0707(003天 结构化编程)
- 前言
- 1. 结构化编程
- 2. 条件分支
- 3. 循环结构
- 3. 练习题
- 3.1 计算输入数据的阶乘(注意数据溢出)
- 3.2 互换两个数的值(不允许使用中间变量)
- 3.3 输出三个数中的最大值和最小值
- 3.4 输出1-100的奇数(每行输出6个)
- 3.5 1-100求和(for while以及do/while的写法)
- 3.6 1-100奇数求和
- 3.7 1~100可以被3整除的数
- 3.8 求100 以内所有能被3 整除但不能被5 整除的个数
- 3.9 打印出所有的水仙花数
- 3.10 判断一个数是否质数
- 3.11 编程求出自然数101-205中的所有质数
- 3.12 输入两个正整数m和n,求其最大公约数和最小公倍数
- 3.13 100 ~ 50000之间有多少整数,其各位数字之和为5,分别是哪些数(例如整数1324的各位数字之和为 1+3+2+4 等于10(不为5)),并统计满足条件的整数有多少个
- 3.14 鸡兔同笼共80个头,208只脚,鸡和兔各有几只
- 3.15 鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何
- 扩展小芝士
前言
1. 结构化编程
结构化程序设计(strutured programming)是1960年发展起来的一种编程典范。
- 子程序
- 程序码区块
- 循环
1.1 指导思想
自顶向下:复杂问题细化
逐步求精:(心无杂念)
模块化:抛弃cv打法(封装)
1.2 编程过程
流程图是一个系统的信息流、观点流或部件流的图形代表。一图胜千言。
- 圆角矩形表示开始或结束
- 矩形表示行动方案、普通工作环节
- 菱形表示条件判定(审核)环节
- 平行四边形表示输入 输出
- 箭头表示工作流方向
流程图参考网站
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)
- 创建临时变量
- 加减运算(不用中间变量)
- 位运算(不用中间变量)
位运算
互换两个数的值的三种方法