目录
一.程序基本框架与指令
让我们从最基本的一段代码“Hello World”来进入C语言的学习
1.基本框架
编写C语言程序的注意点
- 每条完整语句后面必须以分号结尾
- 所有符号必须是英文输入法输入
- C语言中必须有且只有一个main函数
首先我们要明白每一个程序都需要有的一个基本框架,它长这样
我知道你很急,但你先别急,我们先不需要了解这里的每个英文单词代表的是什么意思,但我们以后每次打程序时都会需要这样一段基本框架
2.基本指令
C语言中最基本的指令为输出
输出:printf(" ");
码如其名,printf即为print for,它会忠实的在执行框打出你在引号中输入的内容,让我们用Hello World做个示范
在我们点击编译执行后,黑色框内跳出了Hello World,这就是printf最基本的用法
二.变量定义
变量定义
在编程中我们常需要做出类似于a+b=c的计算,在此之前我们需要对将要使用的变量进行定义
就像这样
int a;
或int a,b,c;
<整数类型>+<变量名称>
int为整数类型,而a为变量名称,变量名称自己随意定义,a b c d 都行
我们在这里简单的介绍一下整数类型,整数类型主要是与变量的取值范围有关,而取值范围于该整数类型有多少字节有关,一个字节有八个bit
int 4个字节
char 1个字节
short 2个字节
在这里只做简单介绍,详细会在接下来的数据类型展开,我们现在定义只需要用int基本就不会出错
变量赋值
在给变量定义后我们需要给变量赋值,否则在之后对未赋值的变量进行运算时系统会自动给变量随机赋值,赋值可以直接
a=1;
也可以通过变量输入scanf赋值
变量输入scanf
让我们展示一下如何通过scanf赋值
在这里我解释一下代码的一些小格式规范,
在每次进行变量的定义,赋值,变量的输入,输出后都要有分号来代表本次操作的结束
printf(“ ”,a)引号里是它要print出的内容 %d是指引号后面变量的值
scanf(“%d ”,&a)里的%d也是代指,至于&符号就先当做固定格式就好
让我们设计一个小学三年级就学过的找零程序小小展示一下我们的学习成果
三.运算符
我们这里学个简单的小知识
在C语言中有不同于数学的运算符
主要分为
1.算术运算符
a+=b 即a=a+b
a-=b 即a=a-b
a/=b 即a=a/b
% 取余
/ 除
* 乘
a=b 将b的值赋给a
2.关系运算符
a==b a等于b
a!=b a不等于b
a>=b a大于等于b
a<=b a小于等于b
逻辑运算符我们先不讲,我怕你会晕
四.数据类型与占位符
数据类型分为整数型和非整数型
整数型为int short
字符型为char
非整数型为long float longlong
那么在这里我们要介绍一下浮点数,浮点数就是能把小数点后面表达出来的数,整数则不能,而非整数型就是用来定义需要得到小数点后精确数字的变量的,让我们来展示康康
这里我们注意到浮点数在输出是似乎是%f而非%d,在这里我们需要介绍一下占位符嘞
1.%d`:打印整数值
2. `%f`:打印浮点数值
3. `%c`:打印字符值
4. `%s`:打印字符串值
5. `%p`:打印指针的值
我们先不管其他的,%d和%f记得就好勒
五.语句了解
1.条件语句
1.1 if(else)
让我们康康这个语句的格式
蹬蹬!
这就是if(else)的使用格式
if后()里就是判断条件,条件成立则进入if的代码块,否则进入else的代码块
让我们用一个分段函数来展示if else 的应用
蹬蹬!if else 就先教到这里啦
1.2 switch case语句
在某些情况下,if else的执行效率会很差,比如下面这个代码
如果你运气好,输入1,那么结果在第一个if就可以得到结果,如果运气不好,就要一直等到对于的结果才能跳出循环,这要是遇上结果特别多的情况,代码的效率就会比较低
这时让我们请出switch case 语句
让我们仔细康康switch的格式,switch后的括号内事想要输入的变量,变量的结果为几便会被引导到case几执行对应的指令,然后break出循环.你看这样多方便!
2.循环语句
2.1 while循环
这里我们即将学到一个非常实用的循环语句,很多东西就是要用循环才能做哦!比如我们要求一个任意一个低于四位数的数的位数,可以用if else循环,就像这样
但是如果我们要一个输入任意一个不限位数的数的位数该怎么办呢?if else 岂不是没完没了了吗?
这时后我们不妨用一种新的语句while
这里我们简单介绍一下使用方法,while后的括号为进入循环所需要的条件,假使满足条件则进入{}里面代码块,假使不满足条件则跳过代码块,一旦进入循环,每次代码块执行结束后都会再次进入判断,因此称为循环语句,只要符合条件,代码块就会一直执行下去
2.2 for循环
我目前已知有两种循环,两种循环其实差不多,只不过有时其中一个更合适罢了,让我们康康fo循环的格式与用法
现在让我们介绍一下for循环的格式,for的()内共执行了三个操作,第一个是进入for开始的一个初始化,仅仅在第一次进入循环是执行,第二个是进入for循环的条件,第三个是每次循环结束会进行的一个指令
这就是for循环啦,不知道还有什么好说的
六.数组
如何写一个程序来计算用户输入的数的平均数,很简单,因为这不需要我们记下我们输入的每个数,我们只需要计入所有数的和与总数,像这样
但是如果要我们要计算用户输入的数的平均数并输出所有大于平均数的数呢?
这个时候我们必须要记录每一个曾经输入的数噢. 那么
有请我们的数组登场!
老习惯,让我们看看数组的结构 int定义了数组中所以记录的数的整数类型,而[100]代表了该数组有一百个数,number[ ]代表了数组的第几个数,让我们康康用数组怎么完成刚刚的任务
六.函数
什么是函数?其实我们之前就一直在使用函数,printf就是来自C语言标准函数库中的内容,当我们的一段代码比较长并且目的比较单一,比如判断一个素数,我们就可以将其做成函数
我们以素数统计求和的代码做示范
这是一段从蓝色标注我们可以发现判断素数那一段代码的目的非常纯粹,就是为给一个判断,我们尝试将他做成一个函数
我们在这里介绍一下函数的格式与用法,通常来说,函数会输出几个值,返回一个值,我们的起手式int isPrime后的括号的内容就是我们要输入的内容,你在这里按顺序定义了几个变量,在利用函数时你就要输入几个变量,而通常我们会在函数内定义一个ret,这时函数的输出结果,通常用来做判定,if(isPrime(i))中i为输入的数,isPrime(i)会在执行函数的代码块后返回一个值来代表True or Fault,通常来说0代表Fault,1代表True,在这个代码块中输出值用来判断输入值是否为素数
七.字符串
7.1 字符串的输入输出
我们在以上的学习中发现我们变量的输入输出始终都是数字,但如果我们要打字母,要打单词怎么办?这个时候就需要我们对字符串做输入输出了
方式一 字符串变量
通常我们用数组的方式储存字符串,就像这样
char word[10];
scanf("%s",word);
printf("%s",word);
定义字符串数组要用char ,因为char是字符类型
字符串数组的输入输出要用%s
注意,每个字符数组字符的末尾都会自动补充一个‘\0’以表示字符的结束,至于它的用处,我们到后面再讲,这个字符不计入字符串长度
方式二 字符串常量整体赋值
char word[]="hello";
printf("%s",word);
方式三 gets
char word[10];
gets(word);
方式五 getchar 单个字符输入
char s1[10];
for(i=0;i<10;i++){
s1[i]=getchar();
}
注意,getchar一次只能接受一个字符,因此想要用getchar完全输入一个字符串需要循环,输入是不要打空格和回车,空格和回车在ASCⅡ中也是字符
让我们用回文单词(顺反拼起来一样的单词)的判定小小练习一下知识
#include<stdio.h>
main()
{ char word[10];//定义数组;
int isPrime=1;//设置判定;
int k;
int cnt=0;
scanf("%s",word);
gets(word);
while(word[cnt]!='\0')//计算字符长度
{
cnt++;
}
cnt-=1;
for(k=0;k<cnt/2;k++)//循环判断回文
{if(word[k]==word[cnt])
{
//printf("cnt=%d\n",cnt); //这是调试程序
//printf("k=%d\n", k ); //这也是,不用在意
}else{
isPrime=0;
}
printf("%d\n",isPrime);
cnt--;
}
if(isPrime==1){
printf("YES");
}else{
printf("NO");
}
return 0;
}
就是这样啦!
7.2 字符串函数
字符串有可以使用的函数,不过使用前需要声明,像这样
include<string.h>
strlen:用来算字符串的长度,格式为strlen(数组),不包含‘\0’的长度哦
strcpy:将一个数组的字符串拷贝到另一个数组,格式为strcpy(a,b);,将b拷到a中
strcat:将s2接到s1后面;s1须足够长,再连接时,将s1中'\0'
去掉,将s2接到后面,保留s2的'\0',格式为:strcmp(s1,s2);
strcmp:用于两个字符串的比较大小;形式为:strcmp(s1,s2);
s1=s2;//返回值为0;
s1>s2;//返回值为正整数;
s1<s2;//返回值为负整数;
八.指针
定义
指针是一种特殊的变量,它储存着一个变量的地址,因此我们通常称这个指针指向这个变量,像这样
int a;
int*p=&a;
printf("%p",p);//输出a的地址
printf("%d",*p);//输出a的值
&是指地址,&a即为a的地址,那么int*p=&a就是将a的地址交给了*p
输出a的地址,也即输出指针时的占位符为%p
输出a的值时,输出*p即可
那么这有设么用呢?
应用
1.交换数值
我们想要设立一个函数来交换两个变量的值,可是变量的交换只在函数内有效,那我们咋么办呢?
那就通过地址将两个变量锁定来完成
#include<stdio.h>
void exchange(int*pa,int*pb)
{
in t;
pa*=t;
pa*=pb*;
pb*=t;
}
main()
{
int a,b;
a=6;
b=5;
exchange(&a,&b)
printf("%d %d",a,b);
return 0;
}
2.函数返回多个值
一般来说函数只能返回一个值来做判定,但是当我们想返回多个值时,就可以使用指针
例如,我们要做一个函数来得出数组里的最大值与最小值该怎么办?
#include<stdio.h>
void limit(int a[],int len,int*max,int*min);
main()
{ int a[]={1,2,3,4,5,6,7,8,9};
int max,min;
limit(a,sizeof(a)/sizeof(a[0]),&max,&min);
printf("%d %d",max,min);
return 0;
}
void limit(int a[],int len,int*max,int*min)//定义函数输入包括数组,数组长度,最大值地址,最小值地址
{ int k;
int i;
*max=*min=a[0];
for(k=0;k<len;k++){//简单的循环,求最大值最小值,这里体现出地址的优点:可以将改变带出函数
if(a[k]>*max){
*max=a[k];
}
if(a[k<*min]){
*min=a[k];
} }
}
指针常见错误
在定义指针后没有使指针指向任何数就对指针赋值
注意,指针一定要指向某个变量后才能进行赋值操作
指针与数组
其实,数组变量是特殊的指针
我们可以尝试一下,当我们直接用地址的占位符输出数组会怎么样?
int a[5];
printf("%p",a);
结果是我们会直接得到a的地址
但是我们输出的是a,不是&a啊
所以我们说数组是特殊的指针嘛!
让我们换一种证明方式,就用刚刚的代码,我们尝试输出数组a分别在main和limit函数里的sizeof
我们会发现它在两个函数里的sizeof不一样
并且我们现在在一个64位的系统里,limit里的sizeof等于8说明什么?
什么它正好是一个指针的大小,由此我们可以得出一个结论,函数参数表里的数组就是一个指针,它直接指向输入的数组,也即输入的数组为指针,且它指向它自己
九. 结构体
结构声明
结构体是一种构造数据类型
把不同类型的数据组合成一个整体
像这样
struct stu{
char character[]; //角色
int level; //等级
int character attribute; //角色属性
char useful tool; //圣遗物
float strength; //角色强度
};