电商专业学习嵌入式软件开发第二十七天

  • C第一天

今天是C语言的第一天,老师讲的都是一些基础知识,但是要想继续走下去,能够写出命令,这些内容都要掌握。这些内容我是可以写出来,但感觉并不是能写出这些内容就能够依靠他们写出后面的命令。

c语言:一门编程语言
用途:用来编写程序的,即按照我们的意图和想法编写一条条可执行的指令,这些指令在内存中运行得到一个我们想要的结果
程序:是由多条指令集合而成,他们能工作,并能实现一定的功能。
程序的特点:数据结构+算法
数据结构:多数据的描述,即数据以何种形式存在,是计算机操作的对象。
算法:对操作的描述。即对数据的操作步骤。
数据:一切信息都是数据,数据有可变(变量)和不变(常量)之分。

常量:特点
一个整型的表示方法:二进制,八进制,十进制,十六进制

变量:1.取名 2.怎么定义一个变量
基本的数据类型:int short long char float double

标准输入和标准输出:scanf和printf

#include //以.h为后缀的文件为头文件,c程序的一般函数的定义都在此头文件中
void main()//主函数,整个程序只有一个主函数,它是程序开始执行和结束的地方,void 是函数的返回值类型,void 说明函数没有返回值
{
    printf("hello world!\n");
    //程序要执行的指令,此处为向屏幕输出双引号中的内容。'\n':换行,指令以';'为结尾
}

编写一个c程序:vim 文件名.c 即打开一个.c为后缀的文件,该文件是用来书写c源程序,写完之后:wq保存退出。
编译:gcc 文件.c 若文件源程序有语法错误,在次步骤就会报错,修改完成后编译成功就会生成计算机可直接执行的二进制文件a.out
运行:./a.out

gcc的4个步骤:
1.预处理:gcc -E 1.c -o 1.i
包含头文件中的内容,做一些准备工作,是整个程序真正变得完整。
2.编译:gcc -S 1.i -o 1.s
编译生成汇编文件
3.汇编:gcc -c 1.s -o 1.o
生成二进制文件
4.链接:gcc 1.o -o 1
生成可执行的二进制文件

#include 
void main()
{    
    int a=-1;
    //原码:10000000000000000000000000000001
    //补码:11111111111111111111111111111111
    //       37777777777
    //       ffffffff
    //数据在内存中以补码的形式存储的,显示的时候显示的也是补码
    //原码:二进制码,最高位为符号位,正数为0,负数为1
    //正数的补码=原码
    //负数的补码=原码的符号位不变,其余位取反+1
    printf("%d %o %x\n",a,a,a);
}

常量:
特点:1.不能够被改变的量
2.可以不经说明直接使用的量
分类:
1.直接常量:
整型常量:10,20
实型常量:1.2
字符型常量:
普通字符常量(用单引号括起来的字符):'a','b'
转义字符常量:'\n'
字符串常量:"qwerty"
2.标识符常量:宏定义的名字
#define S 30
S即为30
整型常量的表达方式:

二进制:每位数上满2进1,0~1.
例:二转十:1101 => 1*2^3+1*2^2+1*2^0=13

八进制:以0开头,每位数上满8进1,0~7
例:023 转十进制 -> 2*8^1+3*8^0=19

十进制:每位数上满10进1,0~9,除了0之外,负数前面加负号
例:10,-1,0;

十六进制:以0x或0X开头,每位数上满16进1,0~9 a b c d e f/ A B C D E F
例:0x23f 转十进制 -> 2*16^2+3*16^1+f*16^0

二转八:11011110 =>0336
转十六 =>0xde

基本的数据类型:

    int:基本整型,用来定义整型变量,接受一个整数
//    short [int]:短整型,接受一个整数
//    long [int]:长整型,接受一个较大的整数

    float:单精度型,接受一个实数
//    double:双精度型,接受一个较大的实数

    char:字符型,接受一个字符常量

定义变量:在内存中根据变量的数据类型给它在内存中开辟空间,同一个变量只能定义一次,但是可以声明多次

