ok啊各位,今天是第五天了,好快一周就过去了。不过今天因为是周六嘛,我们就不学习新东西了。我们对前四天学习的东西做一个练习,这里给大家准备了20道题巩固一下,我们一起来看看吧!

        注:考虑到我已经谢过了,我就简单给大家说个思路,同时也附上我的代码,不一定是最简洁的,逻辑最清晰的,仅供参考,也希望大家能在评论区不吝赐教!

第一题:使用while循环编写一个程序,允许用户最多尝试 3 次输入密码。如果用户在 3 次尝试内输入正确的密码,提示“登录成功”;否则,提示“密码错误”,如果超过三次还没有输入正确,提示”登录失败,账号已锁定“。假定密码为"123456"。

        这道题首先限定的就是while循环嘛,输入次数也有限制,所以我们就设置一个计数器来记录用户输入的次数,当次数超出限制范围之后我们就不让用户输入了,这边可以设置从零开始也可以从3开始,我就是从后者开始。每当我们输入一次,就进行判断,成立就显示登录成功,失败就重新输入,中间也要注意改变计数器的值就行。

Console.WriteLine("请您输入密码:");
int count = 3; //计数器
while (count > 0)
{
    string pin = Console.ReadLine();
    if (pin == "123456")
    {
        count--;
        Console.WriteLine("登陆成功");
        break;
    }
    else
    {
        count--;
        if (count > 0)
        {
            Console.WriteLine("密码错误,请重新输入");
            continue;
        }
        else
        {
            break;
        }
    }
}
if (count == 0)
{
    Console.WriteLine("登录失败,账号已锁定");
}

第二题:(使用while)小明今年130CM,假设他每年身高增长5%,使用循环计算他需要几年长到180CM以上。

           这道题的话其实和第一道题差不多,只不过我是加了一个人机交互,让用户手动输入身高,而不是我们直接定义身高是多少了。然后就是看题目给的条件嘛,给了现在身高,给了预期身高,给了每年的增长率,那我们就可以想一下是不是设置一个计数器来记录需要多少年,然后直接根据增长率来求多少年就行。说白了写这种代码就是想办法把数学的解题思路转化成代码就行。这边我们依旧选择一个while循环啊,因为有现在身高和预期的身高,用while循环条件更容易写一点,满足现在身高大于预期身高我们就可以跳出循环了。同时循环一次计数器加一就行,最后输出计数器是多少就可以了。

 Console.WriteLine("--欢迎使用身高增长时长模拟计算器--");
 Console.Write("请输入您的身高(cm):");
 double now=double.Parse (Console.ReadLine());
 Console.Write("请输入你的预期身高(cm):");
 double hope=double.Parse (Console.ReadLine());
 double year=0;
 while (now<hope)
 {
     now = now * 1.05;
     year++;
 }
 Console.WriteLine($"您需要{year}年才能长到{hope}cm");

第三题:使用 while 循环判断用户输入的数字是否为素数。素数是指只能被 1 和它本身整除的数字。

        这个求素数啊,说实话条件还是蛮多的,不过也就是条件多点,我们只要明白什么是素数,这道题也就迎刃而解了。那么什么是素数呢?素数是指大于1的自然数,除了1和它本身外,没有其他正因数。换句话说,素数只能被1和它自身整除。还就是除了2以为所有的偶数都不是素数。那么知道这些条件,我们就开始一一列条件就行。具体过程看看上面代码。

          Console.Write("请您输入一个数字:");
          int num3=int.Parse(Console.ReadLine());
          while (true)
          {
              if (num3 < 0 || num3 == 1)
              {
                  Console.WriteLine($"{num3}不是素数。");
                  continue;
              }
              else if (num3 == 2)
              {
                  Console.WriteLine($"{num3}是素数。");
                  break;
              }
              else if (num3!=2&&num3%2==0)
              {
                  Console.WriteLine($"{num3}不是素数。");
                  continue;
              }
              else
              {
                  int i = 2;
                  while (i < num3)
                  {
                      if (num3 % i == 0)
                      {
                          Console.WriteLine($"{num3}不是素数。");
                          break;
                      }
                      i++;
                  }
                  if (i == num3)
                  {
                      Console.WriteLine($"{num3}是素数。");
                  }
                  break;
              }
          }

