今日学习任务:
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(字符数组名)