C语言基础(有关三角形面积,阶乘算法,sqrt,pow函数,海伦公式,gets,getchar,scanf的区别,字符转换,增长率计算,的分支和循环的结构程序设计)

简介: C语言基础(有关三角形面积,阶乘算法,sqrt,pow函数,海伦公式,gets,getchar,scanf的区别,字符转换,增长率计算,的分支和循环的结构程序设计)

一、多的不吹少的不唠(开头必须是我的校园生活)

今天我们学校是异常的神奇,6点10就要起床(起床就起床吧,干点跑步之类的有益于身体健康的事情就算了),可惜居然是起床做核酸(想笑),充分打扰我的作息,搞得我核酸回来睡到了10点(要死),上午第一节课是高数,后排就是快乐,剩下的都还正常,我就讲一讲下午的体育课吧,还是挺搞笑的,比如我的神奇舍友做了150个俯卧撑(游戏小天才,没办法),哈哈,不像我,大高手。


二、今天我就把我多天来关于分支和循环的的武功给我自己再讲一讲

(一).首先是分支

1.分支结构的控制语句主要就只有两个:if语句和switch语句

至于如何使用if语句呢?先让下面这个代码告诉你:

#include<math.h>
#include<stdio.h>
int main()
{
  float a, b, c;//定义三边
  float z;     //定义半周长
  float h;     //定义海伦公式的第一小步
  float s;     //定义最后的面积
  printf("请输入三角形的三边:");
  scanf("%f%f%f",&a,&b,&c);//这步就是正常的定义变量,然后使我们可以输入3边
  //根据海伦公式,来求解只知道三边而不知道高时的三角形面积
  //有的博客连海伦公式都不介绍一下(过分),海伦公式:首先知道半周长 z=(a+b+c)/2,(但是要注意算面积是用的都是float(单精度浮点数))
  //所以要用float来定义我的半周长,知道半周长后,公式为:z*(z-a)*(z-b)*(z-c)的开平方(就是开根号,怕你不懂,多写一点呢)
  z = ((a + b + c)/2);
  h = (z * ((z - a) * (z - b) * (z - c)));
  //弄完上面那么多,无论你是否看明白了,都无关紧要,重要的是我们的分支结构(if语句)来了
  if ((a + c <= b) || (a + b) <= c || (b + c <= a))
  {
    printf("你是小天才吧!小学数学是体育老师教的吧!\n");
    printf("error: 三角形的两边之和要大于第三边哦!");
  }
  else
  {
    s = sqrt((float)h);//有的博文也是的,算一个这个不把sqrt的作用说一下(sqrt:就是对一个数进行开平方计算,就是与上文说的海伦公式有关)
    //但是特别要注意这里的sqrt,这个东西在使用使一定要注意开平方对象的类型o(咱要做一个细节的男人)
    printf("%.3f",s);
  }
  return 0;
}

虽然这里面的内容大部分与分支无关,但是这个能充分说明(if语句)的使用场景和方法,例如:按照我们小学的逻辑,三角形的两边之和大于第三边的法则,我们也可以把上面代码中的(if语句)改成 if ((a+c>b ) &&( a+b>c ) &&( b+c>a)) 相反过来,然后此时就可以在 (if语句)中打印面积,而不是上面代码中的那个东西。(这里就可以更加充分证明 if 的这个判断条件其实是与你的后面内容息息相关的,说明判断很重要,古语有云:无规矩不成方圆。但现在我有云:无 if 不成程序逻辑)。