第四题:让用户输入一系列数字,直到用户输入 0 为止。然后程序计算这些数字的平均值并输出

        看这道题,两点,第一点是输入值,第二就是求已经输入值的和的平均值。那我们就要想怎么用循环不停的输入值,显然用个死循环会好一点。然后题目要求也有说输入0停止,那我们就设置一个条件,让他输入零的时候跳出这个死循环,因为要求平均值,我们还要设置一个变量来存我们输入了几个数。具体过程就如上述代码。

 Console.WriteLine("--请输入数字求平均值--");
 Console.WriteLine("输入0的时候停止");
 int count = 0;
 double end = 0;
 while (true)
 {
     double num =double.Parse(Console.ReadLine());
     end += num;
     if (num == 0)
     {
         break;
     }
     count++;
 }
 Console.WriteLine($"您输入的这些数的平均值为:{end/count}");

第五题:用户每次输入一个数字,程序将这些数字相加。程序在总和超过 100 时结束,并打印总和

        这道题和上面那道题的逻辑也差不多,输入数字,将输入的数字求和,而且这个题还直接把循环结束的条件跟你讲了,说程序要在总和超过100的时候结束,我们还用一个while循环就能解决。

 Console.WriteLine("请输入数字:");
 double sum = 0;
 while (sum <= 100)
 {
     double num = double.Parse(Console.ReadLine());
     sum+= num;
 }
 Console.WriteLine($"总和为:{sum}");

第六题:(使用do while) 用户输入多个学生的成绩,输入负数时结束输入。程序计算并输出所有有效成绩的平均分

        求平均分是一个老生常谈的问题,但题目有限制是要用do...while,那我们先回忆一下do...while的循环是干什么的。他就是在while的基础上,让循环体的内容先执行一次,然后再进行条件判断。然后题目要求输入负数的时候结束输入,那么我们就可以用一个死循环来让用户能一直输入,然后跳出循环的条件就是当用户输入负数的时候。又因为是要求取平均值,所以我们在设置一个计数器记录用户输入的次数,然后把输入的成绩的和加在一块,然后求取平均值即可。

Console.WriteLine("请输入学生的成绩");
Console.WriteLine("输入负数时自动结束输入");
double sum = 0;
int count = 0;
do
{
    Console.Write($"请输入第{count+1}位学生的成绩:");
    double sorce=double.Parse( Console.ReadLine() );
    if( sorce < 0)
    {
        break;
    }
    count++;
   // Console.WriteLine(count);
    sum += sorce;
} while (true);
Console.WriteLine($"所有有效成绩的平均分为:{sum/count}");

第七题:要求用户输入多个整数,直到输入为 0 为止。最后统计并输出:输入了多少个正数;输入了多少个负数。

        这个题其实和上一个题类似,题目也给出了结束的条件,那我们就还可以用一个死循环让用户一直输入,然后跳出循环的条件就设置成输入零的时候。因为要记录输入了几个正数,几个负数,所以我们可以设置两个计时器,分别记录输入的正数的个数和输入的负数的个数。最后在循环体里进行条件判断来确定是正数还是负数即可。

int count1 = 0;
int count2 = 0;
Console.WriteLine("请开始输入(输入0时程序停止 )");
int i = 1;
do
{
    Console.Write($"请输入第{i}个数:");
    double num=double.Parse(Console.ReadLine());
    if (num > 0)
    {
        count1++;
        i++;
    }
    else if (num < 0)
    {
        count2++;
        i++;
    }
    else
    {
        break;
    }
} while (true);
Console.WriteLine($"您一共输入了{count1}个正数");
Console.WriteLine($"您一共输入了{count2}个负数");

第八题:(使用do while) 用户输入一个正整数 n,程序输出斐波那契数列的前 n 项

        看这道题,让输出斐波那契数列的前n项,那我们先来看看什么是斐波那契数列。斐波那契数列是一个经典的数学序列,其特点是每一项等于前两项之和。通常从1和1开始,后续每一项通过递归关系生成。数列的前几项为:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...

       我们知道了他的特点,你会发现他从第三项开始,每一项的值都等于前两项的和。那前两项怎么办呢?我们可以先把他设置出来。因为他让输出前n项,然后这个n是用户来定义的嘛,然后我们就可以设置一个计数器来记录输出的个数,当没达到用户要求的个数的时候就一直循环,那这个就可以作为我们的循环条件。至于循环体怎么写,我们已经知道了这个数列的特点,就可以设置一个中间变量,然后让中间变量记录两个数的和,然后在通过中间变量调整一个数和第二个数的值,之后一直输出第一个数即可。

