从分支到for循环

[日期:2021-10-25] 作者:信息技术 次浏览 [字体: ]

【商场促销】分支语句嵌套练习评讲

某商场为迎接即将到来的“六一”儿童节,推出了一系列优惠活动。

(1)如果是该商场的VIP客户,那么:

如果购买的商品价值在500元以下(含500元),将享受8.5折优惠;

如果购买的商品价值在500元以上,1000元以下(含1000元),将享受8折优惠;

如果购买的商品在1000元以上,除了享受7.5折优惠,还将获得一个惊喜大礼包。

(2)如果不是VIP客户,那么:

如果购买的商品价值在500元以下(含500元),将享受9折优惠;

如果购买的商品价值在500元以上,除了享受9折优惠,同时还将获得一个惊喜大礼包。

本题的任务是根据顾客的身份和购买商品的价值,给出一个应付金额,以及在付款时,是否可以领取大礼包。

【输入格式】

第一行一个字符“V”或“C”,“V”表示该顾客是VIP客户,“C”表示是普通客户。

第二行一个正整数,int范围以内,表示该顾客购买的商品价值。

【输出格式】

第一行表示是否可以领取大礼包,如果可以输出“YES”,否则输出“NO”。

第二行一个小数,表示顾客应付金额。

【样例输入】

V

580

【样例输出】

NO

464.0

完整程序如下:

#include <iostream>

using namespace std;

int main()

{

       char a;   //定义字符型变量

       cin>>a;  //读入一个字符,这个字符可能是V或者C

       int w;

       cin>>w;   //读入顾客购买的商品价值

       if (a=='V')   //假如是VIP客户

       {

              if (w<=500) cout<<"NO"<<endl<<w*0.85;    //购买商品价值在500以内,包含500

              if (w>500&&w<=1000) cout<<"NO"<<endl<<w*0.8;  //购买商品价值在500~1000,包含1000

              if (w>1000) cout<<"YES"<<endl<<w*0.75;   //购买商品价值超过1000

       }

       else    //不是VIP客户

       {

              if (w<=500) cout<<"NO"<<endl<<w*0.9;   //购买商品价值500以内,包含500

              if (w>500) cout<<"YES"<<endl<<w*0.9;   //购买商品价值超过500

       }

       return 0;

}

【邮资】分支语句练习

根据邮件的重量和用户是否选择加急计算邮费。计算规则:重量在1000克以内(包括1000克),基本费8元。超过1000克的部分,每500克加收超重费4元,不足500克部分按500克计算;如果用户选择加急,多收5元。

输入一行:两个整数,第一个表示邮件的重量,第二个数为1或者0,1表示加急,0表示不加急。

输出一个整数,表示应收邮费。

#include <iostream>

using namespace std;

int main()

{

       int w,a,ans;

       cin>>w>>a;

       if (w<=1000) ans=8;

       if (w>1000&&(w-1000)%500==0) ans=8+((w-1000)/500)*4;

       if (w>1000&&(w-1000)%500!=0) ans=8+(((w-1000)/500)+1)*4;

       if (a==1) ans=ans+5;

       cout<<ans;

       return 0;

}

循环语句:for循环


#include<iostream>

using namespace std;

int main()

{

    for(int i = 1; i <= 10; i++)

        cout<<'@';

    return 0;

}

如果题目改成输出n个@,每行输出10个,最后一行有多少输出多少,应怎样修改程序?

例2.利用for循环,计算输出1+2+…+100的和。

#include <iostream>

using namespace std;

int main ()

{

    int sum=0;

    for (int i=1; i<=100 ; i++)

       sum+=i;    //i初始值1,终值为100,每次增量为1  

  cout << sum;

    return 0;

}

如果题目改成输出1+3+5+…+99的和,应怎样修改程序?

例3.从键盘输入n个数(每个数的绝对值在10000以内),输出其中最大的数。

#include <iostream>

using namespace std;

int main()

{

       int ans=-10001,n,a;  //想想为什么这里给ans赋值为-10001,还可以改成别的吗?

       cin>>n;     //先从键盘输入有多少个数

       for (int i=1;i<=n;i++)

       {

              cin>>a;    //在循环里依次输入每个数,因为一共循环n次,就读入了n个数

              if (a>ans) ans=a;    //每读入一个数,就跟ans比较一下,把大者放入ans

       }

       cout<<ans;    //输出结果

       return 0;

}

【练习】

1.输出1~100之间的所有偶数,每个数字之间用一个空格隔开。

 输出形如:2 4 6 8 … 98 100。

法1:可以想到对于1~100之间的100个数字i,直接重复进行判断,如果i是偶数,则输出i的值。法2:在上述分析的基础上,再进一步分析,我们都知道,相邻偶数之间的差值为2,所以,我们还可以设置循环变量的初始值为2,增量为2的for循环,使得循环次数减少为50次。

2.从键盘输入n个数(每个数的绝对值不超过10000),输出这组数的最大跨度值(即最大数与最小数之间的差值)。

3. 一张纸的厚度是0.0001米,将纸对折,问对折多少次厚度超过珠穆朗玛峰的高度8848米?

【多重for循环】

1.打印如下星号三角形,一共打印nn<=20)行,n从键盘输入。

*

**

***

****

*****

******

#include <iostream>

using namespace std;

int main()

{

       int n;

       cin>>n;

       for (int i=1;i<=n;i++)

           {

                  for (int j=1;j<=i;j++)

                   cout<<'*';   //循环i次,输出i个*号

               cout<<endl;   //每行输完i个*号后换行

              }

    return 0;

}


2.假设abc均为整数,且满足abc 大于等于1,并且小于等于100,找出所有符合条件:“a2+b2=c2”的整数组。

输入:

输出:

a从小到大的顺序输出所有满足条件的整数组(若a相同,则按b从小到大的顺序输出),每行一组,每一组数据的输出样式为:a*a+b*b=c*c

注意:3*3+4*4=5*54*4+3*3=5*5是相同的解,不要重复输出;

#include<iostream>

using namespace std;

int main()

{

    int a,b,c;

    for(a=1;a<=100;a++)

        for(b=a;b<=100;b++)

            for(c=b;c<=100;c++)

                if(c*c==a*a+b*b)

                    cout<<a<<'*'<<a<<'+'<<b<<'*'<<b<<'='<<c<<'*'<<c<<endl;

    return 0;

}


【老生练习】循环的控制与多重循环

1.  有1元,2元,5元的钱,现在凑成200元,有多少种可能性?

2.  一个数如果恰好等于它的因子之和(不包括它自己),这个数就称为完数。例如6=1+2+3,所以6是完数。编程找出1000以内的所有完数。

课后思考:

【国王的奖励】

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。

请计算在前K天里,骑士一共获得了多少金币。

输入:输入只有1行,包含一个正整数K(1K10000),表示发放金币的天数。

输出:输出只有1行,包含一个正整数,即骑士收到的金币数。

样例输入:6

样例输出:14

提示:

骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到 1+2+2+3+3+3=14 枚金币。

【津津的储蓄计划】

津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。

为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下3元钱。

津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。

现在请你根据20041月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。

输入格式:

输入包括12行数据,每行包含一个小于350的非负整数,分别表示1月到12月津津的预算。

输出格式:

输出包括一行,这一行只包含一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-XX表示出现这种情况的第一个月;否则输出到2004年年末津津手中会有多少钱。

样例输入1                样例输入2

290                            290

230                            230

280                            280

200                            200

300                            300

170                            170

340                            330

50                             50

90                             90

80                             80

200                            200

60                             60

样例输出1:-7                 样例输出2:1580