#include<stdio.h>
int main()
{
  char ch1 = 0;
  char ch2 = 0;
  printf("请输入一个字符:");
  ch1 = getchar();//这个getchar的作用跟scanf是一样的,就是输入的意思(但是还是有很大的区别的在使用时)
  //比如getchar就跟它的字面意思一样(char嘛)所以只跟字符类型有关,每一次可以输入一个字符,并且是不连续性的。
  //然而像我们的scanf跟它比就是大高手啦!(有参数可变,类型多样的同时,还可以连续输入,但是也有一定的鸡肋,那就是在某些特定的时候用法不如(gets),下面是部分区别:
  //gets的输入分割符只有回车,因此gets是能够读入空格的。如果输入为"hello world"时,上面程序的运行结果是"hello world",然而假如用scanf的话就只能输出hello,这就是用法上最大的区别
  if (ch1 >= 'a' && ch1 <= 'z')
  {
    ch2 = ch1 - 32;//这两步字符转换没什么好说的,自己理解一下,不明白也无关紧要啦!
  }
  else if (ch1 >= 'A' && ch1 <= 'Z')
  {
    ch2 = ch1 + 32;
  }
  else
  {
    ch2 = ch1 + 1;//这个的意思就是不是英文字母的转换情况下发生的事情,就是进行别的除了英文字母外的字符的转换
  }
  putchar(ch2);
  return 0;
}

经过我的深思熟虑还是得再强调一下(if语句)的重要性,所以这边我加了一个代码(就是上面那个字符转换而已啦!),虽然代码不怎么样,但是还是把(if语句)用的很到位的,所以给各位讲解一下,

现在轮到啥了我也不多说自己悟,所以到底如何使用switch语句呢?让下面这个代码告诉你:

这个代码的重点都在(图中的注释中自己仔细看一下,有点重要),知识点如下:1.gets,getchar和scanf区别(注意都是输入函数)

2.(if语句)的使用,上述代码的if,else if 和else用的方式

3.还有就是我也不知道,反正就是认真代码的看注释就行

****(强调一下刚刚那个求面积代码是刚写的,还热乎的呢,但是现在这个捏,我就要拿出我的压箱底了,为了进度嘛,见谅见谅)

#include<stdio.h>
int main()
{
  int day = 0;
  scanf("%d\n",&day);
  switch(day)
  {
    case 1:                          //case入口 break出口
  printf("星期1\n");           //适合做多分支的代码  switch case语句
    break;
  case 2:
  printf("星期2\n");
    break;
  case 3:
  printf("星期3\n");
    break;
  case 4:
  printf("星期4\n");
    break;
  case 5:
  printf("星期5\n");
    break;
  case 6:
  printf("星期6\n");
    break;
  case 7:
  printf("星期天\n");
      break;
  }
  return 0;
}

这个我也不多做介绍,就是一个典型的switch case语句,没什么好讲的(主要就是去理解一下那个switch后面那个括号里面放的东西),剩下的自己慢慢悟,重点是在于后面的这个题目:

#define default
#include<stdio.h>
int main()
{
  int n = 1;
  int m = 2;
  switch(n)
  {
  case 1:m++;
  case 2:n++;  //这题的关键就是理解 Switch(n)中括号里的 n   假如n为1时就执行case1  假如你为2时就执行case2 不执行case1
  case 3:
    switch(n)
    {
    case 1:n++;
    case 2:m++;
         n++;
      break;
    }
  case 4:m++;
    break;
        default;
      break;
  }
  printf("m = %d, n = %d\n",m,n);
  return 0;
}

就是如上面switch代码中的那句注释,就是最重要的东西了啦!脑袋瓜要灵光一点啦!(也就是switch括号的正解)

哦!对了,身为一个细节的男人,差点忘记把答案告诉你们了,答案是(3,5),不会没做对吧!(没做对就再看一遍,关键就是注意第二个switch语句,那个地方的n++,后就会导致n=2,所以此时的case2中的m++和n++都会执行,OK!),这边在家一小个知识点:就是使用到switch语句的时候,一般都会配合上break和continue的使用,用法就是字面意思,停止和持续的意思,自己悟啦!然后这边再用一个小标题说一下:if语句的用处很多很多,早知道多拿一个代码证明一下了,谁让我居然用来两个代码来证明switch,也是怪我。哎!下次再写哈!所以这边的 if语句不是很好,没有全面的展示出精髓。


(二).然后是循环

1.现在来到了循环了各位(但是现在是北京时间10点了,为了稳重,先让我停一下,让我去提交一下我的代码啦,不然我的小绿点就会被某个人超掉了(宏某人给我注意点,晚上不要谁太早))

