c语言零基础快速入门教程:请收藏C语言最全入门笔记
c语言零基础快速入门教程:请收藏C语言最全入门笔记我们将数据放到数组中之后又如何获取数组中的元素呢?数据类型 数组名称[长度];数组只声明也不行啊,看一下数组是如何初始化的。说到初始化,C语言中的数组初始化是有三种形式的,分别是:北京市出租车打车计费规则如下:#include<stdio.h> floattaxifee(intclock intmiles){ floatmoney; if(miles<=3) { money=14; printf("费用为14\n"); } else { if(clock>=23||clock<5) { money=13 1 2.3*(miles-3)*1.2; printf("夜间车费为:%f\n" money); } else { money=13 1 2.3*(miles-3); printf("日间车费为:%f\n" m
内部函数与外部函数
- 在C语言中不能被其他源文件调用的函数称为内部函数 ,内部函数由static关键字来定义,因此又被称谓静态函数,形式为:
static [数据类型] 函数名([参数]) - 这里的static是对函数的作用范围的一个限定,限定该函数只能在其所处的源文件中使用,因此在不同文件中出现相同的函数名称的内部函数是没有问题的。
- 在C语言中能被其他源文件调用的函数称为外部函数 ,外部函数由extern关键字来定义,形式为:
extern [数据类型] 函数名([参数]) - C语言规定,在没有指定函数的作用范围时,系统会默认认为是外部函数,因此当需要定义外部函数时extern也可以省略。
静态变量只赋值一次
外部函数练习
hello.c
#include<stdio.h>
#include"test.c"//引用test.c文件
externvoidprintLine()//这里定义的方法对吗?{
printf("**************\n");
}
intmain(){
say();
return0;
}
test.c
#include<stdio.h>
voidprintLine();
staticvoidsay(){
printLine();
printf("Iloveimooc\n");
printf("goodgoodstudy!\n");
printf("daydayup!\n");
printLine();
}
对于hello.c来说,直接引入了test.c文件。那么就可以调用testc中的static方法say()
而对于test.c并没有引入,可以通过声明来调用另一个源文件中暴露出来的方法。
综合练习
北京市出租车打车计费规则如下:
- 每公里单价计费2.3元
- 起步价13元(包含3公里)
- 晚上23点(含)至次日凌晨5点(不含)打车,每公里单价计费加收20%。
- 每次乘车加收1元钱的燃油附加税。
小明每天上下班都要打车,公司和家的距离为12公里,上午上班时间为9点,下午下班时间为6点。
请编写一个小程序计算小明每天打车的总费用。
#include<stdio.h>
floattaxifee(intclock intmiles){
floatmoney;
if(miles<=3)
{
money=14;
printf("费用为14\n");
}
else
{
if(clock>=23||clock<5)
{
money=13 1 2.3*(miles-3)*1.2;
printf("夜间车费为:%f\n" money);
}
else
{
money=13 1 2.3*(miles-3);
printf("日间车费为:%f\n" money);
}
}
returnmoney;
}
intmain(){
printf("打的总费用:%.1f\n" taxifee(9 12) taxifee(18 12));
return0;
}
数组初体验
程序中也需要容器,只不过该容器有点特殊,它在程序中是一块连续的,大小固定并且里面的数据类型一致的内存空间,它还有个好听的名字叫数组。可以将数组理解为大小固定,所放物品为同类的一个购物袋,在该购
物袋中的物品是按一定顺序放置的。
我们来看一下如何声明一个数组:
数据类型 数组名称[长度];
数组只声明也不行啊,看一下数组是如何初始化的。说到初始化,C语言中的数组初始化是有三种形式的,分别是:
- 数据类型 数组名称[长度n] = {元素1 元素2…元素n};
- 数据类型 数组名称[] = {元素1 元素2…元素n};
- 数据类型 数组名称[长度n]; 数组名称[0] = 元素1; 数组名称[1] = 元素2; 数组名称[n-1] = 元素n;
我们将数据放到数组中之后又如何获取数组中的元素呢?
获取数组元素时:数组名称[元素所对应下标];
如:初始化一个数组 int arr[3] = {1 2 3}; 那么arr[0]就是元素1。
注意:
- 数组的下标均以0开始;
- 数组在初始化的时候,数组内元素的个数不能大于声明的数组长度;
- mtianyan: 如果采用第一种初始化方式,元素个数小于数组的长度时,多余的数组元素初始化为0;
- 在声明数组后没有进行初始化的时候,静态(static)和外部(extern)类型的数组元素初始化元素为0,自动(auto)类型的数组的元素初始化值不确定。
数组的遍历
数组就可以采用循环的方式将每个元素遍历出来,而不用人为的每次获取指定某个位置上的元素,例如我们用for循环遍历一个数组:
注意以下几点:
- 最好避免出现数组越界访问,循环变量最好不要超出数组的长度.
- C语言的数组长度一经声明,长度就是固定,无法改变,并且C语言并不提供计算数组长度的方法。
由于C语言是没有检查数组长度改变或者数组越界的这个机制,可能会在编辑器中编译并通过,但是结果就不能肯定了,因此还是不要越界或者改变数组的长度
c语言获取数组长度
intlength=sizeof(arr)/sizeof(arr[0]);
数组作为函数参数
数组可以由整个数组当作函数的参数,也可以由数组中的某个元素当作函数的参数:
- 整个数组当作函数参数,即把数组名称传入函数中,例如:
- 数组中的元素当作函数参数,即把数组中的参数传入函数中,例如:
数组作为函数参数时注意以下事项:
- 数组名作为函数实参传递时,函数定义处作为接收参数的数组类型形参既可以指定长度也可以不指定长度。
- 数组元素作为函数实参传递时,数组元素类型必须与形参数据类型一致。
mtianyan: 数组的应用(一)[冒泡排序]
以升序排序为例冒泡排序的思想:相邻元素两两比较,将较大的数字放在后面,直到将所有数字全部排序。就像小学排队时按大小个排一样,将一个同学拉出来和后面的比比,如果高就放后面,一直把队伍排好。
#include<stdio.h>
intmain(){
doublearr[]={1.78 1.77 1.82 1.79 1.85 1.75 1.86 1.77 1.81 1.80};
inti j;
printf("\n************排队前*************\n");
for(i=0;i<10;i )
{
if(i!=9)
printf("%1.2f " arr[i]);//%1.2f表示小数点前一位,小数点后精确到两位
else
printf("%1.2f" arr[i]);//%1.2f表示小数点前一位,小数点后精确到两位
}
for(i=8;i>=0;i--)
{
for(j=0;j<=i;j )
{
if(arr[j]>arr[j 1])//当前面的数比后面的数大时
{
doubletemp;//定义临时变量temp
temp=arr[j];//将前面的数赋值给temp
arr[j]=arr[j 1];//前后之数颠倒位置
arr[j 1]=temp;//将较大的数放在后面
}
}
}
printf("\n************排队后*************\n");
for(i=0;i<10;i )
{
if(i!=9)
printf("%1.2f " arr[i]);//%1.2f表示小数点前一位,小数点后精确到两位
else
printf("%1.2f" arr[i]);//%1.2f表示小数点前一位,小数点后精确到两位
}
return0;
}
数组的应用(二)[数组查找功能]
当我们购物之后,拎着购物袋回到家,会一一检查购物袋中的物品看是否缺少或者都是想购之物。
那么应用到程序中,可以使用数组查找功能,看看是否存在该数据,如果存在并返回该元素的下标。
#include<stdio.h>
intgetIndex(intarr[5] intvalue)
{
inti;
intindex;
for(i=0;i<5;i )
{
/*请完善数组查询功能*/
if(arr[i]==value)
{
index=i;
break;
}
index=-1;
}
returnindex;
}
intmain()
{
intarr[5]={3 12 9 8 6};
intvalue=8;
intindex=getIndex(arr value);//这里应该传什么参数呢?
if(index!=-1)
{
printf("%d在数组中存在,下标为:%d\n" value index);
}
else
{
printf("%d在数组中不存在。\n" value);
}
return0;
}
字符串与数组
C语言中,是没有办法直接定义字符串数据类型的,但是我们可以使用数组来定义我们所要的字符串。一般有以下两种格式:
- char 字符串名称[长度] = "字符串值";
- char 字符串名称[长度] = {'字符1' '字符2' ... '字符n' '\0'};
注意:
- []中的长度是可以省略不写的;
- 采用第2种方式的时候最后一个元素必须是'\0','\0'表示字符串的结束标志;
- 采用第2种方式的时候在数组中不能写中文。
在输出字符串的时候要使用:printf(“%s” 字符数组名字);或者puts(字符数组名字);。
mtianyan:字符串函数
常用的字符串函数如下(strlen strcmp strcpy strcat atoi):
使用字符串函数注意以下事项:
- strlen()获取字符串的长度,在字符串长度中是不包括‘\0’而且汉字和字母的长度是不一样的。比如: