10讲学会C语言之第二讲:学会用C编程


前言

大家好,我是卷卷。本节课的主题是学会用C编程。本节课主要有三个部分:基本知识,简单案例和作业。从本节课开始,每节课都会有作业,希望大家认真对待哦。(讨论q群号744931080,教程资源在群内)


一、基本知识

在上一讲,我给大家写了一个简单的程序,屏幕输出hello world:

#include<stdio.h>
int main(){
	printf("hello world!\n");
	return 0;
}

本节课我就来给大家分析一下,首先要写上头文件的声明一个井号加上一个include,再加上一对尖括号,里面写上stdio.h。这个.h是头文件的后缀名这个头文件的声明,也是每个C/C++程序所必备的,下面是主函数。主函数由返回类型,int,函数名main,圆括号和花括号构成。花括号内部是代码的运行范围,然后是printf函数。它是一个输出函数,只要在圆括号内部写上你想要的内容,它就会在屏幕上输出相应的内容。在程序中,字符串由一对双引号包括。然后要写上一个return 0。接着是分号:在这里插入图片描述
除了花括号和头文件的声明之外,每一句代码后面都必须跟上一个分号,表示这句代码的结束。如果你忘了分号,就会是这样的:在这里插入图片描述
编译器报错了,它说它期望在return之前,需要一个分号,所以可以这样加上分号:但一般不这样写,因为可读性不是很好,所以还是建议在写完一句代码后面,立刻跟上一个分号。这就是,hello world程序的简单分析了。接下来讲一下基本知识:\t,\n,常量,变量,函数,注释,内存四区,C程序的生成。我们逐一讲解。首先是换行符,以下是演示:

	printf("hello world!\na");

在这里插入图片描述
大家看a输出在第二行所以\n的作用就是换行。\t的作用就是这个:

	printf("hello world!\ta");

在这里插入图片描述
a和之前的字符隔了很多个空白字符。我们可以数一下,总共4个字符。所以\t的作用就是输出4个空白符。在C/C++程序中,主要有如下四种变量类型:
             基本变量类型在这里插入图片描述
我们都知道1个字节等于8位。所以它总共可以表示2的8次即256个字符,都是ASC码表上的字符。我们来看一下ASC码表:
               ASCII
在这里插入图片描述
这就是ASC码表的一部分,右边是字符,左边是十进制。所以字符在内存中是以数字来表示的。其中字符0-9,大写字母,小写字母,都是按升序排列的。注释的作用就是用来解释说明的,在C/C++程序中有两种注释方式。第一种是写上两个斜杠表示注释一行:

//printf("hello world!\n");

编译器器会自动忽略这行,程序执行时也不会执行这行。另外一种是两个星号和两个斜杠:

/*printf("hello world!\n");*/

被两个星号包围的内容就是被注释的内容。接下来简单地讲一下函数,前面已经讲过主函数main,我们现在知道,它返回的必须是一个整数。在main函数中要返回一个0。这个是固定格式,一般不能随便改动。接下来讲一个比较基础,也比较重要的概念,内存四区。我们知道程序是在内存中运行的,那么程序运行期间的数据,要放在内存的哪些地方呢?它们放在以下地方:堆区,栈区,全局区,代码区。其中代码区,顾名思义就是存放代码的地方。全局区,顾名思义就是存放全局变量的地方。先讲一下如何定义一个变量,首先写上变量的数据类型然后加上一个空格,然后写上变量名:int abc;如果你有需要的话,可以在定义变量的时候,给他赋一个初始值:int abc=1;这个等号表示赋值,不是相等的意思。这句代码的意思就是,定义了一个整数abc,然后它的初始值被赋为1。这样定义的变量,它称作(栈区上的)局部变量。因为它定义在花括号内部。局部变量在花括号结束以后就会消亡,也就是它的内存空间会被释放。如果你将这个变量定义在花括号之外,那么这个变量就成为了全局变量:

int abc=1;
int main(){
	return 0;
}

这样,在之后的任何地方都可以使用它。只有当程序结束运行以后,它才会消亡。如何在花括号内定义一个变量,又不让它在花括号结束后消亡呢?这里要用到一个操作叫做动态内存分配。使用动态内存分配的变量,会被定义到堆区上。在花括号结束后不会消亡,如果你在花括号之外,定义这个变量,并使用动态内存分配,那么它将分配到堆区上,而不是全局区上。也就是只要经过动态内存分配的变量,它都会分配到堆上,而且也是在程序结束后消亡。你也可以手动释放动态内存分配过的变量,如果你手动释放,那么它会提前消亡。

