奶檬讲C语言:第三章——计算三角形面积

C语言是很经典的一种编程语言。所以本系列只是讲一下基础内容,仅供初学者学习如何打代码,不对专业知识进行过多的解释,旨在让感兴趣的同学可以操作而非全部理解。

C语言系列文章
 

C语言:第一章——Hello World!https://blog.csdn.net/Yang_04/article/details/147539548

C语言:第二章——计算三角形周长https://blog.csdn.net/Yang_04/article/details/147540458

本系列代码都将在 C语言编译器:Dev-cpp 5.11 中进行编写运行。

图片

在上一章中,我们已经学会了如何通过输入函数和输出函数设计一个计算三角形周长的程序。不记得的自己回去看前两篇。

那么在这一章,我们可以改进一下,写一个计算三角形面积的代码程序。

首先,我们可以回顾一下上一章的C语言写法

#include <stdio.h>

int main()
{
    int a,b,c,C;// 定义三角形三条边长的变量a,b,c和 三角形周长的变量C

    // 依次输入三角形边长a,b,c的值
    printf("三角形三边长a,b,c的值为:");
    scanf("%d %d %d",&a,&b,&c);

    printf("三角形的周长C为:%d \n",C = a + b + c);// 输出时赋值并显示三角形周长的变量为 C 
    printf("三角形三边长a,b,c的值为:%d,%d,%d",a,b,c);  // 依次输出三角形边长a,b,c的值

    return 0;
}

上面是计算三角形周长的对吧,应该不陌生吧,那么我们现在想要写一个计算面积的话,那应该怎么写呢?

首先我们会想到用三角形面积公式:底×高÷2

但是在代码中我们应该如何写呢?那我们还是要写一个C语言的框架

#include <stdio.h>

int main()
{



    return 0;
}

然后我们需要定义程序中需要使用到的元素,如三角形的底、高以及面积,并且我们可以先给其赋值为零,这个做法叫做 清零” ,可以避免有些程序在运行开始时 会给我们的元素变量 随机丢个值 从而导致计算失误 以及可能会产生一些乱七八糟的数值结果。

#include <stdio.h>

int main()
{
    int DI = 0,GAO = 0;        // 定义元素变量: 底DI 和 高GAO 并 做清零操作
    int S = 0;                 // 定义元素变量: 面积S 并 做清零操作

    return 0;
}

接下来我们使用输入函数scanf(),实现用户输入三角形底的数据和高的数据这一操作,但是为了人性化一点,我们可以在输入前用输出函数printf()增加一个显示内容来为用户解释我们现在要干嘛,比如这样

#include <stdio.h>

int main()
{
    int DI = 0,GAO = 0;        // 定义元素变量:底DI 和 高GAO 并 做清零操作
    int S = 0;                 // 定义元素变量:面积S 并 做清零操作

    printf("请输入三角形的底:");
    scanf("%d",&DI);
    printf("请输入三角形的高:");
    scanf("%d",&GAO);

    return 0;
}

然后就是计算三角形面积S啦~我们可以这样写

#include <stdio.h>

int main()
{
    int DI = 0,GAO = 0;        // 定义元素变量: 底DI 和 高GAO 并 做清零操作
    int S = 0;                 // 定义元素变量: 面积S 并 做清零操作

    printf("请输入三角形的底:");
    scanf("%d",&DI);
    printf("请输入三角形的高:");
    scanf("%d",&GAO);

    S = DI * GAO / 2;
    printf("三角形的面积S为:%d\n",S);

    return 0;
}

运行一下,我们可以看到程序运行成功,我们呢,也更加熟练地掌握了 输入函数scanf() 和 输出函数printf() 的用法!

图片

不过,我们计算三角形面积时不一定每次都可以知道底和高是多少,有时候只知道两边一角,有时候只知道两角一边,不过,这个都是变形题的思路,感兴趣的可以自己去设计一下。那么接下来我们来做做最简单的一个变形题:已知三角形三边a,b,c长度,求三角形面积S。经常上高中的同学们都知道,我们在高中数学中学过正弦定理、余弦定理,我们这里呢,不用那么麻烦,当然,你感兴趣的话可以自己设计一个,逻辑没错的话应该也不会有问题。

那么,已知三角形三边长,求面积的话,我们肯定不能继续用 底×高÷2 这个公式了,因为我们不知道三角形的高具体是多少。所以我们需要用到一个在高中数学课本中出现过但是不经常被人发现并提及的—— 海伦公式 ,如果你对这个公式毫无记忆,没事,我帮你百度一下

