【20180620】【C/C++基础知识】计算机一些常识,用VS编写几个简单的C语言程序,scanf和scanf_s的区别,峰值检测思想

    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个数值异或结果就是那个不同的数。因为峰值在一定的区间内唯一,因此可以通过这种方法来检测(对信号波形形式要求较高)。
    (峰值检测电路、原理参考: 点击打开链接  点击打开链接  点击打开链接  点击打开链接

猜你喜欢

转载自blog.csdn.net/weixin_40583722/article/details/80751467
今日推荐