一、视频
视频链接见 :http://pan.baidu.com/s/1i320yEh
本视频初衷在于帮助初学者更好地学习C语言。
二、报错
视频中的一些错误修正见下面链接,欢迎大家修正报错,发邮件[email protected],或者直接评论,希望大家共同进步。
http://note.youdao.com/share/?id=2e09ff62a3c83bcd4a79d369146bbff0&type=note
三、学习辅助
结合下面大纲和作业配合视频多写多练。
Day1:
计算机基础概述
linux 安装
目录结构:树形
路径:绝对路径 相对路径
特殊目录:根目录 主目录 上一层目录 当前目录
命令 : ls cd pwd vim gedit man
作业:安装其他linux发行版本 比如 centos redhat
Day2:
命令:sudo su
c语言:
(0)gcc 编译 四个阶段
(1)变量基本定义,变量、内存、数据之间关系
(2)操作符 表达式
注意表达式的值 这个概念
+ - * / ++ --
&& || !
< > <= >= == !=
?: ,,,逗号表达式
Day3:
1、流程图基本画法
2、 if 语句 switch语句
for while do..while
课后作业 :
基础题: 4、5、7.(1) 8 9 10 11 12 流程图要求画出来。
1(必做)、在终端输出自己的名字和年龄。
2(必做)、打印出各种变量类型所占字节数。
3(必做)、输入半径求出圆形面积并打印 。
4(必做)、输入3个数 从小到大输出。
5(必做)、输入学生成绩(0-100分) 输出等级(a:90- 100, b :80-89 c:70-79 :d 60-69 e:<60 )
用 if 和switch 语句
6(必做)、输入数字,输出星期几(输入:6,输入:星期六) 用if和switch语句
7、(必做)(1)用 for while do while语句实现 1+2+3….+100
(必做)(2)求n的阶乘
8、(必做) 把100-200之间不能被3整除的数输出
9、 输入两个数求最大公约数。
10 、编程题:在屏幕上输出如下图形 键盘输入n
*
* *
* * *
11、分解质因数 12 = 2*2*3
12(必做)、1!+2!+3!+4!+++n!
扩展题:求 123456789123456789123456+12345678901234567890
课后思考:float double 在内存中存储形式
预习 Day4命令及相关知识
Day4:
数组
(1)一维数组定义 、初始化、使用
(2)一维数组在内存中的形式
(3)数组与字符串
(4)二维数组定义、初始化、使用
(5)二维数组在内存中的形式。
strcpy strlen gets puts
Day5:
1 、函数
(1)函数基本定义及使用
(2) 形参实参 的传递
(3) 函数传递数组
(4)函数嵌套调用
2、自学gdb 调试 :
见群共享 《gdb 十分钟教程》
3、预处理指令
#if #else #endif
#define
#include
#ifdef
#ifndef
思考题:
(1) gets 函数为什么有危险
(2) int func(int a[10])
{
sizeof(a) --->等于多少,为什么?
}
作业:必做
1、计算数组的长度
2、用数组来处理Fibonicci数 列的前10项
output 1,1,2,3,5,8......
3、输入一串字符、剔除除了小写字母以外的其他字符,并输出。
4、有 一维数组 int a[6] = {1,2,3,4,5,6};
二维数组 b[2][3];
把数组a中的数据拷贝到数组b中,并且在逻辑上b里面的数据行列为
1 2 3
4 5 6
5、输入2*3 矩阵,并打印,行列互换后再打印。
6、验证 二维数组 在内存中的存储方式。
7、写函数实现 int sum(int n); 1+2+3。。。。N
8、用函数实现 min 到 max之间不能被m整除的数的个数 int num(int min ,int max,int m);
9、写函数实现 int fac(int n); 1*2*3*....n
用函数实现 1!+2!+3!+4!….n!;
int sum_of_factorial(int n);
10、实现 加减乘除 函数.
参考接口 double add(double a,double b);
double sub(double a,double b);
double mul(double a,double b);
double div(double a,double b);
实现计算器 函数接口 通过 0、1、2、3来选择计算功能
int calc(int select,int a,int b);
11、用函数实现 2、8、16进制打印
void decimal_to_hex(int data);
void decimal_to_oct(int data);
void decimal_to_binary(int data);
实现总函数接口 通过2、8、1 2 选择来输出各种进制
void decimal_convert(int select,int data);
12、输出数组的全部元素。
void array_print(int a[],int len );
13 、编写程序,交换数组a和数组b中的前n个元素。
void swap_array(int a[],int b[],int n);
14、 A、编程实现:有10个人(编号1到10)围成一圈123123...报数,报到3的人出去,然后下一个人继续从一开始报数,求最后剩下的人的编号。
B、用函数实现 n 个人报数,报到m的人除去,求最后剩下的人的编号
int left_num(int a[ ],int n,int m )
15、 函数的功能是:将s数组中的n个数倒序,请自己定义函数的参数形式及命名
16、用函数实现 数组从小到大排序
void sort(int a[ ],int len);
17、有数组 a[10] b[10] c[20]
a、b中的数据都是从小到大排列,把a b 中的数据合并放到 c中依然从小大
Void func(int a[],int b[],int c[],int len);
其中 a b 数组的长度为 len ,c 为 2*len
Day6-7
1、指针基本定义及使用 * &
2、指针加减法
3、指针与一维数组关系
4、指针变量 所占字节
5、Malloc free 基本用法
6、typedef #define用法及区别
7、变量作用域及生存周期
8、栈、堆、静态存储区、文字常量区 比较
9、指针作为函数形参
10、函数传数组本质
11、指针与字符串、char数组综合分析
12、const 及 const 于指针结合
作业:
1、有int *p1,char *p2 ,double *p3,int **p ,打印出各个 sizeof(p)
2、int a[10] 用指针为数组a赋值,并打印出每个值 ( 用多种方法)
提示 :a[i] ---*(a+i)
3、交换两个数 void swap(int *a,int *b);
4、输出数组的全部元素。
void array_print(int *a,int len);
5、int my_strlen(const char *p),求字符串长度
6、实现 my_strcpy 函数 ;
7、my_strcpy 安全吗,如何改进?
8、编写函数,对传递进来的两个整型量计算它们的和与积之后,通过参数返回。
函数声明为 void compute(int m, int n, int *sum, int *p);
9、用函数实现创建动态数组
提示(数组的本质是什么?)
void *create_array(int size,int len);
Size为数组每个元素所占内存的大小,len为数组长度。
10、使用memcpy,memset函数,实现 my_memcpy,my_memset函数
Day8-9
1、指针数组,数组的每个元素是指针 int* a[10];
2、指针的指针 int **p;
3、函数的指针 int (*p)(int)
4、一维数组的地址 及 指针变量
5 二维数组与指针
6 大小端
7 main 函数参数
作业:
1、定义指针数组 int * a[10],每个指针指向一块10个Int大小的内存,赋值0-99,并打印。
2、定义指针数组 char *a[10],每个指针指向一块10个char 大小的内存,用scanf 为每块内存输入字符串(不超过10个字符),并打印所输入.
3、输出一个int 变量 每个字节所存的数据。
4、int a,b;
int *p1 = &a;
Int *p2 = &b;
通过函数 调用使 p1 = &b, p2 = &a;
5、函数指针基本用法
有 以下函数
int add(int a,int b);
strcpy ;
memcpy
分别用指针变量去调用这些函数。
6、用指向数组的指针 Int (*p)[10] ,去访问int a[10]的每个元素.
7、用指针实现int a[2][3] 所有元素输出(多种方法)
用以下指针 int *p1, int (*p2)[3];
8、编写代码,并生成可执行文件 cal ,有两种运行模式
A-------界面模式
./cal 运行的时候
打印以下界面并根据选择计算结果
(1)
please select function
1 add
2 sub
3 div
4 mul
5 quit
(2)输入1
please input num:
(3)输入 1 2
(4)输出 3 并返回到 (1)界面
B---------直接命令模式
./cal -add 1 2
输出和,以下同理:
./cal -sub 1 2
./cal -div 1 2
./cal -mul 1 2
如果命令输入错误会有相应提示
比如 ./cal -kk ,没有kk这个选项
./cal -sub 1,缺少参数
9、编写以下函数,把字符串中的小写字母都转化为大写字母,运行错误返回NULL,
运行成功,返回新字符串的地址。
char* trans(const char *p);
并写 测试函数测试功能,如果测试成功, 返回0,测试失败返回-1
int test_trans();
10、请编写一个函数,计算某一个字符串中有多少个单词,假设单词与单词之间用空格分隔,且单词为英文字母。
int num_of_word(char *p);
(1)画出流程图
(2)完成代码
(3)编写测试函数 int test_num_of_word();成功返回0,失败返回-1,尽可能全面得测试各种情况。
11、查手册使用 strstr函数,并实现其功能 my_strstr.
12、查手册使用strtok函数,并实现其功能 my_strtok
13、查手册使用 strdup函数,并实现其功能 my_strdup
Day10
结构体
1、结构体基本定义、使用及初始化
2、结构体与指针
3、结构体包含结构体成员
4、结构体数组
5、结构体与函数
6、浅拷贝 深拷贝
7、字节对齐
8、位段
作业 :
1、定义图书结构体,输入信息并打印,用多种方法. Book
a、书名(小于10个字符)
b、页数、
c、作者(小于10个字符)
d、价格
2、a\定义图书结构体数组,存入10本书信息,并打印
多种方法
b\ 定义结构体指针数组,通过该数组操作 a
3、动态定义图书结构体数组,存入10本书,打印,打印完后销毁。
4、定义图书馆结构体
(1)Library
a、现存图书数量
b、最大容量(固定)
c、所存图书信息
(2) Book
a、书名 (书名字符不定)
b、页数、
c、价格
定义如下函数
(1)增加一本书的信息
Int add_book(Library *p,char *name,int page, int price)
(2)打印图书馆中所有所存图书的信息。
void print_lib(Library *p);
5、定义图书馆结构体,最大图书容量不定。并写
图书馆创建函数
Library *create_lib(int max_num); max_num是最大容量
图书馆销毁函数
int destroy_lib(Library *p);
增加一本书的信息
Int add_book(Library *p,char *name,int page, int price)
打印图书馆中所有所存图书的信息。
void print_lib(Library *p);
拷贝p1图书馆中的信息到p2图书馆中
Int copy_lib(Library *p2,Library *p1);
测试 copy_lib函数,按照如下方法:
(1) lib1 并增加基本书
(2)把lib1中的信息拷贝到lib2中
(3)销毁lib1
(4)打印lib2中的信息
Day11
新增视频
结构体11 -20
作业:
1、写代码验证字节对齐
2、写代码验证位段的概念
3、把Day10的作业代码用多文件标准写法组织起来:有如下文件
book.c book.h library.c library.h main.c
book.c 实现书的基本信息的设计
library.c 实现图书馆的基本设计(用到book.c的功能)
main.c 测试功能