二、简单案例

接下来我们来看一下案例:在这里插入图片描述
首先题目用到了两个量,华氏度和摄氏度,所以我们定义整型变量c表示摄氏度。整型变量f表示华氏度。接着我们把100赋值给f,再根据f和公式计算结果赋值给c,最后输出c即可。本题的重点是赋值,除号,整数输出格式。我们来看一下代码:

#include<stdio.h>
int main(){
	int c,f;
	f=100;
	c=5*(f-32)/9;
	printf("%d",c);
	return 0;
}

首先定义两个整型变量。如果将多个变量定义在同一行,就要用逗号来分隔,接着我们把100赋值给f。然后计算一下公式,把公式结果赋值给c。这里注意乘号必须用星号来表示,如果你不加星号,编译器会报错。这和数学中的概念不同,程序中表示乘法必须用星号。这里的除号也和数学中的概念不太一样,这里的除号表示向下取整。比如说5/3=1,7/3=2,它们都是向下取整的。什么叫向下去整呢?比如说5除以3是1点几,那么它会取整数的部分。也就是取小于这个结果的最大整数。所以叫向下取整,如果取大于这个结果的最小整数,就叫做向上取整。比如说这个结果是一点几,那么结果就是2。接着我们输出c:

printf("%d",c);

输出一个变量,首先要看它是什么类型,整数类型用百分号d表示。然后写一个逗号,然后写上它的变量名,比如c。用这个变量名去替代字符串里面的内容,这就是整数的输出格式。我们来试一下:在这里插入图片描述
这就是运行结果了,另外,表示变量不一要用变量名,还可以用表达式:

	printf("%d",5*(f-32)/9);

我们可以看到结果是等效的。接下来补充一下模运算,在程序中除了四则运算,还有一个基本运算叫作模运算。模的符号是%,即百分号,表示取余数。比如说5%3=2,7%3=1。我们来验证一下:在这里插入图片描述
结果是2,1。好了,这就是本题的讲解了。

例题2:在这里插入图片描述
首先题目用到了两个量,x和y,所以我们定义整型变量x表示用水量,整型变量y表示水费。再输入x,根据x的值分别判定计算,结果赋值给y。最后输出y即可,本题的重点是小数的输入与输出,if else结构,我们来看一下代码:

#include<stdio.h>
int main(){
	double x,y;
	printf("请输入用水量(吨):");
	scanf("%lf",&x);//与号必加! 
	if(x<=15){ 
		y=x*4/3;
	}else{
		y=x*2.5-10.5;
	}
	printf("你应支付%.2f元\n",y);
	return 0;
}

首先定义了两个双精度浮点数,然后给出提示,然后输入x。这个输入函数的参数格式和printf差不多,关键在于一个符号:&。这个符号叫做与号,每一个scanf函数里面都必须加上与号。当然如果后面我们学了字符数组,可以不用加与号。除了字符数组之外其他参数,都必须加上&。小数的输出格式是lf,小写的LF。这里有个比较重要的点:在输入格式中,小数的输入形式是不一样的。单精度浮点数的格式是%f。双精度浮点数是%lf,全称是long float。但是在输出函数里,不管你是双精度还是单精度,统一用百分号f来表示:

数据类型输入输出
float%f%f
double%lf%lf

然后我们用if else结构来判定变量:

	if(x<=15){ 
		y=x*4/3;
	}else{
		y=x*2.5-10.5;
	}

if后面跟上一个圆括号,然后一个花括号,else后面跟上一个花括号,这是固定的形式。当然如果花括号里面只有一句,可以不用加花括号。不加花括号的作用范围就只有一句,也就是只执行到第一个分号为止,这点我希望大家牢记,以后可能经常要用到或者看到。圆括号里面是判定表达式的真假值,比如说这个表达式它的意思是如果x<=15为真,就执行if里面的内容。如果结果为假,就执行else里面的内容。这里必须要强调一点:在C/C++程序中,假是用0来表示的,真是用非零数来表示的。如果表达式里面是一个0,那么会立即执行else里面的内容。如果表达式里面的值非0,比如1,2,3等等。就会执行if里面的内容。这点也是非常重要的,希望大家牢记!计算好以后我们来输出y:

	printf("你应支付%.2f元\n",y);

注意点2f表示保留两位小数,点3f就是保留3位小数。我们来试一下:在这里插入图片描述
这就是本题的运行结果了。接下来还要补充几点:在程序中,一个感叹号加上等于号,即“!=”,就是不等于的意思,两个等于号,即“==”就是等于的意思,注意感叹号是英文状态下的。