(二、)循环就像是分支一样(分为两种主要的循环,哦,不对是三种(哼!谁让do while循环我属实不怎么用,但是估计大神应该经常用,大神的境界不是我这个小辈能揣摩的,嗯,有道理!)),好,现在让我们了解一下什么叫for和while循环:

1.第一个小代码(先拿一个你们好理解的,具体请看书本(C语言程序设计84页))

#include<stdio.h>
#include<math.h>
int main()
{
  int n = 14;//目前人口,单位亿
  int year = 0;
  double number = 0;
  double rate = 0.02;//这个0.02题目意思的增长率啦,不要怕
  for (year = 1; year < 10; year++)//注意啦,注意啦,这个才是重点,这个就是我的循环控制语句,也就是我的目的,别的看不懂不怕
  {
    number = n * pow((1 + rate), year);//这个又涉及到了一个数学函数,所以要引一个<math.h>函数,不然跑步起来哦!
    //然后这边写一下pow函数的作用:就是跟刚刚求三角形面积那个(sqrt函数)有一点像,但是是反过来的像
    //所以pow其实就是用来求一个数的次方的,例:pow((1 + rate),year)这个的意思就是求(1+rate)的year次方的意思,不理解无所谓
    printf("%d年后,人数为:%.2f亿\n",year,number);
    //这个打印方法还是很帅的,同时打印两个变量,可以注意一下,学一学
  }
  return 0;
}

附上打印结果,其实就那样啦!


5.png

这个代码具体详情还是在注释之中,认真看(顺便讲一下,注释其实是个好东西,没事多注释哈!) for (year = 1; year < 10; year++)这个东东就是传说中的for循环,for循环就是又三个表达式构成的,(第一个表达式的意思就是,year从1开始执行)(第二个表达式的意思就是,year循环是次数,就是用来控制循环次数的,例如这个就表示这个循环9次后就会停止,因为第10次的时候year=10,不符合year<10这个判断表达式,所以停止执行)(第三个就是year++,写成year+=1,也是一个意思,或者year=year+1),随你心意好吧!说以以上就是for循环的大致构成,多的不说少的不唠,主要是想睡觉了。


2.下面再给你演示一个代码

#include<stdio.h>
#include<math.h>
int main()
{
    int i = 0;
    for (i = 0; i <= 100000; i++)
    {
        //这个括号里面实现的就是判断i是否为自幂数
        //1.计算i的位数   n位数  123
        int n = 1;
        int tmp = i;
        int ret = 0;
        int sum = 0;
        while (tmp /= 10)
        {
            n++;//如果这样写(就会导致i的数字直接变成了0,后面就不能用i了),所以应该用一个东西把i给替换,例:int tmp = i;
        }
        //2.有了位数我就要开始计算i的每一位的n次方之和(但前提是算出每位是什么)//123
        tmp = i;
        while (tmp)
        {
           sum += pow(tmp % 10, n);
           tmp /= 10;
            /*ret = tmp % 10;
            pow(ret, n);
            tmp = tmp / 10;
            sum += ret;*/
        }
        //3.比较  
        if (sum == i)
        {
            printf("这些数是自幂数:%d\n",i);
        }
    }
    return 0;
}

本来是想用阶乘的那个的,可惜我的小金库里这个比较好找,代码正规理解,就是代码注释,感兴趣你就理解一下,看不懂没关系,这个代码同时把for循环和while循环给用上了(说明只要你牛,你爱怎么写怎么写)以下是小知识点:

1.还是 先讲for循环,因为刚刚讲完,各位应该还有点印象,这边这个for循环的目的就是可以获得(0到10000)之间的所有数字,(这边就有一个小好处,就是以后不管你遇到什么题目就是叫你求,多少多少数字到多少多少数字,然后要这些数字干嘛干嘛的时候,你第一步就应该要想到有循环这种东西,先闭住眼睛把循环写上去),所以这个跟上面那个次数循环是有一点点的不一样的。

