1. 开启终端
   ctrl+alt+t : 开启新终端
2. ls 命令
   查看当前目录下的内容

3. 进入或退出目录
   cd 目录
   cd work 
   cd ..  : 返回上一级目录
   cd ~   : 进入家目录, 也叫用户目录,
   也可以省略~ , 写成  cd <==> cd ~ 
   ~ : 家目录, 也叫用户目录
   / :  根目录, 也是linux的顶层目录
   cd / : 进入根目录
4. 终端的字体放大和缩小
   ctrl + shift + “+” : 放大字体
   ctrl + “-”    : 缩小字体

5. 清除屏幕显示的内容
   clear
   快捷键:ctrl + l

6. 创建一个文件夹
   mkdir : 创建一个目录
   mkdir cbase

7. 创建文件
   touch  file
   touch  hello.c
  
8. 删除一个文件或文件夹
   rm -rf 文件名或文件夹名
   rm -rf hello.c
;
9. 可以使用键盘的上下按键来回溯之前输入过的命令
  
10. 编辑一个文件 vim / vi

11. vi 的使用
视图模式进入输入模式    i : 表示的进入输入模式
输入模式进入视图模式    esc: 退出输入模式
视图模式进入命令模式    冒号(:): 表示进入命令模式, 也可以用空格代替冒号
    : wq 保存退出
    : q   不保存退出
    : q!   强制退出

12. 编译c程序
    gcc  hello.c   : 编译完成后,默认会生成a.out 可执行程序
  
13. 运行 生成的可执行程序
    ./a.out   运行当前目录下的可执行程序

14. 计算机中数据的表示
     十进制: 9
     二进制: 0b1001 , 9
     八进制: 011  , 9
     十六进制:0x9

ascii :
水平制表符: TAB
换行      : enter
空格   :32 , " "
$

