上面我们讲到了选择结构里的if分支结构,下面我们来接着看看后面的内容
顺序结构和选择结构中if分支:http://t.csdnimg.cn/6rRlg
回顾一下:
复习
1.顺序结构
顺序结构-->以函数为单位,程序总是从main函数开始执行,自上而下逐行执行。若其中有函数调 用语句,则跳出该函数执行该调用函数,执行完之后会返回到调用的位置继续执行
2.选择结构
选择结构-->根据条件的真假来决定执行不同的内容(总是会执行条件为真的分支)
if分支
单分支:有可能执行有可能不执行
if(条件){
code;
}
双分支:if为真则else为假,if为假则else为真 二选一
if(条件){
code;
}else{
code;
}
多分支:自上而下只执行第一个条件为真的分支 多选一
if(){
code;
}else if(){
code;
}else if(){
code;
}else{ //该分支可不存在
code;
}
选择结构(2)
switch结构
两种写法
1.不同值对应不同执行语句的(一对一)
switch(expression){
case value1:
code;
break;
case value2:
code;
break;
······
default:
code;
}
2.多个值对应同一种执行语句的(多对一)
switch(expression){
case value1:case value2:case value3:
code;
break;
case value4:case value5:
code;
break;
······
default:
code;
}
注:在switch选择语句中,case如不是最后一行一般要求加break;若不加终止语句会继续执行,即从满足条件的语句执行到break语句或整个选择语句终止,如:
-switch(expression)
在此句中,expression只能为整型与字符。
!小数存在精度问题,不能用于精确比较
如何比较?在某精度下,变成整数进行比较
练习:
1.输入字符代表等级
A:100-90
B:89-80
C:79-60
D:59-0
其他:other
#include <stdio.h>
int main(){
char ch =0;
scanf("%c",&ch);
switch (ch) {
case 'A':
printf("100-90");
break;
case 'B':
printf("89-80");
break;
case 'C':
printf("79-60");
break;
case 'D':
printf("59-0");
break;
default:
printf("other");
}
return 0;
}
2.输入两个数字及运算符号,输出结果
#include <stdio.h>
//输入两个数字及运算符号,输出结果
int main() {
int a = 0;
int b = 0;
char ch = 0;
scanf("%d%c%d", &a,&ch,&b);
switch (ch) {
case '+':
printf("%d",a+b);
break;
case '-':
printf("%d",a-b);
break;
case '*':
printf("%d",a*b);
break;
case '/':
printf("%d",a/b);
break;
case '%':
printf("%d",a%b);
break;
default:
;
}
return 0;
}
循环结构
重复执行相同的步骤(核心:规律)
循环中一定会伴随着变量的变化
三种循环:for、while、do···while,三种循环可以做到互相代替
1.for循环
for(定义循环变量;循环终止条件;更改循环变量){
}
1).语法含义
两个分号之间的条件若为真,则执行循环中内容;若为假,则循环直接终止
2).执行顺序
-->1. int i = 1; 定义一个变量i整数,初始值为1
-->2. i <=5; 一个条件判断
-->3. sum = sum + i;
-->4. ++i ==> i = i + 1; 自增一
-->5. i <=5 ==> 2<=5 ?
-->6. sum = sum + i;
练习:
输入a与b两个整数,求他们之间的和
注:a、b大小关系未知
方法一:使a作为较小数,b作为较大数(可能改变a、b的值)
#include <stdio.h>
//输入a和b两个整数,求他们之间的和
int main() {
int a = 0;
int b = 0;
scanf("%d %d",&a,&b);
int sum = 0;
if (a > b) {
int c = 0;
c = a;
a = b;
b = c;
}
for (int i = a; i <= b; ++i) {
sum = sum + i;
}
printf("%d", sum);
return 0;
}
方法二:比较a、b大小,从较小数开始循环(不改变a、b的值),但代码较为复杂
#include <stdio.h>
//输入a和b两个整数,求他们之间的和
int main() {
int a = 0;
int b = 0;
scanf("%d %d",&a,&b);
int sum = 0;
if (a <= b) {
for (int i = a; i <= b; ++i) {
sum = sum + i;
}
}else{
for (int i = b; i <= a; ++i) {
sum = sum + i;
}
}
printf("%d", sum);
return 0;
}
还有俩别的方法(想优化但可能画蛇添足多此一举也不知道优没优化哪个更好就都发出来了())
练习:
1.求1-100的和
2.编程计算1*2*3+3*4*5+5*6*7+...+99*100*101的值 (考虑循环变量更改的规律)
3.求1-2+3-4+5-6+7-8+9....-100的值。(正负如何切换)
4.求1-1/2+1/3-1/4+...+1/99-1/100的值。(结果应为小数)
5.一个皮球从100米高度自由落下,每次落地后反!弹回原高度的一半,再落下,再反弹。
求当它第10次落地时,共经过了多少米,第10次欠反弹多高?(画图辅助理解循环真正次数)
6.输入一个正整数,输出它的阶乘。(考虑0的问题)
7.输出Fibonacci数列的前40项(查资料)
8.求以下数列前十五项的和:2/1,3/2,5/3,8/5,13/8, 21/13...。
9.从键盘输入n和a的值,计算a+aa+aaa+...+aa...a(n个a)的值。
10.求输入整数的各个数位之和。
1.
2.
3.
4.法一:
法二:
5.
我们先画图理解
此时我们可以分析到,每次落地高度均为上次的1/2,但由于第一次没有上升过程,所以我们在计算总共经过的距离时,要将所得结果减去第一次下落的高度也就是100米。第十次反弹的距离也就是第十一次下落的高度,我们需要两个变量来存储其中的变化值运用到循环中,即经过的距离之和我们用sum表示,高度用height表示。代码如下:
6.
7.
8.
9.
10.
//1.求1-100的和
int main() {
int sum=0;
for(int i=1;i<=100;i++){
sum+=i;
}
printf("%d",sum);
return 0;
}
//2.编程计算1*2*3+3*4*5+5*6*7+...+99*100*101的值 (考虑循环变量更改的规律)
int main() {
int sum=0;
for(int i=1;i<=99;i+=2){
sum+=i*(i+1)*(i+2);
}
printf("%d",sum);
return 0;
}
//3.求1-2+3-4+5-6+7-8+9....-100的值。(正负如何切换)
//方法一:
int main() {
int sum=0;
int flag=1;
for(int i=1;i<=100;i+=1){
sum+=flag*i;
flag*=-1;
}
printf("%d",sum);
return 0;
}
//方法二:
int main(){
int sum = 0;
int n = 0;
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) { //根据每项奇偶性判断符号
n = -i;
} else {
n = i;
}
sum = sum + n;
}
printf("%d\n", sum);
}
//4.求1-1/2+1/3-1/4+...+1/99-1/100的值。(结果应为小数)
//方法一:
int main() {
int i = 1;
int n = 0;
double sum = 0;
for (; i <= 100; i++) {
if (i % 2 == 0) {
n = -i;
} else {
n = i;
}
sum = sum + 1.0 / n; //地板除,用1.0转换数值类型
}
printf("%.2lf\n", sum);
return 0;
}
//方法二:
int main() {
double sum=0;
int flag=1;
for(int i=1;i<=100;i+=1){
sum+=1.0/(flag*i);
flag*=-1;
}
printf("%lf",sum);
return 0;
}
//5.一个皮球从100米高度自由落下,每次落地后反!弹回原高度的一半,再落下,再反弹。
//求当它第10次落地时,共经过了多少米,第10次欠反弹多高?(画图辅助理解循环真正次数)
int main() {
double sum = 0;
double height = 100;
for (int i = 1; i <= 10; i++) {
sum += height * 2;
height /= 2;
}
sum -= 100;
printf("%lf\n", sum);
printf("%lf\n",height);
return 0;
}
//6.输入一个正整数,输出它的阶乘。(考虑0的问题)
int main() {
int n = 0;
scanf("%d", &n);
int sum = 1;
for (int i = 1; i <= n; i++) {
sum *= i;
}
printf("%d\n", sum);
return 0;
}
//7.输出Fibonacci数列的前40项(查资料)
int main() {
int a = 1;
int b = 1;
for (int i = 1; i <= 20; i++) { //一次输出两个数,循环次数除以二
printf(" %d\n %d\n", a, b);
int c = a + b; //中间变量作为后一个数
a = c; //将后一个数的值赋给a
b = b + c; //c作为再下一个数
}
return 0;
}
//8.求以下数列前十五项的和:2/1,3/2,5/3,8/5,13/8, 21/13...。
int main() {
int a = 2;
int b = 1;
int x = 0;
int y = 0;
double n = 0;
double sum = 0;
for (int i = 1; i <= 15; i++) {
x = a; //x、y中间变量,存储中间a、b的值
y = b;
a = x + y; //a为前两个数相加
b = x; //b为上一个的a
n = 1.0 * x / y; //每一项
sum = sum + n;
}
printf("%f\n", sum);
return 0;
}
//9.从键盘输入n和a的值,计算a+aa+aaa+...+aa...a(n个a)的值。
int main() {
int n = 0;
int a = 0;
int sum = 0;
scanf("%d %d", &n, &a);
for (int i = 0; i <= n; i++) {
for (int j = 0; j < i; j++) {
sum = sum + a * (int)pow(10, j); //最高位+之前的值
}
}
printf("%d\n", sum);
return 0;
}
//10.求输入整数的各个数位之和。
int main() {
int num = 0;
int sum = 0;
scanf("%d", &num);
for (int i = 0; num >= 1; i++) {
sum = sum + num % 10; //取最后一位
num = num / 10; //向前推一位
}
printf("%d", sum);
return 0;
}