二阶声波正演c语言程序_计算机基础知识对程序员来说有多重要?

科班和培训生同比于自学者的优势就在于这些计算机专业的核心课程(数据结构与算法这种不管科班培训都要学的不算):离散数学、编译原理、计算机组成原理、操作与系统——乃至图形学和数字图像处理。

如果觉得太抽象学不进去,要么是经验不够写的代码太少,要么就是教材或者老师不给力——后者可以用csapp代替。

b5a3bbb7b733df314c6d41bcb509d2bd.png

哪怕你考完就忘了,哪怕你毕业后写代码时还是要现场搜博客看怎么处理多线程问题,但至少,你对这些概念心里面是有印象的,遇到了问题,你心里有杆尺子——

1、如何从这个问题提炼关键字,上网搜索或询问;

2、这个问题对应哪个领域的知识,我应该直接去查“多线程 互斥锁”而不是查“为什么这个程序跑不对?为什么count不等于100?”

3、读代码、写代码时,起码知道,这里该用多线程组织生产者消费者关系,那堆数据应该用一个树来组织——这方面和设计模式很相似,为我们提供了在更高层面看问题的可能性。

83d7465ad372463d010dbe419a25fd54.png

4、分得清工具链中各个部分的区别,不至于说mfc、qt、vc、c语言、c++傻傻分不清楚,都在参与几十几百万的项目了,还在到处问人“qt里能不能用FILE*指针?”

举个比较实在的例子,非科班的人,遇到问题是这么问的:

codeblocks 下载的是mingw.setup的,但是还是提示没有编译器?​

www.zhihu.comVC++6.0用MFC编译有一个问题。?​

www.zhihu.com如何使用Dev C十十画抛物线?​

www.zhihu.com

这样的问题,有的让人根本无从回答,有的问题一字不改百度一下都能搜到答案,有的完全是不会提炼关键字的结果……

881a880fd08c079ca1f79810ae6a4f48.png

而如下面这些问题,就充分体现了提问者自己的思考,他们是有明确的方向和目的去思索、去询问、去查询的,哪怕没人回答,这个过程都能有所收获。

(1)C语言如何实现面向对象功能?

其实,我对科班优势的这些描述,也适用于理工类专业——培养符合科学哲学的思辨能力。在遇到问题后,能够知道如何抽象问题,如何提炼关键,如何分析问题,然后基于抽象/提炼/分析得到的各个角度,去解决问题

对于答复,小音是认同加佩服的和一些直接想甩baidu.apphb.com链接的问题,他都能从科学思辨的角度上,深入浅出地去分析,去解答,而且在让小白如各类题主能看懂的前提下,还能让我等围观群众有所收益。

理想的程序员

1、能跑

2、代码符号规范,使用工具确保符号规范

3、设计需要可扩展,确保设计能令某些情况下没用的部分不会做成额外的性能开销。

4、设计需要可测试,用单元测试保证基本没有BUG,使用帮助验证正确性的工具。

5、找出各种解决方案的时间复杂度和空间复杂度,过程可能需要查找文献及做组合灯工作。

6、考虑数据在内存中存储方式及访问特性,如对齐问题、时间和空间的连贯性,怎样减少存储量的系统及增加缓存一致性。

7、尽量跨平台,并且如需使用操作系统提供的功能(文件、网络、线程、进程等),选取最优解。

8、关注底层性能,是否适合用一些CPU指令(包括SIMD)、GPU或其他硬件解决。做性能剖析,看核心部分的汇编结果,再做实验改成优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有限差分法(Finite Difference Method, FDM)是一种常用的数值计算方法,它可以用来求解偏微分方程声波方程是一种偏微分方程,因此可以使用有限差分法来模拟声波传播。以下是一个基于声波方程有限差分正演模拟的C语言程序: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define NX 100 // 空间步长 #define NZ 200 #define DX 10.0 // 空间步长 #define DZ 10.0 #define DT 0.001 // 时间步长 #define TMAX 1.0 // 模拟时间 #define VP 1500.0 // 声速 #define PI 3.1415926 int main(int argc, char* argv[]) { float p[NX][NZ] = {0}; // 压力场 float v[NX][NZ] = {0}; // 速度场 float c1 = (VP * DT / DX) * (VP * DT / DX); // 速度场系数 float c2 = (VP * DT / DZ) * (VP * DT / DZ); float c3 = 2.0 * (1.0 - c1 - c2); int i, j, k; for (k = 0; k < TMAX / DT; k++) { // 边界条件 for (i = 0; i < NX; i++) { p[i][0] = 0; p[i][NZ - 1] = 0; v[i][0] = 0; v[i][NZ - 1] = 0; } for (j = 0; j < NZ; j++) { p[0][j] = 0; p[NX - 1][j] = 0; v[0][j] = 0; v[NX - 1][j] = 0; } // 有限差分正演 for (i = 1; i < NX - 1; i++) { for (j = 1; j < NZ - 1; j++) { p[i][j] = c1 * (v[i + 1][j] - 2.0 * v[i][j] + v[i - 1][j]) + c2 * (v[i][j + 1] - 2.0 * v[i][j] + v[i][j - 1]) + c3 * v[i][j] - p[i][j]; v[i][j] = c1 * (p[i + 1][j] - p[i - 1][j]) + c2 * (p[i][j + 1] - p[i][j - 1]) + c3 * v[i][j] - v[i][j]; } } // 输出当前时间 if (k % 100 == 0) { printf("t = %f\n", k * DT); } } return 0; } ``` 该程序使用了二维数组来存储压力场和速度场,通过一个嵌套的循环来进行有限差分正演。在每个时间步长内,先根据边界条件更新压力场和速度场,然后根据声波方程使用有限差分法计算下一个时间步长的压力场和速度场。程序会输出当前的时间,以便观察模拟进展情况。注意,该程序并未考虑吸收边界的影响,如果需要更加准确的模拟,需要加入吸收边界的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值