2.现在先抽象的讲一下while循环,按照上面那个代码中的while来讲:就是要注意的是while后面的括号(就跟switch中的括号一样要理解清楚),while()的这个括号的意思就是判断(最终这个括号里的东西是不是0的 意思(因为0为假,为假时它就会停止循环,执行下一步了))所以使用起来就是想上述代码一样 while (tmp), while (tmp /= 10)或者写成while(tmp!=‘\0’),while(tmp!=‘\0’),不用疑惑,其实这好理解,就是因为’\0’的ASCII码值为0,所以为’\0’就是为0,也就是为假,所以一个道理,循环停止, while (tmp), while (tmp /= 10),并且这种 写法属于简写(意思就是tmp不为0的意思和tmp/=10不为0的意思),不为0,循环就继续,为0就停止,这样的好处,按上述代码的意思来讲就是可以很简单的算出(tmp是一个几位数和tmp的个位,十位,百位的位数的次方),看不懂没关系,因为都不重要,重要的是循环是什么,怎样去理解循环(如果你觉得你自己理解了,那么你就可以去尝试理解一下阶乘的算法了,加油我的好兄弟!)算了,我还是把阶乘的算法赋在下面吧!省得你们找了。代码如下:

n的阶乘正常版
#include<stdio.h>
int main()
{
  int n = 0;
  int i = 0;
  int sum = 1;
  scanf("%d",&n);
  for(i=1;i<=n;i++)
  {
    sum = sum * i;//这步最好替换成sum *= i;
  }
  printf("sum=%d\n",sum);
  return 0;
}
#include<stdio.h>
int main()
{
  int i = 0;
  int sum = 0;//这边保存的才是最终结果,也就是阶乘相加
  int n = 0;
  int ret = 1; //这个地方就是为了保存,的阶乘而已
  scanf("%d",&n);
  for (i = 1; i <= n; i++)
  {
    int ret = 1;
    int j = 0;
    for(j=1;j<=i;j++)//这边就是为了产生 ‘1到i’的所有数字而已
    {
      ret *= j;//假如这边的现在是3的话,那这边就是为了算3的阶乘,所以这边的for循环要循环3次,表示从1*2*3,代表3的阶乘
    }            //出错的原因就是没有将ret给重新赋值,导致ret不再是1,而是2;
    sum += ret;
  }
  printf("%d\n",sum);
  return 0;
}

对循环(有关阶乘)的深入讲解:(结合代码仔细看)

这两个代码上面那个算的是某一个数的阶乘(用到了一个for循环),而下面这个讲的是(等一下哈,让我仔细看一下讲的是什么 鬼,好滴,这个讲的就是,你输入一个数,然后你就可以得到从1开始到这个数的所有数字的阶乘的和了),这个比上面那个单独求一个数的阶乘更高级一点点,所以用到了两个for循环,(其中第一个for循环是:用来得到 1 到我输入那个数之间的所有的数的,这个应该能看明白的。然后第二个for循环就是为了:得打1到我输入数之间所有数的阶乘的),然而为了实现得到 1 到我输入那个数之间的所有的数,(代码中的(i<=n)就显得尤为的重要了),因为只要当 i<=n时,这个循环就会执行,所以我就实现了得到 1 到我输入那个数之间的所有的数的这个目的了。然而又为了得到 1到我输入数之间所有数的阶乘,第二个for循环中的 ret *= j ,这步就显得比较关键(前提是ret=1,不然如果ret=0,那就一直得到的都是0(具体原理,问你小学老师)), ret *= j ,这个还是写常规一点:ret=ret * j,这个的意思就是把 j 的值每次都乘到 ret 中,然后再赋值给ret,这样就可以实现 ret 的 连续相乘,得到从 1 到 这个循环中的那个数之间的所有数字的相乘(也就是传说中的阶乘啦!)(这边还是举个例子,比较形象,例如:此时 输入n=5,i此时为1,小于5,判断为真,所以进到循环里面,进来后就来到第二个for循环,也成立,进来到赋值这步ret=ret * j,赋值完,此时的ret就是等于1,因为是第一次循环),所以照猫画虎,这样的循环重复5次(第一个循环循环5次,然后这边特别 要注意的就是第二个for循环),因为第二个for循环每次都是从 1 开始的,所以无论第一个for循环循环了几次,第二个for循环永远从一开始(也就是导致要从 1 开始循环到此时第一个for循环的那个次数,比如第一个for循环此时第3次,那么我的第二个for循环就要从 1 循环到3,只有这样我才能完美的实现阶乘这个算法)。所以你理解了吗?入所理解了,你就算是对循环有了一定的理解了。