我们来看下一题:在这里插入图片描述
首先题目给了华氏度的范围,并要求我们对范围内的每个数都做处理,而每个数的处理模式都是一样的。所以我们可以借助for循环来处理。根据题目的要求,我们要定义两个整数,lower和upper。输入它们,然后注意检查输入范围是否正确,因为作为区间端点,lower是不可能超过upper的。所以若输入错误,则给出提示,若正确则继续。再利用for循环,每轮循环都根据公式计算c并输出。本题的重点是for循环和强制转换,我们来看一下代码:

#include<stdio.h>
int main(){
	int lower,upper;
	printf("请输入下界:");
	scanf("%d",&lower);
	printf("请输入上界:");
	scanf("%d",&upper);
	if(lower>upper){
		printf("输入范围有误!\n");
	}else{
		printf("转换表如下:\n");
		for(int f=lower;f<=upper;f++){
			double c=5*(f-32)/9;
			printf("%d %.1f\n",f,c);
		}
	}
	return 0;
}

首先定义两个变量,然后给出提示,输入变量。然后用一个if else结构。如果输入范围的下限超过上限的话,那么就提示输入范围有误。如果输入范围正常,就执行一个for循环。for循环和其他结构差不多,都要包括一个圆括号和一段花括号,如果花括号没有,那么它的执行范围只能是一句。圆括号里面是三个条件。第一个条件是初始条件,比如定义变量或者把一个值赋值给一个变量,这里是定义变量。要说明一下这个是C++的语法:

		for(int f=lower;f<=upper;f++)

如果是C语言的语法,不允许在第一个条件里面定义变量。所以如果是C语言,是这样写的:

		int f;
		for(f=lower;f<=upper;f++)

第二个条件是判定循环变量的上限。如果f<=upper为真,就执行循环体(花括号内)的内容。如果结果为假,即f>upper,那么就立即退出循环,也就是直接跳转到花括号之后。第三个条件是每轮循环后的操作。f++的意思就是f += 1,也等于f = f + 1,这三者是等效的,比如说lower等于0,第一轮循环结束后,f就变成1,第二轮循环结束后,f就变成2,直到f超过upper。那么如果lower为0,upper为n-1,那么f就要加n次,也就是执行n轮循环。也就是循环体内的两句代码要执行n次。我们来看循环体内部:

			double c=5*(f-32)/9;
			printf("%d %.1f\n",f,c);

我们通过前面的例子知道,等号的右边是一个整数,而左边现在是一个小数。如果你用一个等号来连接,那么会将一个整数赋值给一个小数。编译器这里会自动做一个强制类型转换,也就是从int类型到double类型。由于int占了4个字节,而double占了8个字节,所以这是低精度转高精度,这样数值是不会有精度损失的。如果反过来,以高精度转低精度,就会有精度损失。除了这样赋值,还可以手动强制转换:

			double c=(double)5*(f-32)/9;
			printf("%d %.1f\n",f,c);

由于这里是一个分式,所以如果转为double的操作摆在分子或者分母,效果都是一样的。也就是,只要分子或分母其中一个被强制类型转换,那么整个分式也就会被强制类型转换。还有一种方法,是乘以一个强制类型转换后的常量,比如这里要转为小数,那就乘上一个小数,如下:

			double c=1.0*5*(f-32)/9;
			printf("%d %.1f\n",f,c);

这样整个分式也就会从整数变到小数。最后输出c即可,我们来验证一下:在这里插入图片描述
这就是运行结果了,我们可以看到100华氏度才对应37.8摄氏度。这里还要补充一点:减减操作“–”和加加操作的模式差不多,只不过方向相反。减减也有和加加类似的三个等效式子,很简单,不作赘述。

下一题:在这里插入图片描述
根据题目,我们需要定义两个整型变量,正整数n和结果sum。sum初始化为0,用于累加i。输入n,利用for循环,循环变量i的范围是从1到n。每轮循环sum都累加i,循环结束后输出sum即可。重点是迭代。代码如下:

#include<stdio.h>
int main(){
	int n,sum=0;
	printf("输入n:");
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		sum=sum+i;
	}
	printf("sum=%d\n",sum);
	return 0;
}