只定义不赋值:
int a;
定义的同时赋值:初始化变量
int a=10;
用运算的结果给变量赋值
int b=1;
int c=3;
int a=b+c;
先定义后赋值:
int a;
a=10;

声明:int a;

变量名:
1.由字母,数字,下划线'_'三者自由组合而成。
2.数字不能打头。
3.在c语言中有保留字(int ,float),不能用来做变量的名字
4.在c语言中区分大小写,所以price和PRICE是2个不同的变量
int a,b,c=10,d;

字符常量需要用''括起来,字符变量一定要先定义才能用。

转义字符:以‘\’开头的字符常量,具有特殊的功能

\n  换行
\r  回车
\b  退格
\t  制表符tab
\'  输出'
\"  输出"
\\  输出\

printf():标准输出函数,指向显示屏输出数据

格式:printf("格式控制=格式声明+普通字符",输出表列);
例:printf("a=%d\n",a);
注:在双引号中,以%开头的较格式声明,它是控制输出表列中的数据以何种形式输出,双引号中的其他字符叫普通字符,是会原样输出的。
格式声明:
1.d格式符:输出带符号的十进制数
    %d:输出十进制数
    %nd:输出的数占n个字宽,从右边开始
    %ld:输出长整型数。
2.c格式符:输出字符型数据
    %c:输出一个字符
    %nc:输出的字符占n个字宽
3.f格式符:输出实型数据
    %f:整数部分全部输出,默认输出小数后六位,第七位四舍五入
    %.nf:整数部分全部输出,小数部分输出n位,第n-1位四舍五入。
    %lf:输出双精度型数据
4.s格式符:用来输出字符串
5.o格式符:用来输出八进制数
6.x格式符:用来输出十六进制数。

scanf():标准输入函数,从键盘上按指定的格式获取输入的数据。

格式:scanf("格式控制",输入表列);
格式控制:同printf,
输入表列:在每个变量前加&
例:
#include 
void main()
{
    int a;
    float b;
    scanf("%d%f",&a,&b); 
    printf("%d %.1f\n",a,b);
}
//当scanf中的格式控制符之间紧紧相邻,则在输入数据的时候,默认各数据之间以空白符间隔(tab,空格,enter).输入数据结束后按回车结束。

练习:从键盘上一次获取int a;float b,char c三个变量的数据,并输出他们的值。

#include 
void main()
{
    int a;
    float b;
    char c;
    scanf("%d %f %c",&a,&b,&c); 
    printf("%d %.1f %c\n",a,b,c);
}

在scanf的双引号中格式控制符之间通常以空格间隔,输入的时候输入空格间隔。通常,双引号中有什么普通字符,那么输入数据的时候就原样输入什么字符。

    例:scanf("a=%d,b=%d,c=%f",&a,&b,&c);
    输入:a=1,b=2,c=1.2<回车>
#include 
void main()c=2
{
    int a;
    char b;
    int c=scanf("%d",&a);//scanf有返回值,返回数据列表的变量个数。
    getchar();//吸收残留回车
    scanf("%c",&b);
    printf("a=%d b=%c\n",a,b);
}

ASCII:给每一个存储的字符找到的对应的数字
'a':97
‘0’:48
1.每一个大写字母比它的小写字母的码值小32
2.后面一个字母比前一个字母的码值大1
3.后一个数字的码值比前一个数字大1

练习:输入一个大写字母,输出它对应的小写字母。

#include 
void main()
{
 /*   char ch,A='B';
    ch=A+32;
    printf("%c\n",ch);
*/
    char ch;
    scanf("%c",&ch);
    printf("%c\n",ch+32);
}
//c语言中的注释:注释只是便于阅读,不参与编译,
  1.// :单行注释 
  2./*...*/:多行注释

int sizeof(变量名/类型名);计算变量或类型在内存中所占的字节的大小。

#include 
void main()
{
    int a;
    printf("%d\n",sizeof(a));
    printf("int:%d short:%d long:%d float:%d double:%d char:%d\n",sizeof(int),sizeof(short),sizeof(long),sizeof(float),sizeof(double),sizeof(char));
}