Console.Write("请输入一个正整数:");
int num = int.Parse(Console.ReadLine());
int a = 1;
int b = 1;
Console.WriteLine($"前{num}项斐波那契数列如下:");
int count = 0;
do
{
    Console.WriteLine(a);
    //Console.WriteLine(b);
    int temp1 = a + b;
    //Console.WriteLine(temp1);
    a = b;
    b = temp1;
    count++;

} while (count<num);

第九题:(使用do while) 用户输入一个取款金额,要求金额必须是 100 的倍数,直到输入正确。

        关于这道题,首先我先提一点,关于钱这种对确定性要求非常高的数据,我们一般用decimal这个变量来记录。因为他的精度是很高的,是多少就是多少。这一点大家心里知道就行,我也只是提一下。

        然后这道题也说了,如果输入不对就得一直输入,那我们肯定就还是要使用死循环来控制,以便达到让用户一直输入的效果。那要用死循环,我们还需要找到什么?我们还需要找到循环终止的条件。题目上也说了,输入的金额必须是100的倍数,那这个就可以作为跳出循环的条件。是,就跳出循环,不是,就继续。这样就可以轻松的解决了。

Console.WriteLine("请您输入取款金额(注意需要是100的倍数)");
do
{
    decimal money = decimal.Parse(Console.ReadLine());
    if (money % 100 == 0)
    {
        Console.WriteLine("输入成功!");
        break;
    }
    else
    {
        Console.WriteLine("输入不合法,请重新输入。");
        continue;
    }
} while (true);

第十题:计算0-100之间的奇数和、偶数和?

        这种题我在我们学习循环的那一天也提到过,不知道大家还有没有印象。那时候我记录的是对于这些明确知道循环次数的问题,我们一般用for循环解决。因为是在0-100之间的数嘛,我们就把for循环的条件写成1-100之间的循环就可以了。因为你还要记录奇数的和和偶数的和,那在设置两个变量就行了。那我们还缺少什么,循环体的内容,其实也很简单,你判断他是奇数还是偶数就行,具体看一下代码。

int sum1 = 0;
int sum2 = 0;
for(int i = 1; i < 101; i++)
{
    if (i % 2 == 1)
    {
        sum1 += i;
    }
    else
    {
        sum2 += i;
    }
}
Console.WriteLine($"奇数和为:{sum1}");
Console.WriteLine($"偶数和为:{sum2}");

第十一题:获取100之间能够被5整除的所有的数?

        这道题和上面那道异曲同工,同样是100以内,只不过条件变成了能被5整除,那就还遍历呗,用个for循环,遍历一遍,能被5整除就输出,不能就接着遍历就行了,还是比较简单的。

Console.WriteLine("100之间能够被5整除的所有的数:");
for(int i = 1; i < 101; i++)
{
    if (i % 5 == 0)
    {
        Console.WriteLine(i);
    }
}

第十二题:求一个数的阶乘,如.计算10 * 9 * 8 ... *1的结果?

        求阶乘这个题我是不是之前的笔记里也有啊,不管了,再写一遍。这种题在我们后面学习完递归后一边用递归是更简单的。但我们现在没学嘛,我们就用循环来做。一般阶乘不是倒过来乘,但我们写循环的时候又喜欢正着写,那我们就调整一下呗,反正值都一样,我们正着乘就是了。那是不是又可以遍历了。你就让用户输入一个数,求谁的阶乘就输入谁,然后我们用一个for循环遍历每一个小于用户输入的数,遍历一个乘一次,直到完全遍历。至于输出这一块,你如果想让输出规整一点,那就设置个字符串嘛,然后还是遍历输出,然后就会有一个完整的阶乘公式了。

 Console.WriteLine("请您输入一个数字:");
 int num = int.Parse(Console.ReadLine());
 int end = 1;
 for(int i = 1; i <=num; i++)
 {
     end *= i;
 }
 string str = num.ToString();
 while (num >1)
 {
     num--;
     str += $"*{num}";
 }
 str += "=";
 Console.Write(str);
 Console.WriteLine(end);

第十三题:目标是搬砖500个,第一次搬砖1个,后面因为更加熟练,每次递增一倍,1、2、4、8、16.32 64 128 256..,搬砖500个需要多少次?

        这道题感觉和斐波那契那道题有点像,也是初值会改变,但没有那道题那么复杂,我们来看一下吧。首先我们看初值是多少,然后后面怎么变得。不难发现他就是2的幂次方的变化趋势。然后题目上给了一个要搬到的目标块数,那我们就可以设置一个变量记录他一共搬了多少块,因为最后问的是要搬多少次,那我们在设置一个计数器来记录次数,然后用一个while循环,当我们搬的块数没达到目标的时候就一直搬,搬一次记着更新计数器和每次搬砖的块数就可以了。