首先前5行应该没有问题,注意sum的初始值是0。然后每轮循环做一个迭代,类似这种在之前基础上进行操作的形式都叫做迭代,这里举个例子。刚开始sum等于0,第一轮循环时sum=0+1=1,所以第一轮循环结束后,sum的值是1。由于i++,所以第二轮循环开始的时候i等于2。所以第二轮循环sum=1+2=3。所以第二轮循环结束后sum等于3。i的从1到n,所以总共进行了n次循环,循环结束后sum=0+1+2+3一直加到n的结果。我们来验证一下:在这里插入图片描述
在这里插入图片描述
这就是本题的运行结果了。sum = sum+ i也可以简写为sum += i,两者的效果一样。

下一题:例5,输入一个正整数n,输出n的阶乘(1乘到n)。首先定义两个数,正整数n和乘积product,product初始化为1。利用for循环,循环变量i的范围是从1到n。每轮循环product都乘上i,最后输出product即可。重点还是迭代。我们来看一下代码:

#include<stdio.h>
int main(){
	int n,product=1;
	printf("输入n:");
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		product*=i;
	}
	printf("product=%d\n",product);
	return 0;
}

核心语句是循环体,在之前的基础上乘以i。比如刚开始product的值是1,第一轮循环它的值就从1变到了1。第2轮循环它的值就从1变到了1*2 = 2,那么第n轮循环它就是1乘到2,乘3一直乘到n,这就是n的阶乘。我们来验证一下:在这里插入图片描述
还要补充几点,既然有加等于,减等于和除等于当然还有乘等于,那么就有模等于。它们的模式都是一样的,只不过做的运算不同。这就是本题的讲解了。

下一题:例6,输入一个正整数n,生成一张2的乘方表,利用pow函数输出2的0次到2的n次的值。pow函数是库函数,所以我们首先需要声明头文件math,接着我们只需定义一个整数n。再利用for循环,循环变量i初值为0,每次加1直到n。每轮循环都利用pow函数计算2的i次,并输出它。代码:

#include<stdio.h>
#include<math.h>
int main(){
	int n;
	printf("输入n:");
	scanf("%d",&n);
	for(int i=0;i<=n;i++){
		printf("pow(2,%d)=%.1f\n",i,pow(2,i));
	}
	return 0;
}

核心代码显然是循环体。在上一讲,我教过大家一个进入函数的方法,按住ctrl键上面会出现一个小手,然后点击鼠标左键,我们就进入到这个函数的声明里了,如下:在这里插入图片描述
上面是math头文件:在这里插入图片描述
我们可以看到无论是输入参数还是返回类型,都是double。所以我们需要用百分号f。如果你传入一个整数,也会被强制转换为小数。pow(2,i)的意思是计算2的i次并返回,我们看一下结果:在这里插入图片描述

我们来看最后一个例子:在这里插入图片描述
和求1到n的和那题一样,都要定义变量sum来累加。区别是本题的sum是小数,且累加的每项不是i而是由2个变量决定的分式。第1个变量是控制正负号的,不妨设为整型变量sign。根据序列第一项,初始值为1。每轮循环变号,即sign等于负sign:sign = -sign。第2个变量是控制分母的,不妨设为整型变量j。根据序列第一项,初始值也为1。根据题目规律,j每次循环加2。由于sum是小数,所以分式也必须是小数。所以sum累加的式子就是,sum累加1.0*sum/j。循环结束后我们就得到了所需结果。代码:

#include<stdio.h>
int main(){
	int n;
	printf("输入n:");
	scanf("%d",&n);
	double sum=0;
	int sign=1,j=1;
	for(int i=1;i<=n;i++){
		sum+=sign*1.0/j;
		sign=-sign;
		j+=2;
	}
	printf("sum=%.2f",sum);
	return 0;
}

循环执行了n次,每次sum累加一个项,每次sign都做一个变号,然后j要累加2。sign如果刚开始是加,那么下一次就变为减,再循环一次就变为加。如果j刚开始是1,那么循环一次后变为3,再循环一次后变为5。我们来看一下结果:在这里插入图片描述
这就是案例的全部讲解了。

三、作业

最后是作业环节。作业是7个例子加上3个练习题,总共是10题。练习1:在这里插入图片描述
这一题一看题目就知道很简单。练习2:在这里插入图片描述
这道题和水费那道题差不多,需要注意的是如果超过50千瓦时,设用电量为x,则它的电费就是x-50再乘以0.58。练习3:在这里插入图片描述
这题也很简单,i的下限是m,上限是n,循环体内的部分照抄即可。好了,这就是今天的全部内容了。希望大家课后认真做作业,有不懂可以在群内讨论,我们下讲见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术卷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值