/// : 斜杠
\\\\\\\ :反斜杠, c语言中续行符
[ : 左方括号或左中括号
^ : 异或运算符号
` : 反单引号
' " 单引号
| : 竖杠,或运算
~ : 波浪号 , 按位取反

15. c语言中的关键字
    c语言一共有32个关键字
    auto             break              case             char             const
    continue         default            do               double           else
    enum             extern             float            for              goto
    if               int                long             register         return
    short            signed             sizeof           static           struct
    switch           typedef            union            unsighed         void
    volatile         while

16. 标识符
标识符是由程序员按照命名规则自行定义的词法符号,用于定义宏名、变量名、函数名和自定义类型名等。
C语言的命名规则如下:
    1) 字母数字下划线
    2)开头不能是数字
    3)不能和系统关键字重名

int 1a ;
int _b ;
int conitune;
int a-b;
int a_b;
int axb;

int pout1 ;
int pount2;

17. 运算符
运算符是表示运算的词法符号,C语言有非常丰富的运算符,按功能可以分为:
 算术运算符、 (+ 、- 、* 、/、 % )
 逻辑运算符、 (& 、|、 !,^ )
 关系运算符、 (>, < ,==,!=,>=,<=)
 位运算符、   (<< , >>)
 赋值运算符、 (=)
 递增递减运算符、(++,--)
 地址运算符、(&)
 逗号运算符、(,)
 sizeof运算符

18 分隔符

空格符、(空格 )
制表符、(tab)
换行符号、(enter)
注释 
单行注释 //
多行注释: /*  注释内容 */
19. 标点符号
   C语言中的标点符号有逗号(,)、分号(;)、冒号(:)、花括号({})、圆括号(())。

20  在ubuntu中对于文件名,可以使用tab键来自动补齐

21. 调试
利用__FILE__,__LINE__,__FUNCTION__实现代码跟踪调试

day2

1. c语言基本数据类型
逻辑类型。只有两个量true(非0的数)和false(0),表示逻辑真值和逻辑假值。
整数类型。C支持四种整数类型:char, short, int和long,整数类型用于处理整数。
char : unsigned char  无符号的整型变量 0-255
       signed   char  有符号的char整型变量 -128 ~ 127
占用字节:1个字节      
short :
占用字节:2个字节
unsigned short 
  signed short

int :
占用字节:4个字节
unsigned int
  signed iunt
 
long :
占用字节:8个字节
unsigned long
  signed long

浮点类型。C支持两种浮点类型:float和double,浮点类型用于处理包含小数部分的数值。
float :
占用字节:4个字节
unsigned long
  signed long

2. 整型常量
常量是指在程序运行期间其数值不发生变化的数据。

3. 浮点常量
浮点常量又称为实数,一般含有小数部分。

即一般形式和指数形式
一般形式的实数基本形式如下:[+-]M.N
-1.4 , 4.6

指数常量
指数形式的实数一般是由尾数部分、字母e或E和指数部分组成。 
当一个实数的符号为正号时,可以省略不写,其表示的一般形式如下:
[+-]M.N<e|E>[+-]T
1.176e+10 表示 1.176×10^10
- 3.5789e-8 表示 -3.5789×10^-8
通常表示特别大或特别小的数

练习1:
一个水分子的质量约为3.0*10-23g(3.0e-23),1夸脱水大约有950g,
编写一个程序,要求计算10夸脱水中有多少个水分子,然后显示到屏幕上。

4. 标识常量 (宏)
#define    <标识常量名称>    <常量>
#define    PI      3.1415926
#define    N        100

5. 在终端中出现中文乱码的问题解决:
  在vim 的命令行中输入 set
   :set fileencoding=utf-8

6. 变量
在程序运行时,变量占据一定大小的存储空间,其大小由其数据类型来决定的,
作为某变量的内存空间的首地址,称为变量的地址。

变量说明(定义)的一般形式是:
    <存储类型>    <数据类型 >    <变量名> ;
    存储类型: auto register static extern
  
    <数据类型>基本数据类型 char short int long float double
    <变量名> : 满足标识符命名规则

auto : 表示这个变量是局部变量
C语言中,在函数体的某程序段内说明auto存储类型的变量时可以省略关键字auto
例如: auto int a ;
auto int  k ;     //说明一个auto整型的k变量
int  j ;          //省略了auto,说明一个auto整型的j变量
double x;        //省略了auto,说明一个auto双精度型的变量

register称为寄存器型,使用register关键词说明的变量主要目的是想将所说明的变量放入CPU的寄存器存储空间中,
这样可以加快程序的运行速度。如申请不到就使用一般内存,同auto ;
register int  count;  
说明一个存储类型为register的整数变量;

7. 变量的初始化和赋值
变量初始化的一般形式如下:
<存储类型>   <数据类型>   <变量> = <表达式>   ;

auto int cout = 100;
register long b = cout+10;

8. 强制类型转换
   1)显示强制类型转换
      显式的数据类型转换实现的一般形式为:
        (数据类型名称)< 表达式 >

例如:
      int a ;
      a = (int )1.2;// 不是四舍五入的计算方式, 是只保留整数,扔掉小数
   
      float b = (float)10;

2)隐式强制类型转换
      int a = 1.2;

9. 算术运算符之除法

整数相除:  /  %
    整数相除除不尽保留整数部分,
    1/5 = 0 , 余数1
    2/3 = 0, 余数2

实数相除
    1.0/5 = 0.1 ,没有余数
    2.0/3.0 = 0.667 , 没有余数

1%5 = 1
    5%2 = 1
    7%20 = 7
    20%7 = 6
 10. 算术运算符之++ --
     int a = 10 ;
     a++
     a = 11

a--
     a = 10
     ++a ;
    
   
11. 关系运算符 , 运算结果是真假值, 真为1, 假为0
    > :大于
    < : 小于
    >= : 大于等于
    <= : 小于等于
    == : 等于
    != : 不等于

12. C语言的逻辑运算符如下:
   
   ! : 逻辑反
   && : 逻辑与
   || : 逻辑或

例如:
  int a = 10;
  a = !a ;
  a = ? 0
  a = !a ;
  a = ? 1

逻辑与  断路特性: 第一个条件不成立,后面的条件都不执行了
int a = 5, b = 6,c=7;
if(a<10 && b++)  a++,b++ ,c++ ;
 a = 6
 b = 8
 c = 8

if(a>10 && b++)  a++,b++ ,c++ ;
 a = 5
 b = 6
 c = 7

从第一个条件开始判断, 第一个不满足,后面的条件不会再执行了
                       第一个满足, 接着判断第二个条件,

逻辑或的短路特性 : 第一个条件成立, 后序的条件都不执行了
int a = 5, b = 6,c=7;
if(a<10 || b++)  a++,b++ ,c++ ;
 a = 6
 b = 7
 c = 8

int a = 5, b = 6,c=7;
if(a>10 || b++)  a++,b++ ,c++ ;
 a = 6
 b = 8
 c = 8

13. 位运算符 
~ : 按位取反
& : 按位与
| :按位或
^ : 按位异或
<< : 左移
>> : 右移

位操作示例:
unsigned int x = 0xffffffff ;
x = (x & (~(0xff<<8))) | (0x66<<8) ; // 读 改 写
printf("x=%#x\n",x) ;

x =  0b 1111 1111 1111 1111 1111 1111 1111 1111
0xff 0b 0000 0000 0000 0000 0000 0000 1111 1111
0xff<<8
     0b 0000 0000 0000 0000 1111 1111 0000 0000
~0xff<<8
     0b 1111 1111 1111 1111 0000 0000 1111 1111

(x & (~(0xff<<8)))
     0b 1111 1111 1111 1111 0000 0000 1111 1111
0x66
     0b 0000 0000 0000 0000 0000 0000 0110 0110

0x66<<8
     0b 0000 0000 0000 0000 0110 0110 0000 0000

(x & (~(0xff<<8))) | (0x66<<8)
     0b 1111 1111 1111 1111 0110 0110 1111 1111

^:相同为0 , 不同为1 
例如: 判断两个数是否相等

移位运算:
<<  : 左移, 右补0 ,
0xff<<8 : 0xff00
1<<1 : 2
2<<4 : 2* 2^4 32

带符号位的左移, 符号位不变, 其余位参与运算

>>: 右移
无符号的右移: 左补0 , 右移出

带符号的右移: 左补符号位, 右移出
int a = -5 ;

14. 计算机如何表示一个负数 
int a = -5
-5 在计算中如何存放到内存中的
是存放这个数的补码
补码 = ~原码 + 1

0b 1000 0000 0000 0000 0000 0000 0000 0101
~  符号位不变
   1111 1111 1111 1111 1111 1111 1111 1010
+1
   1111 1111 1111 1111 1111 1111 1111 1011 补码 
   0xfffffffb(存放到计算机中,是以补码形式存在)

计算0xfffffffb数的原码
原码 = ~(补码-1)
     = (0xfffffffb -1)
     = ~(0xfffffffa)
     = ~0b1111 1111 1111 1111 1111 1111 1111 1010
     = 0b10000 0000 0000 0000 0000 0000 0000 0101
     = -5

int a = -5
a >>2;

0xfffffffb>>2
= 0b1111 1111 1111 1111 1111 1111 1111 1011 >>2
= 0b1111 1111 1111 1111 1111 1111 1111 1110 (补码)
-1
= 0b1111 1111 1111 1111 1111 1111 1111 1101
~
= 0b1000 0000 0000 0000 0000 0000 0000 0010  (-2)

int a = -1 ;
a = a>>4 ;
a = -1;
-1的补码:
   0b 1000 0000 0000 0000 0000 0000 0000 0001
~     符号位不变
=  0b 1111 1111 1111 1111 1111 1111 1111 1110
+1
=  0b 1111 1111 1111 1111 1111 1111 1111 1111
>>4
=  0b 1111 1111 1111 1111 1111 1111 1111 1111
原码
=  0b 1000 0000 0000 0000 0000 0000 0000 0001
= -1

练习1:
从1 加到100 ,累加到sum中,只加奇数,偶数排除
for(i=0;i<=100;i++)
{
 
}

15. 三目运算符

<表达式1>  ?  <表达式2>  :  <表达式3>
表达式1 为真,执行表达式2
        为假,执行表达式3

int a = 5,b = 7 , max
max = (a>b)?a:b;
max = 7 ;

16. 逗号“,”运算符

从左往右开始运算, 以最右边的结果作为表达式的最终结果

int x = 10,y = 15,z = 20
x = y++,z++,x+y ;
x = ?26
y = ? 16
z = ?21

int x = 10,y = 15,z = 20
x = y++,x+y, z++;
x = ?21
y = ? 16
z = ?21

17 . sizeof运算符

sizeof运算符运算的一般形式如下:
             sizeof(<类型或变量名>) 
         
    char   a = 10 ;
    short  b = 20 ;
    int    c = 30 ;
    long   d = 40 ;
    float  e = 1.5;
    double f = 1.6;

printf("sizeof(char )   = %lu\n",sizeof(char )) ;
    printf("sizeof(short)   = %lu\n",sizeof(short)) ;
    printf("sizeof(int  )   = %lu\n",sizeof(int  )) ;
    printf("sizeof(long )   = %lu\n",sizeof(long )) ;
    printf("sizeof(float)   = %lu\n",sizeof(float)) ;
    printf("sizeof(double)  = %lu\n",sizeof(double));

printf("sizeof(a )      = %lu\n",sizeof(a )) ;
    printf("sizeof(b )      = %lu\n",sizeof(b )) ;
    printf("sizeof(c )      = %lu\n",sizeof(c )) ;
    printf("sizeof(d )      = %lu\n",sizeof(d )) ;
    printf("sizeof(e )      = %lu\n",sizeof(e )) ;
    printf("sizeof(f )      = %lu\n",sizeof(f )) ;

day3
1. IO : input /output

2. 字符输出函数putchar

格式: putchar( c )
参数: c为字符常量、变量或表达式
功能:把字符c输出到显示器上
返值:正常,为显示的代码值;

3. 格式输出函数 printf

格式:printf(“格式控制串”,输出表)
功能:按指定格式向显示器输出数据
返值:正常,返回输出字节数;出错,返回EOF(-1)

输出表:要输出的数据(可以没有,也可以多个, 以“,”分隔)
printf("hello wrold"); 没有输出表
printf("a=%d\n",a); // 输出表有一个输出对象
printf("a=%d,b=%d\n",a,b); // 输出表有多个输出对象,以“,”分隔

格式控制串:包含两种信息
格式说明:     %[修饰符]格式字符  ,用于指定输出格式
普通字符:      原样输出

例如: n
    int a = 65 ;
    float  b = 5.8;
    printf("hello world!!\n"); // 无输出表
    printf("%d\n",a); // %d 十进制的整数
    printf("%i\n",a); // %i 十进制的整数
    printf("%u\n",a); // %u 不带符号的十进制整数
    printf("%o\n",a); // %o 八进制的整数
    printf("%c\n",a); // %c 输出单一字符
    printf("%f\n",b); // %f 输出一般形式的实数 
    printf("%e\n",b); // %e 输出指数形式的实数 
    printf("%E\n",b); // %E 输出指数形式的实数  , 大写的E 
    printf("%%\n"); // %% 输出百分号本身 
    printf("%p\n",&a); // %p 输出变量的地址 
    printf("%#o\n",a); // %o 八进制的整数
    printf("%#x\n",a); // %x 十六进制的整数
    printf("%ld\n",c); // %d 十进制的整数
    printf("%li\n",c); // %i 十进制的整数
    printf("%lu\n",c); // %u 不带符号的十进制整数
    printf("%lo\n",c); // %o 八进制的整数
    printf("%lx\n",c); // %x 十六进制的整数
    printf("%lX\n",c); // %X 十六进制的整数
    printf("%lf\n",d); // %f 输出一般形式的实数 
    printf("%le\n",d); // %e 输出指数形式的实数 
    printf("%lE\n",d); // %E 输出指数形式的实数  , 大写的E 
    printf("%+d\n",a-100); // %d 十进制的整数
    printf("%10d\n",a); // %d 十进制的整数 , 输出宽度是 10 , 不够左补空格
    printf("%010d\n",a); // %d 十进制的整数 , 输出宽度是 10 , 不够左补0
    printf("%.2f\n",b); // %f 输出一般形式的实数 , 小数点后面保留2位有效数 
    printf("%.1f\n",b); // %f 输出一般形式的实数 , 小数点后面保留1位有效数 
    printf("%.5s\n","goodbye"); // %s 输出字符串 
    printf("%15.5s\n","goodbye"); // %s 输出字符串 
    printf("%-15.5s\n","goodbye"); // %s 输出字符串

4. 格式输入函数 scanf
格式: scanf(“格式控制串”,地址表)
功能:按指定格式从键盘读入数据,存入地址表指定存储单元中,并按回车键结束
返值:正常,返回输入数据个数

地址表:变量的地址,常用取地址运算符&
格式字符:d,i,o,x,u,c,s,f,e

int a,ret ;
    float b;
    char ch;
    printf("please input one int number:");
    ret = scanf("%d",&a);
    printf("a=%d, ret = %d\n",a,ret);
    printf("please input second int number:");
    ret = scanf("%i",&a);
    printf("a=%d, ret = %d\n",a,ret);
    printf("please input one oct number:");
    ret = scanf("%o",&a);
    printf("a=%o, ret = %d\n",a,ret);
    printf("please input one hex number:");
    ret = scanf("%x",&a);
    printf("a=%x, ret = %d\n",a,ret);
    printf("please input one unsigned int number:");
    ret = scanf("%u",&a);
    printf("a=%u, ret = %d\n",a,ret);

printf("please input one float number:");
    ret = scanf("%f",&b);
    printf("b=%f, ret = %d\n",b,ret);
    printf("please input one e number:");
    ret = scanf("%e",&b);
    printf("b=%e, ret = %d\n",b,ret);

char str[100] ={0};
    printf("please input one char:");
    ret = scanf("%c",&ch);
    printf("ch=%c, ret = %d\n",ch,ret);

printf("please input one string:");
    ret = scanf("%s",str);
    printf("str=%s, ret = %d\n",str,ret);

scanf输入函数留下的“垃圾”:
int a,ret ;
float b;
char ch;
char str[100] ={0};
printf("please input one int:");
ret = scanf("%d",&a);
printf("a=%d, ret = %d\n",a,ret);

printf("please input one char:");
ret = scanf("%c",&ch);
printf("a=%c, ret = %d\n",ch,ret);
printf("a=%d, ret = %d\n",ch,ret);

现象:
please input one int:100
a=100, ret = 1
please input one char:a=
, ret = 1
a=10, ret = 1

在终端中输入:100回车
               a  ch
%d , 只是把0-9之间的数字当成有效输入,
%c , 把所有键盘的输入都作为有效输入

回收垃圾的方式:
1. getchar(), 回收一个垃圾字符 , 多于一个不行
2. 使用scanf(%*c) ,抑制一个字符的输入
以上两种方法都只能抑制一个字符, 多于一个都不可以
3.  ret = scanf("%*[^\n]");
    ret = scanf("%*c%c",&ch);

scanf("%*[^\n]");式(《C语言程序设计 现代方法 第二版》中提到)
   这里用到了scanf格式化符中的“*”,即赋值屏蔽;“%[^集合]”,匹配不在集合中的任意字符序列。
   这也带来个问题,缓冲区中的换行符’\n’会留下来,需要额外操作来单独丢弃换行符。

5. 程序设计中如果使用了数学库中的函数,
   第一: 要加头文件 <math.h>
   第二: 在编译时, 要连接第三方库, gcc  1.c -o 1  -lm

6. c语言中数学库中的常用函数 
   sqrt : 开平方 
   div  : 计算余数和商
   fabs :  计算绝对值
   floor 和ceil : floor 返回不大于这个数的最大整数
                   ceil  返回
       .3+不小于这个数的最小整数
   fmod : 返回实数相除的余数
   modf : 把一个实数拆开成一个整数和小数
   pow  : 计算次幂

day4

1. 分支语句 if 语句

if (表达式)
  语句块1                               
else
               语句块2

解释:
表达式为真, 执行语句块1
   为假, 执行语句块2

常用形式:
1)简化形式 , 省略else
 if(表达式) 语句块      例如:  if(x>y) printf(“%d”,x);
2)阶梯形式
  if(表达式1) 语句块1
     else if(表达式2) 语句块2
   else if(表达式3) 语句块3
    else if(表达式4) 语句块4
                  ...
                      else 语句块n

3) 嵌套形式

if()
  if()    语句块1
  else     语句块2
else 
  if()    语句块3
  else    语句块4

练习1: 从终端输入两个数, 判断两个数之间的关系
练习2: 从终端输入3个数, 找出这个三个数之间的关系, 例如: a>b>c或 a<c<b 
练习3: 从终端输入一个成绩, 把这个成绩分成(A(90-100)、B(80-89)、C(70-79)、D(60-69)、E(0-59))

2. switch语句
switch (表达式)
{  case 常量表达式1:语句块1;break;
   case 常量表达式2:语句块2; break;
    ….
   case 常量表达式n:语句块n; break;
   default :语句块n+1
  }
解释:表达式的结果必须是整型的变量或常量 

switch中的表达式可以是整型或字符型表达式
  (也可以是枚举类型,新标准的c语言允许为任意类型.)
每个常量表达式的值必须各不相同,否则将会出现矛盾。
当表达式的值与case后面的常量表达式值相等时就执行此case后面的语句。
“case 常量:”只起语句标号的作用

练习4: 从终端输入学生等级(ABCDE),转化成成绩范围
练习5:   一道题有4中答案(ABCD), 输入一种后,打印输入的选择答案的提示

3.for语句构成循环
for(expression1; expression2; expression3)
      (1)        (2)         (3)
{
       语句4;
       (4)
}

过程分析:先执行表达式(1),再执行表达式2 , 判断表达式2的值是否为真
          为假,退出循环,为真执行语句4 -> 再执行表达式3 -> 表达式2 ->
   判断表达式2 的值,为假,退出循环,为真执行语句4 以此类推,直到循环退出

for循环的特殊语句:for(;;)  , while(1), 都是死循环

练习1,: 求和1+2+3...+100的和
练习2:  求和1+3+5+7..99 的和
练习3:  三位数的水仙花数 (100-999)
         ge*ge*ge + shi*shi*shi + bai*bai*bai = 这个数

153 = 1*1*1 + 5*5*5 + 3*3*3
      = 1 + 125 + 27
             = 153

练习4:计算1000以内的素质 , 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数

int i,j;
    printf("%d\n",2);
    for(i=2;i<=1000;i++) // 1000 以内的质数的循环
    {
        for(j=2;j<i;j++) // 从2到这个数本身,依次相除,得到都不能整除的数
        {
            if(i%j  == 0 ) break;
            if(j>i/2)
            {
                printf("%d\n",i); // 想整除一个数, 必须要小于这个数的1/2
                break ;
            }
        }
        
    }

练习5
输出图案:for 循环嵌套 , 2层for循环
*****
*****
*****
*****
*****

练习5.1
*
**
***
****
*****
练习6:
*****
****
***
**
*

练习7:
*
**
***
****
*****
****
***
**
*
练习8:
*****
 ****
  ***
   **
    *
   **
  ***
 ****
*****

练习9:
     *
    ***
   *****
  *******
 *********
***********

练习10 :
***********
 *********
  *******
   *****
    ***
     *

4. while循环

while(表达式 )
{
 语句1
}
解释:表达式为真, 执行语句1 
      为假, 结束while语句

特殊语句:while(1) , 死循环

练习1: 计算1+2+3+4+...+100之和  , 使用while计算

day5

1. 一维数组定义:
所谓一维数组是指只有一个下标的数组。它在计算机的内存中是连续存储的。

一维数组的说明一般形式如下:

<存储类型>    <数据类型 >    <数组名>[<表达式>] ;
                               数组名  数组元素个数,下标从0开始

2. 一维数组的特性
 (1). 数组名就是数组的首地址
 (2). 数组的所占用内存字节数
      int a[6]  ;
      分析:这个数组有6个成员,每个成员是int类型的变量,一共占6*sizeof(a[0])
      可以直接使用sizeof(数组名)来计算数组所占用的内存字节数
 (3). 如何自动计算数组元素个数
      sizeof(数组名)/sizeof(数据类型) = 元素个数
      sizeof(a)/sizeof(int) =
3. 一维数组的使用

1)数组必须先定义,后使用
   2)只能逐个引用数组元素,不能一次引用整个数组
      例   int a[10];
           printf(“%d”,a);   , 错误用法,不能一次引用整个数组

for(i=0;i<10;i++)
      {
 printf("%d",a[i]);
      }
   3)数组元素表示形式:  数组名[下标]
     其中:下标可以是常量或整型表达式

4. 一维数组的初始化
   1)数组不初始化,其元素值为随机数
   2)对static数组元素不赋初值,系统会自动赋以0值
   3)只给部分数组元素赋初值 , 其余元素为0
   4)当全部数组元素赋初值时,可不指定数组长度

练习1: 从终端数2个数, 分别存放到a b 中, 之后把a 和b 的值进行交换 ,再输出
      
练习2:
定义一个数组, a[10] , 从终端输入10个分别存放到数组内,
再把这个数组逆序

练习3  使用冒泡排序法对键盘输入的字符(a-z,A-Z)进行排序,

5. 二维数组的定义

定义方式:

 数据类型 数组名[常量表达式][常量表达式];
                     行             列

6. 数组元素的存放顺序
内存是0-2^32 的地址范围内 , 是线性的
二维数组是平面, 把一个平面的数据存放到线性的存储器中,如何存放,把面拆成线性的
根据拆的方式不同,二维数组有不同的存放顺序,
分为: 行序优先
       列序优先

行序优先存放顺序
int a[3][2]
a[0][0]     a[0][1]
a[1][0]     a[1][1]
a[2][0]     a[2][1]

0 : a[0][0]
1 : a[0][1]
2 :  a[1][0]
3 :  a[1][1]
4 :  a[2][0]
5 :  a[2][1]

行序优先存放顺序
0 : a[0][0]
1 : a[1][0]
2 :  a[2][0]
3 :  a[0][1]
4 :  a[1][1]
5 :  a[2][1]

c语言使用行序优先的方案进行存放二维数组

7. 二维数组元素的引用

形式:  数组名[下标][下标]
a[1][1]

8. 二维数组元素的初始化
 分行初始化:
 按元素排列顺序初始化 
 
 1)全部初始化
 例   int a[2][3]={{1,2,3},{4,5,6} };
 a[0][0] = 1
 a[0][1] = 2
 a[0][2] = 3
 a[1][0] = 4
 a[1][1] = 5
 a[1][2] = 6
 2)部分初始化
 例   int a[2][3]={{1,2},{4,5} };
 a[0][0] = 1
 a[0][1] = 2
 a[0][2] = 0
 a[1][0] = 4
 a[1][1] = 5
 a[1][2] = 0
 3)一维长度省略初始化
  例   int a[][3]={{1,2},{4,5} };
 a[0][0] = 1
 a[0][1] = 2
 a[0][2] = 0
 a[1][0] = 4
 a[1][1] = 5
 a[1][2] = 0
 4)全部初始化
  例   int a[2][3]={1,2,3,4,5,6 };
 a[0][0] = 1
 a[0][1] = 2
 a[0][2] = 3
 a[1][0] = 4
 a[1][1] = 5
 a[1][2] = 6
 5)部分初始化
  例   int a[2][3]={1,2,4 };
 a[0][0] = 1
 a[0][1] = 2
 a[0][2] = 4
 a[1][0] = 0
 a[1][1] = 0
 a[1][2] = 0
 5)一维长度省略的部分初始化
  例   int a[][3]={1,2,3,4,5 };
 a[0][0] = 1
 a[0][1] = 2
 a[0][2] = 3
 a[1][0] = 4
 a[1][1] = 5
 a[1][2] = 0

day6
1. 字符数组和字符串
字符数组是元素的数据类型为字符类型的数组,它既具有普通数组的一般性质,又具有某些特殊性质。

2. 字符数组的定义:
例   char c[10], ch[3][4];
3. 字符数组的初始化

逐个字符赋值
 char a[5] = {'a','b','c','d','e'};
 用字符串常量
 char a[5] ={"abcde"};
 char a[5] ="abcde";
 char a[] ="abcde";

4. \0 与ascii 的字符0 区别

‘\0’ 就是ascii的0
  字符0 是ascii的 48

5. 二维数组的初始化
char fruit[][7]={“Apple”,”Orange”,”Grape”,”Pear”,”Peach”};

6. 字符串
c语言无字符串变量,用字符数组处理字符串
字符串结束标志:‘\0’

注意:
1.用“%s”输出时,遇‘\0’结束
2.数组中有多个‘\0’时,遇第一个结束

7. scanf中%s输入时,遇空格或回车结束

练习1 : 从键盘输入一个字符串, 然后把这个字符串逆序
        例如:goodbye -> eybdoog

8. strlen 计算字符串中有效字符个数(不包含'\0')

练习1:使用直接的代码实现strlen.c 和 mystrlen.c

9. strcat 实现两个字符串的拼接

练习2: 先实现strcat.c
        再实现mystrcat.c , 不适用库函数, 用自己的语言实现这个功能

10 .strcpy  实现字符串的copy功能

练习3: 先实现strcpy.c 
        再实现mystrcpy.c
11. strcmp  实现两个字符串的比较
    int strcmp(const char *s1, const char *s2);
    如果s1 > s2 , 返回正数
    如果s1 < s2 , 返回负数 
    如果s1 == s2 , 返回0

练习4: 先实现strcmp.c
        再实现mystrcmp.c

12. source: 源 , 变量缩写: src
    destination 目的地     : dest
    compare  : 比较

day6
1. 指针变量的定义
一般形式:  [存储类型]    数据类型   *指针名;

例如:
int *pa ;// 这个* 不是*运算, 只是用来修饰指针名,

int a = 10;
(int *)pa = &a; // 这个* 不是*运算, 只是修饰pa 是个指针变量
*pa = 20; // 这个* 是*运算, 这个* 不是定义时的*

2. 指针变量的初始化
指针在说明的同时, 也可以被赋予初值,称为指针的初始化。
一般形式是:
    <存储类型>  <数据类型>  *<指针变量名> = <地址量> ;

例如:
int a=10,*pa=&a;

例如:
int a = 10 ;
int *pa = &a;

3. 指针的运算  ++ --
   1)相同类型的指针和相同类型的变量之间可以运算,不同类型的指针之间运算没有意义

不同类型的指针变量++ -- 的值不同
 
    2)指针++ -- 运算偏移值:
   
        ++:   px =  px + sizeof(px) ;
 --:   px =  px - sizeof(px) ;

3);
    px+n表示的实际位置的地址量是:
            (px) + sizeof(px的类型) * n
    px-n表示的实际位置的地址量是:
            (px) - sizeof(px的类型) * n

4. 两指针相减运算
px-py 运算的结果是两指针指向的地址位置之间相隔数据的个数
(py - px)/sizeof(py)

int a[10] ,*pa=&a[0],*pb=&a[9]; // (pb -pa)/sizeof(int)
pb - pa = 9

5. 指针与数组

1)一维数组的数组名为一维数组的指针(起始地址)
     int a[10];
     数组的起始地址: a <==>&a[0]

2) 指针与一维数组可以互相转化
  int a[10],*p=a;
  
  a[i] <==> p[i] <==> *(p+i) <==> *(a+i)

练习:
1. 冒泡算法使用指针完成
2. 选择算法使用指针完成
3. 优化冒泡使用指针完成
4. mystrlen.c 使用指针完成
5. mystrcpy.c 使用指针完成
6. mystrcat.c 使用指针完成
7. mystrcmp.c 使用指针完成

注意点:
*p++ : P先运算,解释++ 和* 的运算优先级一样, 是从右往左开始运算, 先运算++,(++符号在后面的运算,先让所对应的变量
参与运算,运算后再增加), 再运算*
*(++p) :p先增加

练习1: strncpy 函数的使用
练习2: strncmp 函数的使用
练习3: strncat 函数的使用
练习4: strchr  函数的使用,在一个字符串中查找给定字符的第一个匹配之处
练习5: atoi   函数的使用, 把字符串转整数
练习6: strstr  函数的功能 检索子串在字符串中首次出现的位置
练习7: strrchr  函数的功能 检索子串在字符串中首次出现的位置

day7
1. 函数的定义
一般形式如下:
 <数据类型>  <函数名称>( <形式参数说明> )
 {
             语句序列;
             return[(<表达式>)];
 }

解释:
函数名称: 满足标识符的命名规则
数据类型:  是整个函数的返回值类型,如无返回值应该写为void型;
形式参数说明:是逗号”,”分隔的多个变量的说明形式,通常简称为形参;
返回值:函数运行结果后的返回值,使用return进行返回, return[(<表达式>)]语句中表达式的值

以上的说明,函数的三要素(函数名,形参,返回值)

2. 函数的说明
其中,<形式参数说明>可以缺省说明的变量名称,但类型不能缺省。
例如,
double  Power(double x, int n) ;
double  Power(double, int);

3. 函数的使用
   1):先定义-> 再声明 -> 之后函数的调用

2) 如果一个函数定义在main函数之前的,可以不声明(声明和定义合二为一)

4. 函数的参数传递
   1)赋值(复制)传递
   特点: 通过形参不能改变实参的值

2)地址传递
   特点: 通过形参可以改变实参的值
   3)全局变量传递

5. 关于实参和形参
   形参: 函数在定义时说说明的变量
   实参: 函数在调用时给函数传递的变量

练习1:要求从终端输入2个数,分别计算两个数的 加减乘除4个功能, 这4个功能,分别封装成4个函数去实现
int add(int x,int y)
int sub(int x,int y)
int mul(int x,int y)
int div(int x,int y)

练习2:把冒泡算法封装成一个函数,
int maopao(char *p,int n) // p 数组的首地址, n 数组中元素的个数

练习3:输入摄氏温度,输出华氏温度
int sheshi_to_huashi(double t)
{
 
}

6. 函数的传参-数组 
   复制传递方式 : 调用函数将实参数组传递给被调用函数形参,形参接收是实参的地址

形参可以改变实参的值
  例如:
  double TestArray(double b[], int Size)
   地址传递方式 :   形参可以改变实参的值

例如: double TestArray(double *pa, int Size);  //函数说明

7. 指针函数 :最终是函数, 指针是用来修饰函数
   返回值是指针类型的函数就是 指针函数

<数据类型>  * <函数名称>(<参数说明>)
{
      语句序列;
}
例如:
char *strcpy(char *dest, const char *src);

返回值是char * 类型的指针, 这个函数就是指针函数

8. 函数指针: 最终是指针, 函数是用来修饰指针的
  
      <数据类型> (*<函数指针名称>)(<参数说明列表>);

例如:
    int (*ptr)(int ,int);// ptr 是函数类型的变量,
    这个函数类型是形参是(int ,int ),返回值 int

C语言基础知识点(领卓教育)相关推荐

  1. 领卓教育科技有限公司毕业实习报告

    绥化学院本科生毕业实习报告   领卓教育科技有限公司毕业实习报告         学生姓名   *** 学    号   20135**** 专    业  自动化 指导教师   *** 绥  化   ...

  2. JavaScript 语言基础知识点图示

    JavaScript 语言基础知识点图示: 转载于:https://www.cnblogs.com/mrxia/p/4059252.html

  3. 程序设计语言基础-知识点

    程序设计语言基础-知识点 程序设计语言就是人类跟计算机沟通的语言 分类 1.高级低级之分 高级 c/c++,java 等 低级 机器语言 汇编等 2.工作方式之分 编译程序:编译成目标程序后再执行.c ...

  4. 领卓教育:QT图片转换器

    标题***领卓教育:QT图片转换器(ico<--------->png)*** 作者:妳看! ui界面: 用到的类: QFileDialog QDebug QByteArray QImag ...

  5. C语言基础知识点汇总(一)

    C语言基础知识点汇总(一) 1.读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数. 2.程序中基本的控制结构是三种: 顺序结构 .选择 ...

  6. C语言基础知识点汇总(1)

    C语言基础知识点汇总(1) 1.读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数. 2.程序中基本的控制结构是三种: 顺序结构 .选择 ...

  7. 使用Qt实现图片格式转换[领卓教育]

    [领卓教育]使用Qt实现图片格式转换 主要实现代码 int app::save_file(){ QString filename1 = QFileDialog::getSaveFileName(thi ...

  8. 【领卓教育】QT控制开发板

    @领卓教育 使用软件:QT5.6.1,keil5 使用硬件:STM32F103 实现目标:使用QT设计UI界面生成按键控制页面,用来控制开发板,能控制LED1.LED2和蜂鸣器,能显示开发板电池电压. ...

  9. python语言基础知识点总结_Python语言的12个基础知识点小结

    Python语言的12个基础知识点小结 python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(g ...

最新文章

  1. 获取应用程序文件夹路径的最佳方法
  2. .NET微服务最佳实践eShopOnContainers
  3. 当TIME_WAIT状态的TCP正常挥手,收到SYN后…
  4. linux查看hid设备,linux hid设备读写
  5. 每日算法系列【LeetCode 315】计算右侧小于当前元素的个数
  6. 电商指标之用户留存率
  7. 计算机工作组如何添加打印机,局域网添加打印机,详细教您局域网打印机怎么添加...
  8. Hugo 建站经验之谈
  9. 一切从零开始------软件篇
  10. Appium 关于 swipe 滑动时间控件选择时间问题,swipe 滑动没效果,用 TouchAction代替
  11. 制作美观GIS地图,掌握这些技巧就够了
  12. 做好PMC管理三大工作,轻松搞定生产计划与物料控制
  13. 比较两个字符串s1和s2的大小,如果s1s2,则输出一个正数;若s1=s2,则输出0;若s1小于s2,则输出一个负数。要求:不用strcpy函数;两个字符串用gets函数读入。
  14. 金山 V8 终端安全系统 默认弱口令漏洞
  15. 年产3000吨冲压型果味硬糖生产车间工艺设计
  16. Redis I/O 多路复用
  17. Pygame详解(十七):joystick 模块
  18. 新疆自治区谷歌地球高程DEM等高线下载
  19. 三分钟告诉你软件测试工程师到底是不是程序员?读完你就懂了!
  20. 2019中科院力学所研究生学术论坛随笔

热门文章

  1. IOS gif图片播放 swift
  2. 软技能—代码之外的生存指南
  3. HCIP-5.4OSPF路由聚合、缺省路由
  4. 如何管理计算机中文件,如何管理电脑文件
  5. 【线性代数】矩阵的基本概念和运算性质
  6. 大数据挖掘永恒的定律?符号回归(Symbolic Regressor)
  7. 数据维度太多,咋办?我们整理了17种表现形式
  8. C++ bitset的使用
  9. 传Apple开发TD版iPhone,使用Marvell方案
  10. MATLAB-三维柱状图