1. 计算机常识(基本概念)
- 计算机硬件:显示器、主板、CPU、内存条、显卡、声卡、网卡、机箱电源、光驱、硬盘、外部设备(鼠标、键盘)
- 计算机软件:(必须要安装操作系统计算机才能工作)浏览器、计算器、聊天软件、游戏等……
- 若想编写一个软件,需要数据结构、算法、图形学、数据库、操作系统、计算机网络等。
- 程序:分为系统程序和应用程序。Windows7、8是系统程序,浏览器、播放器等是应用程序。
- 软件是程序加文档的结合体。分为编程语言、系统软件、应用软件和介于两者之间的中间件。软件并不只是包括可以在计算机上运行的电脑程序,与电脑程序相关的文档也被认为是软件的一部分。
- 程序设计:需求分析-设计-编码-测试-维护,并生成文档。需求分析明确要做什么,要实现什么功能,达到什么目标;设计是怎么去做,寻找方法;编码用程序设计语言,生成.c/.cpp文件;测试是把源代码转化成可执行文件.exe,看运行结果是否正确、功能是否完善、效率是否满足要求;维护例如增加功能等,要一直进行直到软件不再使用。
- 计算机语言:机器语言(0101构成的二进制代码)、汇编语言(英文缩写的标识符)、高级语言(面向过程语言)。计算机不能直接执行高级语言程序(源程序),通常有解释方式、编译方式两种方法在计算机上执行程序(目标程序)。解释器不能生成可执行程序,编译器可生成可执行程序。C/C++采用的都是编译类型,因此会比Java效率高很多。
- C语言适合:编写操作系统和基础工具;对运行效率要求较高的系统:驱动程序;继承和维护已有的C代码;交流、笔试、面试是最常见的语言。
- C/C++编译环境:VisualC++、Visual Studio、Dev C++、Cfree
- Visual Studio的使用方法:
新建 - 项目 - Visual C++(其他语言:Visual C++) - 项目语言(空项目-浏览保存位置) - 名称/解决方案名称 - 完成 - 项目编辑界面 - 项目名称右键 - 添加新建项 - C++文件 - 输入添加的文件名称(若是C程序,修改后缀名为.c,默认是C++程序,后缀名为.cpp) - 添加-文件编辑界面 - 生成菜单 - 生成解决方案(F7) - 程序开始编译 - 成功之后开始进行链接 - 生成可执行文件.exe - 双击错误可以定位错误位置 - 若程序成功生成可执行文件则就可以运行程序 - 调试 - 开始执行(不调试Ctrl+F5)。
2. 用VS编写几个简单的C语言程序
- 程序1:输出hello world!
#include <stdio.h> // #include是预处理命令,通过外部的库函数实现相应的功能,库函数需要用<>或""括起来。<stdio.h>是标准输入输出库 #include<sdilib.h> // 系统函数system的头文件 int main() // 所有C语言程序都是从main函数开始执行,所有C语言程序都必须有,并且有且仅有一个main函数 { printf("hello world!\n"); system("pause"); // 若想结果不一闪而过,需要将结果框定住,用该语句,system是系统函数,这个函数在<stdlib.h>库中 return 0; // 函数体写完之后必须有返回值,return后面数值必须与函数名前面定义的类型一致。 例如这里定义main函数是int类型,因此return数值必须为整数,0通常表示程序正常结束退出 }
- 程序2:输入一个整数,并输出它的绝对值
/* 这是我编写的程序,报错:使用了未初始化的变量a */ # include <stdio.h> #include<stdlib.h> int main() { printf("请输入一个整数值"); int a; if (a > 0) a = a; else a = -a; system("pause"); return 0; }
/* 这是正确的程序 */ #include<stdio.h> #include<stdlib.h> int main() { printf("请输入一个整数值numb\n"); int numb; // 代表一个整数 int abs; // 代表运算结果 scanf_s("%d",&numb); // 用scanf_s用来获取键盘输入的数据,并且存放到numb里面。 if (numb>0) abs=numb; else abs=-numb; printf("numb的绝对值是:%d\n",abs); system("pause"); return 0; }
- 程序3:求一个长方体的体积
/* 这是我的程序,没有报错,但输出结果是“长方体体积为”,结果没有后面的数值,原因是最后的printf函数中少了%f */ #include<stdio.h> #include<stdlib.h> int main() { printf("请输入三个数值\n"); float a; float b; float c; float v; scanf_s("%f%f%f", &a,&b,&c); v = a*b*c; printf("长方体体积为%f\n",v); system("pause"); return 0; }
/* 这是优化后的程序 */ /* This program calculates the volume */ // 程序多在最前面说明该文件执行什么功能,便与后续查看使用 #include<stdio.h> #include<stdlib.h> float volume(float x, float y, float z); // 最好在前面声明一下原型,main函数调用的时候就不会有警告了。注意这里也要有分号,不然后报错! int main() { printf("请输入三个数值\n"); float a, b, c, v; // 多个变量一起定义,用逗号分开 scanf_s("%f%f%f", &a, &b, &c); v = volume(a, b, c); // volume是自己定义的求体积的函数 printf("v=%f\n", v); system("pause"); return 0; } float volume(float x, float y, float z) // 函数的形参中变量定义不能一起定义,必须单独定义,否则会报错 { float p; p = x*y*z; return (p); }
注:若前面不写出volume的定义,默认它是int型,这样会造成后面数据丢失,结果出现下面右边图的情况(数据丢失造成的),因此只需要在前面加上它的声明就可以。
- 补充:
(1) 双引号中的反斜杠\表示转义字符,例如\n表示换行;%开头表示格式字符,例如%d表示整数型;&是取地址运算符,&numb表示numb这个变量的地址。
(2) VS中生成解决文件可以生成.exe文件(可执行文件),生成可执行文件之后就可以运行了(调试菜单-开始运行)。
(3) 常见的编译错误:
(一) LNK,必须定义入口点——C语言程序入口点(main函数)没有定义,因此需要检查main函数有没有定义 / 拼写错误。
(二) system函数没有定义——忘记加头文件<stdlib.h>
(三) C语言中几乎所有语句都要加分号“;”,该加分号的地方忘记加会报错。
(4) 程序 = 数据结构 + 算法 + 程序设计方法 + 语言工具和环境
(5) 算法是将输入转化为输出的一系列步骤。
算法的特点:有输入(零个或多个),有输出(一个或多个,无输出的算法是无效算法),有穷性,确定性(不能有二义性),高效性(时空效率:执行时间短、占用内存少)。
算法的描述:自然语言、伪代码(介于自然语言和计算机语言之间的语言)、程序流程图、N-S流程图(即方框图,非常适合结构化程序设计)
N-S流程图就是去掉了流向线之后的程序流程图,如下图:
(6) 怎么学?(多读、多写、多修改)
多读源程序 - 模仿视频写出简单程序 - 学习寻找与解决编译错误的方法 - 学习寻找与解决运行错误的方法,学会调试工具的使用 - 模仿例子写程序,并对照答案改写 - 独立完成编程作业 – 完成几个具有一定功能的实用性的程序。
3. scanf和scanf_s的区别
- scanf(%d\n",&a)是标准C中的标准输入函数
- scanf_s("%d\n",&a)是VS提供的安全标准输入函数
- 它两个函数功能相同,只是后者多了在读取数据时检查边界的操作。前者不检查边界,因此可能会出现访问越界的问题,scanf_s不在VS中编译会报错,但VS中使用scanf只是warning。
- 通常函数后加_s都是指安全性更高的函数,但功能不变。
- 若a是数组,则不用加地址运算符,因为数组名表示数组的起始地址,它本身已经是个地址,因此不需要再寻址。
4. 峰值检测思想
- 先对信号波形进行采样(离散化-计算机程序可处理),然后对相邻采样点进行比较,若是(后一个值-前一个值)先为正,然后变为负,那么在符号转换的那个瞬间对应的值就是一个峰值。(Matlab用findpeaks函数还进行峰值检测,但只能检测峰值,不能检测谷值。程序保存在:D:\Program Files (x86)\MATLAB\R2016a\bin\Project\Peaks Detection)。
- findpeaks函数用法:
[pks,locs]=findpeaks(data,x) % pks是检测到的峰值,locs是峰值所在位置
(峰值检测电路、原理参考: 点击打开链接 点击打开链接 点击打开链接 点击打开链接)
- 师弟提供的一个想法:利用异或原理,例如101个数:有50对儿数值和一个与任意数值不同的数值,需要检测出那个不同的数值,方法是:将所有数值进行异或,因为50对儿数值异或结果为0,所以101个数值异或结果就是那个不同的数。因为峰值在一定的区间内唯一,因此可以通过这种方法来检测(对信号波形形式要求较高)。