算术运算符:加(+),减(-),乘(*),除(/),求模/求余(%)
1.两个整数相除,结果一定是整数,小数部分直接抹掉。
例:printf("%d\n",5/2);
2.求模运算符2边的操作数必须是整数

不同类型的数据间的混合运算:
1.把float型的数据赋给int型数据,整数部分赋值,小数部分丢失
2.把int型数据付给float型数据,数据不丢失,多了6个0
3.字符可以和整数直接进行运算,他们可以看做相互等价的。
4.在printf中格式声明输出的变量列表中的变量类型得严格匹配,除了字符和整数之间可以互相等价之外。

强制类型转换运算符:()

例:
#include 
void main()
{
    float a=7.8;
    int b=3;
    printf("%d\n",(int)a%b);//%左右的操作数类型必须是int型,所以此需要强转
}

强制类型转换适用于自动类型转换不能够进行的时候使用,并没有改变变量的真实数据类型,只是产生了相应的中间变量。

练习:有4个水渠a,b,c,d往一个池子里注水,单开a,1天注满;单开b,2天注满;单开c,3天注满;单开d,4天注满;请问,a,b,c,d同时开,几天注满。

#include 
void main()
{
 // printf("%f\n",(float)1/(1.0/1+1.0/2+1.0/3+1.0/4));
    float a=1,b=2,c=3,d=4;//a=1.000000
    printf("%f\n",1/(1/a+1/b+1/c+1/d));
}

自增运算符:++使变量的值加1
前置加加:++i 用(i)之前加
后置加加:i++ 用(i)之后加

例:#include 
void main()
{
    int i=1;
//    printf("%d\n",++i);
//    printf("%d\n",i);
    printf("%d\n",i++);
    printf("%d\n",i);
}

自减运算符:--使变量的值减1
前置减减:--i 先自减再用
后置减减:i-- 先用再自减

a=i++;
a=++i;
a=i--;
a=--i;
#include 
void main()
{
    int i=1,a;
    /*a=i++;
      printf("%d\n",i++);
      printf("%d\n",i);
    */
    a=++i;
    printf("%d\n",a);
    printf("%d\n",i);
}

putchar(字符常量/字符变量);

例:
#include 
void main()
{
    putchar('a');
    char a='b';
    putchar(a);
    putchar('\n');
}

练习:向屏幕输出boy

#include 
void main()
{
/*    putchar('b');
    putchar('o');
    putchar('y');
    putchar('\n');*/
    putchar(98);
    putchar(111);
    putchar(121);
    putchar('\n');
}

getchar():从标准输入(键盘)获取一个字符,该函数有返回值,返回获取的那个字符,如果没有获取到,会一直等待,直到获取到,因此可以利用该特性进行暂停程序的运行,在在调试代码的时候可以单步运行

例:
#include 
void main()
{
    char ch=getchar();
    putchar(ch);
}

练习:从键盘输入boy,并输出boy.

#include 
void main()
{
/*
    char ch1=getchar();
    char ch2=getchar();
    char ch3=getchar();
    putchar(ch1);
    putchar(ch2);
    putchar(ch3);
    putchar('\n');
*/
    char ch=getchar();
    putchar(ch);
    ch=getchar();
    putchar(ch);
    ch=getchar();
    putchar(ch);
    putchar('\n');
}

1.程序是顺序执行,从第一行依次往下执行,同一行如果有多条指令,从左往右执行。
2.“左=右” :等号叫赋值运算符,即先执行右边的,再执行左边的,把右边的值付给左边的变量
3.从键盘上输入数据的过程:从键盘上输入数据,直到按了回车键才会把所有的数据放到键盘缓冲区中去,当程序运行的时候需要获取输入,如果键盘缓冲区中有数据,则会自动去键盘缓存区中依次取,如果缓冲区中没有了数据,才会需要你继续从键盘输入数据,直到你按了回车键才把数据的数据继续填充到键盘缓冲区,然后再从缓冲区中取数据。

你可能感兴趣的:(电商专业学习嵌入式软件开发第二十七天)