int frist = 1;
int count = 0;
Console.WriteLine("请输入你要搬的砖的块数:");
int goal = int.Parse(Console.ReadLine());
int sum = 0;
while (sum<goal)
{
    count++;
    sum += frist;
    frist *= 2;
}
Console.WriteLine($"搬{goal}块砖需要{count}次。");

第十四题:有一个学校,现在有8个人,每年学院增长23%,几年后学员可以达到100人?

        这道题其实是有点歧义的,因为变量的定义是整形就是整形,浮点型就是浮点型,那牵扯到百分比,我们一般是要用到浮点数的,但是这又是跟人有关,那肯定不会有半个人对吧,不然那也太吓人了,所以这边我就用的整形去定义了,时间可能就会长点。别的的话感觉也没啥,很基础的一道题,理解清楚题目的意思就能解决了。

double howLong = 0;
Console.WriteLine("请输入当前学校人数:");
int now = int.Parse(Console.ReadLine());
Console.WriteLine("请输入预期未来学校人数:");
int future = int.Parse(Console.ReadLine());
while (now < future)
{
    now = (int)(now * 1.23);
    howLong++;
}
Console.WriteLine($"{howLong}年后学院可以达到{future}人。");

第十五题:用户输入10个数字,计算10个数字的总和、平均值

        这道题,看一眼,直接思考用什么循环,当然是for了,当然while也可以哈哈,不过这种有限次数的还是用for感觉会好点,纯个人见解啊,实操的时候大家想用啥就用啥就行了。这边的话因为你要求十个数字的平均值和总和,那我们除了把每个数都相加之外在设置一个计数器,加一次记一次,最后总和除以计数器就能得到平均值结果了,具体过程看看代码:

double sum = 0;
double arr = 0;
int count = 0;
for(int i = 1; i <= 10; i++)
{
    Console.Write($"请输入第{i}个数字:");
    double num = double.Parse(Console.ReadLine());
    sum += num;
    count++;
}
arr=sum/count;
Console.WriteLine($"10个数字的总和为:{sum}");
Console.WriteLine($"10个数字的平均值为:{arr}");

第十六题:一间房子 ,有桌子和人,现在满足以下条件:3人一张桌子 余2人;5人一张桌子 余4人 ;7人 一张桌子 余6人 ;9人一张桌子 余8人;11人 正好凑满 问有多少人?

        这道题其实刚开始的时候主播也没看懂,问了豆包才明白题目是啥意思,具体的拆解我写在注释里了,大家可以自行看一下,题意理解之后就会很简单了。

//一间房子 ,有桌子和人,现在满足以下条件:
//3人一张桌子 余2人不够一桌;
//5人一张桌子 余4人不够一桌 ;
//7人 一张桌子 余6人不够一桌 ;
//9人一张桌子 余8人不够一桌;
//11人 正好凑满 问有多少人?
//拆解:总人数再多加 1 个人,就能同时被 3、5、7、9 整除,且能直接被11整除,全部刚好坐满,没有剩余。
int peopleNum=0;
while (true)
{
    peopleNum++;
    if((peopleNum+1)%3==0&& (peopleNum + 1) % 5 == 0 && (peopleNum + 1) % 7 == 0 && (peopleNum + 1) % 9 == 0 && peopleNum % 11 == 0)
    {
        Console.WriteLine($"总人数为:{peopleNum}");
        break;
    }
}

第十七题:获取从2000年到2024年,中间有多少个闰年?

        这道题和上面的题挺像的   你知道要明白闰年的规则就迎刃而解了,这里就不再多说了,直接看代码吧:

 //闰年规则:能被 4 整除。但是如果能被 100 整除,就必须再能被 400 整除,才是闰年
 int count = 0;
 for(int year = 2000; year <= 2024; year++)
 {
     if ((year % 4 == 0 && year%100!=0)||(year%400==0))
     {
         count++;
     }
 }
 Console.WriteLine($"从2000年到2024年,中间有{count}个闰年");

