嵌入式C语言
Linux环境下的开发习惯(windows环境下模拟)
1.下载配置gcc、环境变量
准备框架代码
基础命令
exit (-1) 消除段错误,但是要加头文件 #include <stdlib.h>(运行程序后有延迟)
数据表现形式
变量
- 由字母、数字、下划线组成,而且只能以字母或者下划线开头,不能以数字开头
- 正确写法:int a;int data;
- 错误写法:int 1data;int #333;int a>b;
- 大、小写字母是两个不同的字符
- 驼峰命名法:secondsperyear;second_per_year;_myData;
数据类型
常量
输入输出
输出
格式声明
- 原样输出 :printf(“hello”);
- % 占位符/格式字符 :printf(“a = %d”,a)
- %d 十进制整数;%c 单个字符 输出一个字母;%s 多个字符;%x 以十六进制格式输出;
- %p 打印内存地址,十六进制 输出地址,取变量地址的运算符号 &
- %f 小数 (默认只能得到6位小数)
输入
scanf/扫描键盘
强调注意的问题
原样输入
scanf格式里面有什么字符,输入的时候也要输入
注意字符
其他
getchar(获取字符,也可以用于吸收scanf前多出来的回车) sgkbcl putchar(输出字符)
puts(输出字符串,和printf一样,只是多了一个换行符号) gets(输入字符串)
编程案例/作业
流程控制
选择结构和判断语句
if...else
if
逻辑运算符
if...else
switch...case
在switch语句中,case后面只能跟常量表达式,不能使用布尔表达式,即判断格式
switch语句的条件表达式只支持整型数据,不支持小数类型。因此,在switch语句中,不能直接使用小数作为条件
练习/作业
while循环控制语句
场景
do...while
for循环控制语句
break提前结束循环(整个循环)
contine提前提前结束本次循环(本次循环)
嵌套循环
作业
输入两个正整数m和n,求其最大公约数和最小公倍数(两种代码if和while)
#include <stdio.h>
int main()
{
int num,originalNum,remainder,result=0;
//以上四个数分别是:输入的数,原始数据储存,原始数据处理后的数,结果
puts("请输入一个数:");
scanf("%d",&num); //读取输入的数
originalNum = num;
while(originalNum != 0)
{
remainder = originalNum % 10; //取出原始数据的最后一位数
result += remainder*remainder*remainder; //对原始数据的最后一位数进行立方
originalNum /= 10; //取原始数据前两位数
}
if(result == num) //验证结果
{
printf("%d是水仙花数\n",num);
}
else
{
printf("%d不是水仙花数\n",num);
}
return 0;
}
数组
如何定义一个数组
相同数据类型
数组遍历
初始化方式
全部赋值
部分赋值
初始化为0
见怪不怪的写法
编程案例
1、数组初始化及逆序输出
对十个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出
2、斐波那契数列
斐波那契数列是指从第3项开始,每一项都等于前两项之和。即:第1项为0,第2项为1,第3项为1,第4项为2,第5项为3,以此类推
3、冒泡排序法
4、简单选择排序法
二维数组
什么时候用
场景
表示
怎样定义一个二维数组
规则
解释
二维数组的初始化
按行初始化
无明确的行和列
部分赋初值
可以不写行,必须写列
二维数组的遍历及编程案例
函数
为什么要用函数
避免代码冗长
模块化的设计思路
按功能划分,每个函数代表一个功能,而函数的名字要体现函数的功能含义,类似变量标识符 y=f(x)
函数说明
函数的调用和定义
定义无参函数
定义有参有返回值
定义空函数
形参和实参
说明
传递参数,传递的是值
局部变量(只参与当前函数的定义)
案例
调用过程
调用条件
嵌套
递归(不断调用自己)
编程案例
用递归法求n!
数组作为函数的参数
传递数组中的某个元素
数组名当做函数实际参数
#include <stdio.h>
void Input_score(int array[],int num)
{
int i;
for(i=0;i<num;i++)
{
printf("请输入第%d个同学的分数:\n",i+1);
scanf("%d",&array[i]);
}
puts("\n");
}
void Output_score(int array[],int num)
{
int i;
printf("总人数为%d个\n",num);
for(i=0;i<num;i++)
{
printf("%d ",array[i]);
}
putchar('\n');
}
float average(int array[],int num)
{
int i;
int sum = 0;
int average;
for(i=0;i<num;i++)
{
sum += array[i];
}
average = (float)sum/num;
return average;
}
int main()
{
int classone[5];
int classtwo[10];
float average_classone;
float average_classtwo;
int num1 = sizeof(classone)/sizeof(classone[0]);
int num2 = sizeof(classtwo)/sizeof(classtwo[0]);
Input_score(classone,num1);
Input_score(classtwo,num2);
Output_score(classone,num1);
Output_score(classtwo,num2);
average_classone = average(classone,num1);
average_classtwo = average(classtwo,num2);
printf("一班的平均成绩是:%.2f\n",average_classone);
printf("二班的平均成绩是:%.2f\n",average_classtwo);
return 0;
}
二维数组作为函数的参数
练习
#include <stdio.h>
void Input(int array[][4],int m,int n)
{
int i;
int j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("请输入第%d行第%d列的数\n",i+1,j+1);
scanf("%d",&array[i][j]);
}
putchar('\n');
}
}
void Output(int array[][4],int m,int n)
{
int i;
int j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",array[i][j]);
}
putchar('\n');
}
}
int getmax(int array[][4],int m,int n)
{
int i;
int j;
int max;
max = array[0][0];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(max < array[i][j])
{
max = array[i][j];
}
}
putchar('\n');
}
printf("二维数组中的最大值在%d行%d列\n",i,j);
return max;
}
int main()
{
int array[3][4];
int Max;
Input(array,3,4);
Output(array,3,4);
Max = getmax(array,3,4);
printf("二维数组中的最大值是%d\n",Max);
return 0;
}
全局变量
作业
#include <stdio.h>
int max;
int min;
void Input(int a[],int Num)
{
int i;
for(i=0;i<Num;i++)
{
printf("请输入第%d个数:\n",i+1);
scanf("%d",&a[i]);
}
putchar('\n');
}
void Output(int a[],int Num)
{
int i;
for(i=0;i<Num;i++)
{
printf("%d ",a[i]);
}
puts("\n");
}
int get_max(int a[],int Num)
{
int i;
int j;
int max;
max = a[0];
for(i=0;i<Num;i++)
{
if(max < a[i])
{
max = a[i];
j = i;
}
}
printf("最大值的下标为a[%d]\n\n",j+1);
return max;
}
int get_min(int a[],int Num)
{
int i;
int j;
int min;
min = a[0];
for(i=0;i<Num;i++)
{
if(min > a[i])
{
min = a[i];
j = i;
}
}
printf("最小值的下标为a[%d]\n\n",j+1);
return min;
}
int main()
{
int a[10];
int Max;
int Min;
int Num;
Num = sizeof(a)/sizeof(a[0]);
Input(a,Num);
Output(a,Num);
Max = get_max(a,Num);
Min = get_min(a,Num);
printf("最大值为:%d\n",Max);
printf("最小值为:%d\n",Min);
return 0;
}
#include <stdio.h>
int a;
int findMax(int arry[],int len)
{
int i;
int max=0;
printf("请输入10个数:\n");
for(i=0;i<len;i++)
{
scanf("%d",&arry[i]);
}
for(i=0;i<len;i++)
{
if(max<arry[i])
{
max=arry[i];
a=i;
}
printf("%d",a);
}
return max;
}
int main()
{
int max;
int len;
int arry[10];
len=sizeof(arry)/sizeof(arry[0]);
max=findMax(arry,len);
printf("最大数为:%d下标为:%d",max,a+1);
return 0;
}
#include <stdio.h>
int bubble_sort(int a[],int num)
{
int i;
int j;
int cup;
for(i=0;i<num;i++)
{
printf("请输入第%d个数:\n",i+1);
scanf("%d",&a[i]);
}
for(i=0;i<num-1;i++)
{
for(j=0;j<num-1-i;j++)
{
if(a[j] < a[j+1])
{
cup = a[j];
a[j] = a[j+1];
a[j+1] = cup;
}
}
}
for(i=0;i<num;i++)
{
printf("%d ",a[i]);
}
return a[i];
}
int main()
{
int a[5];
int num;
int bubble;
num = sizeof(a)/sizeof(a[0]);
bubble = bubble_sort(a,num);
return 0;
}
#include <stdio.h>
void initArry(int arry[],int len)
{
int i;
printf("请输入数:\n");
for(i=0;i<len;i++)
{
scanf("%d",&arry[i]);
}
}
void printArry(int arry[],int len)
{//选择排序
int i;
int j;
int temp;
for(i=0;i<len-1;i++)
{
for(j=i+1;j<len;j++)//这里选择排序和冒泡排序的区别
{
if(arry[i]<arry[j])
{
temp=arry[j];
arry[j]=arry[i];
arry[i]=temp;
}
}
}
puts("选择排序:");
for(i=0;i<len;i++)
{
printf("%d ",arry[i]);
}
}
int main()
{
int len;
int arry[10];
len=sizeof(arry)/sizeof(arry[0]);
initArry(arry,len);
printArry(arry,len);//选择排序输出
return 0;
}