学习日志2018/7/18

今日学习任务:

1.c语言数据类型

2.数组

3.字符串

4.函数

今日任务完成情况:

今天所讲的大多是大一C语言学习过的重要知识点,在冯老师的带领下温习了一遍,晚自习又自己复习了一边,虽然不是太熟,但主旨思想都还理解。

今日开发中出现的问题汇总:

对新的编程环境不是很熟悉,还有新的语法点掌握不够牢固。

今日开发收获:

温故而知新,在原来学习指针时,对其中的大部分概念还拿捏不准,今天老师形象的演示让我有了新的认识。

自我评价:

大致满意,就是遇到新问题解决问题的能力不是很强。

作业:
1.不借助第三个变量,实现两个变量的交换。

 13 #include <stdio.h>
 14 int main(int argc,char *argv[])
 15 {
 16     int a,b;
 17     scanf("%d%d",&a,&b);
 18     a+=b;
 19     b=a-b;
 20     a=a-b;
 21     printf("a=%d,b=%d\n",a,b);
 22     return 0;
 23 }
[root@localhost ~]# ./test
2 4
a=4,b=2

2编程实现整型一维数组排序(冒泡排序、改进冒泡排序)

#include <stdio.h>
 30 int main()
 31 {
 32 int a[5]={2,8,5,9,0};
 33 int i,temp,len=5;
 34 for(i=0;i<len;i++)
 35 {
 36     if(a[i]>a[i+1])
 37     {
 38         temp=a[i+1];
 39         a[i+1]=a[i];
 40         a[i]=temp;
 42      }
 44  }
 46 for(i=0;i<len;i++)
 47 printf("%d",a[i]);
 50 return 0;
 51 }

5.递归方法求1的阶乘到N的阶乘之和。

#include <stdio.h>
int fun(int n)
{
    if(n==1)
    {
        return 1;
    }
    else
    {
        return n*fun(n-1);
    }
}
int main()
{
    int sum=0;
    int h=fun(10);
    sum=sum+h;
    return sum;
}

今日笔记

gcc
用法:gcc 选项 参数
默认可执行程序名字是a.out
选项: -o 文件名  指定可执行程序名字
       -Wall 显示所有警告错误
       -I 文件路径;   指定包含的头文件路径
       -L 文件路径;   指定使用的库文件路径
       -l库文件名;    指定引用的库   
       -g 选项为生成调试信息,若要使用GDB进行程序调试,编译时必须带-g选项。

举例:
gcc -o test.i -E test.c
gcc -o test.s -S test.i
gcc -o test.o -c test.s
gcc -o main test.o
以上四部可以直接写成一步:gcc -Wall -o main test.c

假如一个程序由main.c fun1.c fun2.c
gcc -c main.c    生成main.o 目标文件
gcc -c fun1.c    生成fun1.o 目标文件
gcc -c fun2.c    生成fun2.o 目标文件
gcc -o main main.o fun1.o fun2.o
一步生成
gcc -Wall -o main  -g  main.c fun1.c fun2.c

系统默认头文件路径/usr/include/
系统默认库文件路径/usr/lib


       libm.so 动态库
       libm.a  静态库
  举例:     gcc -o hello  hello.c -Wall -static -lm   

make工程管理器
makefile文件的编写/作用 

GDB调试程序


C语言数据类型 
基本数据类型:整型、浮点型、字符型、枚举、指针
空类型:void
复合数据类型:数组、结构体、联合体

假定是32位系统
整形:int
short \ long  \long long \signed  \unsigned

默认都是signed 

signed int           32
unsigned int         32

signed short int     16
unsigned short int   16

signed long int      32
unsigned long int    32

验证:sizeof 运算符

浮点数:
float             32
double            64

字符型
char 

枚举
enum

指针
数据类型 *


void 类型待定

为什么要用补码?
CPU只支持加法和移位运算,补码可以解决减法运算问题
补码解决减法运算问题原理:
不需要判断操作数的绝对值大小,直接进行补码加法 
(3-5)补码 = 3 补码+(-5)补码
 (5-3)补码 = 5补码 + (-3)补码