图片

是不是感觉有点妙啊,一下子就茅塞顿开了是不是?由此,我们现在可以开始写代码了,首先还是关于我们需要用到的元素变量定义 以及 我们需要的计算公式和显示内容

#include <stdio.h>

int main()
{
    int a = 0,b = 0,c = 0;
    int p = 0,S = 0;
  
    printf("请输入三角形三边长a,b,c的值:");
    scanf("%d %d %d",&a,&b,&c);

    p = (a + b + c) / 2;
    S = 根号(p * (p - a) * (p - b) * (p - c));
  
    printf("三角形的面积S为:%d",S);
  
    return 0;
}

现在是不是有个问题,在 “海伦公式” 中,有个根号,而我们的代码里应该如何求根号值呢?

很多人在初学的时候 想当然地以为打个勾 “√” 计算机就能识别到你说的是什么,但其实并不是,我们的代码 其实都是由各种各样的函数做支撑的,而这些函数都是有前人写好了的,所以我们可以轻而易举的使用这些函数 并得到结果,比如 输入函数scanf() 和 输出函数printf() 。

如果我们直接打个勾的话,我们可以发现,这样的代码运行起来是有问题的,比如这样

图片

所以如果我们想要开根号的话,我们需要自己想一个函数去解决它,也可以使用别人想好的函数去解决问题。这是我们后面会涉及到的工程思想,反正如果别人写好了,封装好一个可以移植的函数,我们也可以直接照搬过来使用,这样会避免了很多问题的发生。

言归正传,我们现在可以百度一下有没有一个函数可以做到开平方的功能,这样我们呢就不用自己想应该怎么去得到计算值了:

菜鸟教程 - C库函数sqrt()

图片

通过这个说明我们可以知道,开根号函数sqrt()包含在math.h头文件中,而且用法十分简单,直接把我们想要开根的数值放进小括号里面去就好了,所以想要使用这个函数的话,我们需要这样写

#include <stdio.h>
#include <math.h>

int main()
{
    int a = 0,b = 0,c = 0;
    int p = 0,S = 0;

    printf("请输入三角形三边长a,b,c的值:");
    scanf("%d %d %d",&a,&b,&c);

    p = (a + b + c) / 2;
    S = sqrt((p * (p - a) * (p - b) * (p - c)));

    printf("三角形的面积S为:%d",S);

    return 0;
}

如果你不理解,可以这样子想想,我们的 C语言第一篇 中有讲到,第一行这个include的作用相当于我们的大脑,现在这个程序光靠 标准输入输出头文件(stdio.h)的话,计算不了开平方,因为它不懂,那它就要学,学什么呢?学关于数学的知识,把数学(math)装进脑子里,所以我们用第二个include来包含它,因为不同的知识我们都是需要分开记忆的嘛

这样的话我们的程序就大功告成啦~而且运行一下发现没有任何错误(注意:我们在写代码的过程中,要避免产生error,因为error是致命的错误,但凡有一个error程序都无法运行。但如果是warning那就可以暂时忽略,因为warning只是警告,不过能尽量少一点就少一点啦,实在有的话,只要不影响程序运行那也无伤大雅啦~)

图片

注意,第13行中的字母与字母相乘,其中的乘号(*)不能省略不写,因为不写的话计算机有可能会识别成变量或者别的内容,这样就无法实现乘法运算,我们的程序运行起来也会出现相应的问题。

至此,我们的第三个C语言文件已经写完了,并且运行成功!(是不是感觉好累,没逝,刚开始都这样,习惯了就好了)

当然,这时候的你可能就会问了:我们的三角形也不总是整数,如果出现小数的话,还是继续用整型int的话,那输入输出的结果都只会是整数,那就可能会产生误差,有时候可能很微不足道,但有时候又甚至会酿成大祸,失之毫厘,谬以千里。

那么,在我们设计程序的时候,就要考虑变量的类型和取值范围。那么,C语言中的变量类型除了int,还有哪些呢?

这里就介绍几个最常用的基础数据类型,如果感兴趣的话可以自行去了解具体的数据类型有哪些,以及它们的使用区别

int:整数类型(“整型”)

float:浮点数类型(“单精度浮点型”)

double:浮点数类型(“双精度浮点型”)

char:字符类型(“字符型”)

接下来我们可以稍微理解一下这几个数据类型,整型我就不过多介绍了,在 C语言:第一章——Hello World! 中文末有讲述,整型就是“整数”的英文缩写(integer)