第十八题:鸡兔同笼 假设 有鸡和兔一共35只 有94只腿 问 鸡和兔各有几只

        经典数学问题,有没有梦回中学那种感觉?思路也挺简单,两个方程你只要能列出来就能求出来嘛,这里同样不多说了。

 int a = 0; // 鸡,从0只开始试
 int b;     // 兔,由总数计算得出

 while (true)
 {
     b = 35 - a; // 核心:兔 = 总只数 - 鸡

     // 判断腿数是否等于94
     if (a * 2 + b * 4 == 94)
     {
         Console.WriteLine($"鸡有{a}只");
         Console.WriteLine($"兔有{b}只");
         break; // 找到答案,退出循环
     }

     a++; // 只让鸡的数量+1,兔自动计算
 }

第十九题: 50以内最大的三个素数之和

        这个和上面的那道求素数的题一样啊,只不过他说的是50以内最大的三个素数之和,那我们肯定要先找出来这个素数是多少,然后在求和嘛,而且明确是50以内了,那我们就可以从上往下找,找到的前三个不就是需要求的数,再把他们加在一块就妥了,具体看看代码吧!

int count = 0;
int sum = 0;
// 从50往下找
for (int i = 50; i >= 2; i--)
{
    bool isPrime = true;
    for (int j = 2; j < i; j++)
    {
        if (i % j == 0)
        {
            isPrime = false;
            break;
        }
    }
    if (isPrime)
    {
        sum += i;
        count++;
        if (count == 3) break; // 凑够3个停止
    }
}
Console.WriteLine("50以内最大三个素数之和:" + sum);

第二十题:

环输入商品编号和购买数量,系统自动计算每种商品的价钱(单价X数量),并累加总金额。

当输入n时结账(假设享受8折优惠)

结账时,根据折扣计算应付金额,输入实付金额,并找零

        这道题主播选择了一个switch...case来做啊,相对而言会比较简单一点,代价就是代码会写的长一点,具体看下代码吧,实在不理解评论区见,我给大家做讲解。

流程如下图:

double bfmoney = 0;
int t = 245;
int w = 570;
int p = 518;
Console.WriteLine("*********************************");
Console.WriteLine("1.T恤    2.网球鞋    3.网球拍");
Console.WriteLine("*********************************");
int money1 = 0;
int money2 = 0;
int money3 = 0;
int count1 = 0;
int count2 = 0;
int count3 = 0;
bool botton = true;
while (botton)
{
    Console.Write("请输入你要购买的商品的编号:");
    string str = Console.ReadLine();
    switch (str)
    {
        case "1":
            Console.Write("请输入你要购买的数量:");
            int num1 = int.Parse(Console.ReadLine());
            money1 += t * num1;
            count1 += num1;
            Console.WriteLine($"T 恤  ¥245   总数量: {count1}  合计:¥{money1} ");
            Console.WriteLine("是否继续(y/n)");
            string ans1 = Console.ReadLine();
            if(ans1=="n")
            {
                break;
            }
            else
            {
                continue;
            }
        case "2":
            Console.Write("请输入你要购买的数量:");
            int num2 = int.Parse(Console.ReadLine());
            money2 += w * num2;
            count2 += num2;
            Console.WriteLine($"网球鞋  ¥570   总数量: {count2}  合计:¥{money2} ");
            Console.WriteLine("是否继续(y/n)");
            string ans2 = Console.ReadLine();
            if (ans2 == "n")
            {
                break;
            }
            else
            {
                continue;
            }
        case "3":
            Console.Write("请输入你要购买的数量:");
            int num3 = int.Parse(Console.ReadLine());
            money3 += p * num3;
            count3 += num3;
            Console.WriteLine($"网球拍  ¥570   总数量: {count3}  合计:¥{money3} ");
            Console.WriteLine("是否继续(y/n)");
            string ans3 = Console.ReadLine();
            if (ans3 == "n")
            {
                break;
            }
            else
            {
                continue;
            }
        default:
            Console.WriteLine("输入错误,请重新选择!");
            continue;
    }
    botton = false;
}
bfmoney = money1 + money2 + money3;
Console.WriteLine("折扣:0.8");
Console.WriteLine($"应付金额:{bfmoney*0.8}");
Console.WriteLine("请输入您要付款的金额进行付款");
double afmoney = double.Parse(Console.ReadLine());
Console.WriteLine($"实付金额:{afmoney}");
double a = afmoney - bfmoney*0.8;
Console.WriteLine($"找钱:{a}");

ok啊,明天周日,休息一天,我们下周一再见!!

更多推荐