三、多的不说,少的不唠(个人浅薄理解)

其实重要的是要有耐心,多看多理解,假如你能看完这些,那么证明你是一个有耐心的人,然后就是排版不是很有条理,见谅见谅,睡觉大吉!

相关文章
|
4月前
|
C语言
C语言分支和循环语句
分支语句由`if-else`构成,用于根据不同条件执行相应代码。`else`会与最近未配对的`if`结合,多个条件可用`else if`实现。若连续使用`if`,各条件互不影响。嵌套结构可在`if`中再加入`if-else`。此外,`switch`语句适用于多分支选择(注意表达式不能为浮点数,`case`后需加`break`)。循环语句包括`for`、`while`和`do...while`,注意`do...while`末尾需加分号。循环中,`break`直接终止循环,`continue`跳过当前循环剩余部分,但`for`的语句三仍会执行,而`while`中位置影响效果。
52 0
|
8月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的循环语句
本文介绍了C语言中的三种循环语句:`while`、`do-while`和`for`,并详细解释了它们的语法格式、执行流程及应用场景。此外,还讲解了循环控制语句`break`和`continue`的使用方法。希望这些内容能帮助你在编程道路上不断进步,共同成长!
471 0
一文彻底搞清楚C语言的循环语句
|
9月前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
129 19
|
9月前
|
算法 C语言
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
209 18
|
9月前
|
Serverless C语言
【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;运用迭代公式,编写一个循环程序,求解出数值x的平方根。注意:不能直接用平方根公式/函数求解本题!开始你的任务吧,祝你成功!​ 相关知识 求平方根的迭代公式 绝对值函数fabs() 循环语句 一、求平方根的迭代公式 1.原理 在C语言中,求一个数的平方根可以使用牛顿迭代法。对于方程(为要求平方根的数),设是的第n次近似值,牛顿迭代公式为。 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得越来越接近。
174 18
|
9月前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
180 13
|
9月前
|
存储 C语言
【C语言程序设计——循环程序设计】利用数列的累加和求 sinx(头歌实践教学平台习题)【合集】
项的累加和,一般会使用循环结构,在每次循环中计算出当前项的值(可能基于通项公式或者递推关系),然后累加到一个用于存储累加和的变量中。在C语言中推导数列中的某一项,通常需要依据数列给定的通项公式或者前后项之间的递推关系来实现。例如,对于一个简单的等差数列,其通项公式为。的级数,其每一项之间存在特定的递推关系(后项的分子是其前项的分子乘上。,计算sinx的值,直到最后一项的绝对值小于。为项数),就可以通过代码来计算出指定项的值。对于更复杂的数列,像题目中涉及的用于近似计算。开始你的任务吧,祝你成功!
209 6
|
9月前
|
C语言
【C语言程序设计——循环程序设计】鸡兔同笼问题(头歌实践教学平台习题)【合集】
本教程介绍了循环控制和跳转语句的使用,包括 `for`、`while` 和 `do-while` 循环,以及 `break` 和 `continue` 语句。通过示例代码详细讲解了这些语句的应用场景,并展示了如何使用循环嵌套解决复杂问题,如计算最大公因数和模拟游戏关卡选择。最后,通过鸡兔同笼问题演示了穷举法编程的实际应用。文中还提供了编程要求、测试说明及通关代码,帮助读者掌握相关知识并完成任务。 任务描述:根据给定条件,编写程序计算鸡和兔的数量。鸡有1个头2只脚,兔子有1个头4只脚。
430 5
|
10月前
|
存储 算法 安全
C 语言中的位运算:挖掘底层计算的高效力量
位运算是C语言中直接操作二进制位的一种技术,能高效处理底层数据,广泛应用于优化算法、硬件编程等领域,是掌握C语言高级特性的关键之一。
|
11月前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
570 4

热门文章

最新文章