那么浮点数是什么呢?为什么又要用 float 和 double 来区分单双精度呢?两者又有什么区别呢?

简而言之,浮点数嘛,就是有小数点的数。浮,点,对吧~很好理解。而且float的中文就是 “漂浮,悬浮” 的意思

图片

float是单精度浮点数,我们可以百度一下,你会惊奇地发现网上的解释有点复杂,那么你可以大致这样理解单双精度他俩的区别是,双精度的存储数据范围比单精度的要大,毕竟人家是叫“双”精度的嘛,对吧,肯定要在某些方面上更有优势一点~

图片

所以呢,double是“双精度浮点型”嘛,因为double的中文就是 “双倍” 的意思嘛,这样子看是不是很容易get的到它的意思啊?

图片

由此我们就可以知道了:

如果要存放 整数 数据的话,我们就用 int(整型) 的变量

如果要存放 小数 数据的话,我们就用 float 或者 double (浮点型)的变量

那么如果我们先要存放 不是数字类型 的数据呢?比如中文、字母等。那么就要用到我们刚刚眼熟了一下的 char(字符型) 数据类型了

图片

我们可以写一个简单的程序来看看char类型怎么使用,以及使用效果是什么样子的

#include <stdio.h>

int main()
{
    char x;             // 定义一个char(字符型)数据类型变量 x 
    x = 'Y';            // 用 单引号 将 字符 Y 赋值给变量 x  
    printf("%c",x);     // 用 输出函数 printf() 输出变量 x 的值 
    return 0;
}

运行一下,我们可以看到小黑框中出现的是我们赋值给变量x的 Y 而不是数字或者是其他的什么玩意儿

图片

相信聪明的你会注意到,我们在这个程序里写的时候,字符Y在赋值是并不是想整型那样直接写数字,而是用单引号来包住我们赋值的内容。

当我们想要存取 单个字母 时,我们就用 单引号(' ') 来填写内容

当我们想要存取 多个字母 时,我们就用 双引号(" ") 来填写内容

而且,想要显示多个字母的话,我们需要一个叫 “数组” 的东西,这个东西以后会大大方便我们存储数据的能力。“数组”,顾名思义,就是 “一组数据” 。也就是存放很多数据的,不像我们平时使用的那些,都是只能 一对一 的存放数据;而数组,是 一对多 的存放数据。

数组的使用方法就是加一对中括号(  [ ]  )。

我们可以看一下这个代码

#include <stdio.h>

int main()
{
    // 定义一个char(字符型)数组 x 并用 双引号 将 字符 赋值给数组变量 x  
    char x[] = "Hello World!";
    printf("%s",x);            // 用 输出函数 printf() 输出变量 x 的值 
    return 0;
}

运行一下,我们可以看到 数组x[] 里存放了数据是 一串字符(“字符串”,英文string)。

关于数组的具体概念,后面有机会再讲(没机会就算了,乐,随意一点)或者自己百度一下也可以,这里使用数组只是稍微提一嘴而已。

图片

相信眼神犀利的你会注意到,在上面两个程序中,除了单双引号的不同,还有一个显著的不同之处,那就是 输出函数printf() 中的 “%c” 和 “%s” ,在 C语言:第二章——计算三角形周长 中我们知道, 输出函数printf() 中用 “%d” 的话,那就是用来 输出十进制整数 的(而且百分号“%”只是占位符)

所以我们通过这个规律 可以知道 常用的数据类型在使用输入输出函数时 的一些对应关系:

%d:给 十进制整数 占位置

%f:给 单精度浮点数float类型 占位置

%lf:给 双精度浮点数double类型 占位置(%lf的l是 long 的意思,比单精度float的要长一点嘛,这样子想是不是形象生动了一点?)

%c:给 单字符char类型 占位置

%s:给 多字符char类型数组 占位置(%s的s是 string 的意思)

由此我们可以写个代码看一下效果

#include <stdio.h>

int main()
{
    int a = 3.1415926;
    printf("a=%d\n",a);  
  
    float b = 3.1415926f;
    printf("b=%.2f\n",b);  
  
    double c = 3.1415926;
    printf("c=%lf\n",c);  
  
    char x = '3.1415926';
    printf("x=%c\n",x);  
  
    char y[] = "奶檬Ya";
    printf("y=%s\n",y);  
  
    return 0;
}

眼尖的朋友可能看到了,在第9行输出float单精度浮点数类型b的时候,使用的是 “%.2f” 而不是 “%f” ,那么这会产生什么影响呢?又是干嘛用的呢?

