//习惯性的%一下董神
P1:数据类型与创建变量
当编写程序的时候,你可能会需要向程序中引入可能改变,甚至是需要在使用中导入的数据,这时我们就需要去创建一个变量,创建变量的基础格式如下
变量类型 变量名称1,变量名称2,变量名称3···;
//例:int a,b,c;
变量类型决定了这个变量能储存什么样的数据,常用变量详见下表(严格来说整数存负数能多存一个,为了节省空间,此处不写,例:short范围为-32768~+32767)
变量类型 | 储存内容 |
void | 无(你并不能创建void变量) |
int | 整数(±2147483647之间) |
short | 整数(±32767之间) |
long long | 整数(±9223372036854775807) |
bool | 0或1(0==False,1==True) |
char | 字符(单个) |
float | 浮点数(即小数,精度6~9位) |
double | 双精度浮点数(精度15~17位) |
long double | 扩展精度浮点数(精度33~36位) |
扩展内容(新人可跳)
这时候有人就要问了,博主博主,我想来点更厉害的,例如114514位整数或者一长串字符串什么的怎么搞呢?
让我们引进一下数组概念,当我们在变量名后边加上[n]时,这个变量就变成了一个由很多个一样的变量构成的数组,如下
int a[3];
//此时a里面有3个整数,分别是a[0],a[1],a[2]
/*
Q:为什么是从0开始呢
A:好问题,我也想知道
也正是因此,当我们需要1000个数时,我们得定义int a[1005];
一般是多开1就行,多5纯属个人习惯
*/
Q:那如果我想给数组里面的数添加一个初始值呢?A:
int a[114]={0,1,2,3,4,5,6,7,8,9};
//剩下你没提到的会自动放0
当然,数组也可以是数组,所就有了下面的
int a[6][6][6],b[5][5];
//a是一个三维数组,可以存6*6*6=216个数,b是一个二维数组,可以存25个数
//当访问单个变量时,形如a[1][2][3],b[0][2]
而字符构成的数组则如下
char a[123];
//初始化
char str[10]={'I',' ','a','m',' ',‘h’,'a','p','p','y'};
//或
char str[114]="I am happy";
P2:函数
函数是一个程序中不可或缺的部分,一个完整的函数通常由几部分组成:返回值类型,函数名称,函数的参数列表以及函数的定义
当我们声明一个函数时,我们需要返回值类型、函数的名称,以及参数,以下是一个函数定义
int function_name(int a,char b);
//此举生成了一个名为function_name的函数,它接收一个整数a和一个字符b,并在经历了一定的运算(由你自己编写)后给出了一个整数作为结果
仅仅有声明是不够的,我们还需要一个函数的定义
int gcd(int a,int b){
while(b^=a^=b^=a%=b);
return a;
}//一个求a,b最大公约数的函数,不要在意内容
/*
{}里的内容就是函数的定义
return代表着结束函数并令函数得到return后边的值作为结果
当返回值类型为void时,return后边直接接分号,作用为立刻结束函数
*/
事实上,我们会发现,貌似main()也是一个函数
没错,main被称为主函数,我们可以把运行程序简单了的理解为调用了一次main函数,执行了一遍里面的代码,然后走到return 0结束了主函数,返回了0(当然后边的代码也就基本不可能被用到了,所以自定函数要放主函数前面)
换句话来说,当函数不被调用的时候,它的作用就仅限于当摆设,也就是说我们要在main函数里面调用我们自己写的函数,他才能生效
调用函数的一般方式是在函数名后面加一个括号,里面把你加的参数填进去
gcd(114,514);
//直接调用当然是可以的,但返回值不为void的函数也可以用在式子里,当做一个对应类型的数
int a=gcd(114,514);
printf("%d",gcd(4,6)+8);
函数的顺序
当我们运行程序时,我们可以简单的把运行顺序视为从上至下(一般情况下)(你的函数没运行是因为那只是个声明和定义,没调用),当一个函数被调用时,我们可以理解为我们移动到了那个函数的‘{’并一直运行到‘}’再返回原来位置,这是老师的示例代码,猜猜看它的输出是什么
#include <stdio.h>
void goo(int a){
printf("goo is being called!\n");
printf("%d\n", a);
}
void koo(int a){
printf("koo is being called!\n");
goo(a);
}
void foo(){
int a = 0;
koo(2);
printf("koo has been called!\n");
}
void main(){
foo();
}
koo is being called!
goo is being called!
2
koo has been called!
不知道和你想的是否一样
在样例中,主函数首先调用了foo,来到foo处,执行了a=0的赋值语句和koo(2),打出koo后调用goo(a),打出goo后输出a,最后goo,koo结束,打出foo后结束程序
这里同样引进了另一个概念:局部变量和全局变量
扩展内容
☝代码块是指的由‘{’和‘}’括起来的区域,每一对大括号都是一个代码块
☝显然,变量在同一个代码块内不能定义两次
全局变量和局部变量的声明皆遵循变量声明的格式,区别他们的唯一方法是看他们的位置,全局变量不在任何一个代码块内,在定义后持续生效至代码结束,而局部变量仅仅在当前代码块生效,在此之外还有常量,常量通过在定义变量前加上const实现,和变量的唯一区别就是无法修改,当你试图修改常量时会直接报错,防止老年痴呆患者(譬如编者)一不小心修改,下图为一个示例
int a=1;
//int a=2;加了就是重复定义了a,会报错
//此时a=2
int main(){
const int a=3;
//a=4; a现在是常量,不能修改
//此时a=3
if(1){//只是用来凑代码块的不重要
//此时a=3
a=5;
//此时a=5
a=6;
此时a=6;
}
}
可见变量的定义和游戏王的各种康一样,遵循后发先至的原则,当一个变量被调用时,总是最后一个定义的被使用
P3:作业
作业本身并不困难,但就编者看到的来说,大多数人都进入了一个误区
☝你不应该手动求导(强调)
这道题目的意义在于让学生理解函数的作用与函数间的嵌套关系,而非测试学生的数学能力(尽管我们是数学系)
好好想想我们是否能编写一个函数来进行对一个特定函数的求导并以此解决问题
正解代码不会放出来,不过编者乐意解答疑惑
最后说一下,计算机为我们服务,而非我们为计算机服务