补码定义(字长8位为例,最高位是符号位,0表示正,1表示负):
正数:原码=补码
举例:127(十进制) 转换为二进制111 1111  补码就是0111 1111
        1(十进制) 转换为二进制000 0001  补码就是0000 0001
负数:原码!=补码 -128当特例记住
举例:-1(十进制) 求该数的绝对值的二进制的值 转换为二进制000 0001 原码就是1000 0001
   -127(十进制) 求该数的绝对值的二进制的值 转换为二进制111 1111 原码就是1111 1111
   -128(十进制) 求该数的绝对值的二进制的值 转换为二进制1000 0000 原码就是1000 0000  
怎样求补码?把原码符号位除外取反加一
举例:-1 原码是1000 0001 符号位除外取反加一后 1111 1111
     -127 原码是1111 1111 符号位除外取反加一后 1000 0001
     -128 原码是1000 0000 符号位除外取反加一后 1000 0000
补码运算后怎样得到真值:符号位除外取反加一
A补码+B补码=C补码
举例:假如C补码=1000 0000 首先,符号位为1,是负数,真值等于符号位除外取反加一,1000 0000 十进制就是128,所以C补码的真值就是-128

所有有符号整形数据类:正最大值再加一就变成了负的最小值 举例:signed char a=127;
所有无符号整形数据类:正最大值再加一就变成了零 举例:unsigned char b=255;


大端模式/小端模式

小端模式:低位在低字节,高位在高字节
小端模式:高位在低字节,低位在高字节

举例:short int a = 127 
         低地址      高地址

小端模式 0111 1111 0000 0000

小端模式 0000 0000 0111 1111 


数组详解
一维数组的定义
格式:类型说明符 数组名[常量表达式];例: int a[10]
功能:定义一个一维数组,常量表达式的值,就是数组元素的个数。
注意:常量表达式中可以包括常量(100)和符号常量(#define MAX 100),不能包含变量,即数组元素个数不可变
错误用法:
const int MAX=100;
int a[MAX];

数组不能直接访问,访问的是数组元素,数组元素的引用形式为:  数组名 [下标]
注意:第一个元素下标是0

...
int a[N]   a[0]......a[N-1]
for(i=0;i<N;i++) a[i]=i;
使用数组时一定注意下标越界问题,编译程序不会检查数组访问越界问题。
数组必须先定义,后使用。C 语言规定只能逐个引用数组元素,不能一次引用整个数组。

一维数组的初始化
int  a[10]={10,11,12,13,14,15,16,17,18,19}; 
int  a[10]={0,0,0,0,0,0,0,0,0,0};   或int a[10]={0};
int  a[10]={1};部分初始化,没赋值的全部置0
int  a[ ]={11,12,13,14,15};
int  a[10] ={11,12,13,14,15}; 部分初始化,没赋值的全部置0;

二维数组的定义
格式:     类型说明符 数组名[常量表达式1][常量表达式2]
二维数组的引用
二维数组也必须先定义,后引用。   二维数组元素的引用形式为:数组名[行下标] [列下标]
二维数组的初始化
int a[3][4]={{1,2,3,4},{5,6, 7,8},{9,10,11,12}};
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[ ][4]={{0,0,1},{0},{0,6}};
int a[3][4]={{1},{5},{9}}; 部分初始化,没赋值的全部置0;

字符数组
字符数组的定义、初始化及引用同前面介绍的一维数组、二维数组类似,只是类型说明符为char,对字符数组初始化或赋值时,数据使用字符常量或相应的ASCII码值。
【注意】以字符串常量的形式对字符数组初始化时,系统会自动地在该字符串的最后加入字符串结束标志‘\0’,因此数组长度是实际字符数加1

char a[6]={'h','e','l','l','o','\0'};
char a[6]="hello";

字符串连接函数strcat  strcat (字符数组名1,字符数组名2)
字符串拷贝函数strcpy 格式:  strcpy (字符数组名1,字符数组名2)
字符串比较函数strcmp  strcmp(字符数组名1,字符数组名2)
测字符串长度函数strlen  strlen(字符数组名)

猜你喜欢

转载自blog.csdn.net/warning_violin/article/details/81103271