还是以“形象生动”的方式来解释,“%.2f”,这个 “.2” ,就是 “小数点后2位” 的意思,这样子一看,是不是幡然醒悟了?

好,那么接下来我们来运行一下效果,看看是不是和我们预期的一样

图片

我们可以稍微分析一下这个程序的逻辑

第一个,因为 a是int整型,所以即使赋值时写的是带有小数的数据,那存进去的也只有整数部分(也就是 “3” ),%d输出十进制整数。所以显示a=3,没有问题

第二个,因为 b是float浮点型,所以可以赋值3.1415926给它,但是在使用输出函数时 我们采用了 “保留小数点后两位”的格式 进行输出。所以显示b=3.14,没有问题

第三个,因为 c是double浮点型,所以也可以赋值3.1415926给它,%lf也是对应双精度浮点型double的输出格式,而且呢还有四舍五入,因为超过它的显示范围了。所以显示c=3.141593,没有问题

第四个,因为 x是char字符型,所以只能用单引号存放一个字符,但是我们的单引号里是3.1415926,那么在存放数据的时候,后面的数据会一直替换前面的数据,所以“3”被“.”替换,“.”被“1”替换,以此类推,一直到最后一位“6”,所以最后就相当于x='6'。所以显示x=6,没有问题

第五个,因为 y[]是char字符型数组,所以可以用双引号存放字符串,%s也是对应字符串的输出格式。所以y=奶檬Ya,没有问题

怎么样,是不是感觉有点意思?了解了数据类型的使用,你就可以做很多事情了。比如,把我们这一章节的计算三角形面积的程序改成计算三角形三边有小数的周长以及面积

#include <stdio.h>
#include <math.h>

int main()
{
    float a,b,c;
    printf("请输入三角形边长a的值:");scanf("%f",&a);
    printf("请输入三角形边长b的值:");scanf("%f",&b);
    printf("请输入三角形边长c的值:");scanf("%f",&c);
  
    float L = a + b + c;
    float p = L / 2;
    float S = sqrt( p * (p - a) * (p - b) * (p - c) );
  
    printf("三角形周长为:%f\n",L);
    printf("三角形面积为:%f\n",S);
  
    return 0;
}

用“3、4、5”的一半运行一下,我们可以看到效果,没有问题

图片

当然了,除了计算三角形,我们现在还可以改写成计算圆的

#include <stdio.h>

int main()
{
    double PI = 3.1415926; 
    double r;
    printf("请输入圆的半径:");scanf("%lf",&r);
  
    double C = 2 * PI * r;
    double S = PI * r * r;
  
    printf("圆的周长为:%lf\n",C);
    printf("圆的面积为:%lf\n",S);
  
    return 0;
}

运行一下,我们看到结果没有问题

图片

我们可以看到,我们只是定义了PI这个变量用来存放圆周率的值,这意味着我们的PI可以在后续的代码中被重新赋值,那这个操作是不是很危险啊,因为一不小心你就会把现代数学大厦给推倒啦!

在我们生活使用中可以知道,圆周率的值虽然很长很多很复杂,但是有个最显著的特点,那就是它的值基本是不变的,是不能够随便被修改的。

所以如果在代码中出现了一直不能被修改的值(“常量”),我们就需要加多一个 “const” 去修饰变量,表明这是一个常量而不是变量,在后续的代码开发中不能随意更改它的值。

图片

 也就是这样子写

#include <stdio.h>

int main()
{
    const double PI = 3.1415926;
    double r;
    printf("请输入圆的半径:");scanf("%lf",&r);
  
    double C = 2 * PI * r;
    double S = PI * r * r;
  
    printf("圆的周长为:%lf\n",C);
    printf("圆的面积为:%lf\n",S);
  
    return 0;
}

运行效果:

图片

我们可以在后面加一句赋值PI的语句,运行之后会有报错

图片

怎么样?写代码是不是有点意思?而且还有一丢丢的烧脑,是吧?没事,慢慢来,这兴许也只是我们解读世界的一种生活方式而已。毕竟,有很多东西我们都是从寻常的生活中汲取,包括知识。

好啦,第三章完结。本文到此结束,有缘下次再见

注:本文内容说法仅为个人理解,全文原创,多处用词口语化,并非完全都是书上的概念,本系列文章旨在可以让初学者独立完成基础程序代码编写,仅供学习参考。而且本系列文章随机更新,因为我平时可能没空写或者懒得写,说不定哪天就弃坑了,也可能你所看到的就是最后一篇(乐)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值