计算方法程序_第1页
计算方法程序_第2页
计算方法程序_第3页
计算方法程序_第4页
计算方法程序_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算方法上机基础篇应用于C/C+语言程序设计科技楼南836室QQ: 2121211http:/he2008-12作者:从事于计算数学、高性能计算、LBGK及软件开发。第01章 数值、运算与程序数 分类 0 1 2 3 .整数:无小数点有小数点练习:实数:数值计算中常用的2类 0. 0.1 1. 1.2 2. 2.3 3. .数 范围整数:实数:0.999999999999999E3082147483647 = 2 31 1 小数指数内部表示为32位二进制整数内部表示为二个整数: 第一个整数表示小数部分, 第二个整数表示指数部分;共占64个二进制位。(小数54bits, 指数10bits)数 精

2、度整数:实数:0.123456789012345E-10小数部分15位对小数取整; 超过范围取231的余数。15位后舍去; 超过范围则溢出报错。练习:2147483647 = 2 31 1 数 运算 整数: 实数: 混合: 练习:3 / 2 = 13.0 / 2.0 = 1.53.0 / 2 = 3 / 2.0 = 1.5 结果为整数结果为实数结果为实数整数运算还有: % & | ! 取余数 左移 右移 按位与 按位或 按位反 按位异或练习:先后, 从左到右, 括号优先。数 算术运算表达式存贮一个数, 并能被取出来使用这个数变量:起名:A, A1, B, B123, abc, .首字符为字母,

3、 后面字母或数字变量使用前要先定义, 定义用类型定义语句:类型名 变量名;例: int A;double B;变量的使用包括存和取, 存用赋值语句:变量名 = 表达式;而表达式中出现的变量名即为取变量的值。定义:使用:/ 先定义:int A; / 名字为 A, 值的类型为 整数 double B; / 名字为 B, 值的类型为 实数/ 后使用:A = 10; / A : 10B = 10.0; / B : 10.0A = A + 1; / A : 11B = A - B; / B : 1.0 .变量名 表达式;存取赋值运算符语句序列1. 类型定义语句2. 赋值语句类型名 变量名;一行中 / 后

4、面的为注释, 不起作用程序:程序:int A; double B; A = 10; B = 10.0; A = A + 1; B = A - B; int A; double B; A = 10; B = 10.0; A = A + 1; B = A - B; void main()打包main 函数:一个程序中有且仅有一个main函数;程序从main函数中的第一行开始执行。执行完整结构从键盘上输入一个或几个数到变量。键盘输入语句:int A; scanf( ”%d”, &A );double B; scanf( ”%lf”, &B );int A, B; / 多个变量用,分隔之double

5、C, D; / 多个变量用,分隔之 scanf( ”%d%lf%d%lf”, &A, &C, &B, &D );, - 常用于分隔; - 仅用于一条简单语句的结束格式串地址列表&变量名 表示该变量的地址屏幕输出语句:把字符串、数值显示到屏幕上。printf( ”Hello, World!” );结果: Hello, World!int A;A = 100;printf( ”A = %d”, A+1 );结果: A = 101int A, B;double C, D;A = 100;B = A + 100;C = B + 100;D = C + 100; printf( ”A=%d,B=%d,C

6、=%lf,D=%lf”, A+1, B+2, C+3, D+4 );结果: A=101,B=202,C=303.0,D=404.0一一对应格式串值列表#include / 输入输出语句所在头文件void main( )程序1:printf( ”Hello, World!” );运行结果:输出一个字符串的最简单程序。#include void main() int A; A = 100; printf( ”A = %d”, A );程序2:运行结果:变量赋一个值后输出该变量的值。#include void main() int A, B; double C, D; A = 100; B = A

7、+ 100; C = B + 100; D = C + 100; printf( ”A=%d,B=%d,C=%lf,D=%lf”, A, B, C, D );程序3:运行结果:几个变量赋值后输出这几个变量的值。#include void main() int A, B; scanf( ”%d%d”, &A, &B ); printf( ”%d + %d = %d”, A, B, A + B ); printf( ”%d - %d = %d”, A, B, A - B ); printf( ”%d * %d = %d”, A, B, A * B ); printf( ”%d / %d = %d”

8、, A, B, A / B );程序4: 输入2个整数, 输出相加、相减、相乘和相除的结果。运行结果:运行结果:程序5: 输入2个实数, 输出相加、相减、相乘和相除的结果。#include void main() int A, B; scanf( ”%lf%lf”, &A, &B ); printf( ”%lf + %lf = %lf”, A, B, A + B ); printf( ”%lf - %lf = %lf”, A, B, A - B ); printf( ”%lf * %lf = %lf”, A, B, A * B ); printf( ”%lf / %lf = %lf”, A,

9、B, A / B );运行结果:(int)实数的结果为整数程序6: 输入2个实数, 输出相加、相减、相乘和相除的结果的整数值。#include void main() int A, B; scanf( ”%lf%lf”, &A, &B ); printf( ”%lf + %lf = %lf”, A, B, (int)(A + B ); printf( ”%lf - %lf = %lf”, A, B, (int)(A - B ); printf( ”%lf * %lf = %lf”, A, B, (int)(A * B ); printf( ”%lf / %lf = %lf”, A, B, (i

10、nt)(A / B );(double)整数的结果为实数这叫类型强制转换程序7: 输入10个整数, 输出其和及平均值。#include void main() int i0, i1, i2, i3, i4, i5, i6, i7, i8, i9; int sum; printf( ”Enter 10 numbers: ”); scanf( ”%d%d%d%d%d%d%d%d%d”, &i0, &i1, &i2, &i3, &i4, &i5, &i6, &i7, &i8, &i9); sum = i0 + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9; p

11、rintf( “sum is %dn”, sum, x ); / n 换行符 printf( “average is %lf”, sum / 10.0 );运行结果:程序8: 输入1个实数, 输出其平方根。#include void main() double a; double x; scanf( ”%lf”, &a ); x = a; x = ( x + a / x ) / 2; x = ( x + a / x ) / 2; x = ( x + a / x ) / 2; x = ( x + a / x ) / 2; x = ( x + a / x ) / 2; / 要准确, 则再重复100

12、行 printf( “square root of %lf = %lf”, a, x );运行结果:程序9: 输入3个实数a、b、c, 输出ax2+bx+c=0的二个根。#include void main() double a, b, c, d, d1; printf( ”Input a,b,c : ” ); scanf( ”%lf%lf%lf”, &a, &b, &c ); d = b*b 4*a*c; d1 = d; d1 = ( d1 + d / d1 ) / 2; d1 = ( d1 + d / d1 ) / 2; d1 = ( d1 + d / d1 ) / 2; d1 = ( d

13、1 + d / d1 ) / 2; d1 = ( d1 + d / d1 ) / 2; d1 = ( d1 + d / d1 ) / 2; printf( “x1 = %lf, x2 = %lf”, (-b+d1)/(2*a), (-b-d1)/(2*a) );运行结果:程序10: 输入3个实数a、b、c, 输出ax2+bx+c=0的二个根。#include #include void main() double a, b, c, d, d1; printf( ”Input a,b,c :” ); scanf( ”%lf%lf%lf”, &a, &b, &c ); d = b*b 4*a*c;

14、 d1 = sqrt( d ); / 库函数, 求平方根 printf( “x1 = %lf, x2 = %lf”, (-b+d1)/(2*a), (-b-d1)/(2*a) );运行结果:程序11: 输入三角形的三条边的长度, 输出该三角形面积。#include #include void main() double a, b, c; double s, area; printf( ”Input a,b,c :” ); scanf( ”%lf%lf%lf”, &a, &b, &c ); s = a + b + c; area = sqrt( ( (s-a)+(s-b)+(s-c) ) / (

15、 (s-a)*(s-b)*(s-c) ); /? printf( “area = %lf”, area );运行结果:程序12: 输入二条直线, 求直线的交点。#include void main() double a11, a12, b1; double a21, a22, b2; double x1, x2; printf( ”Input a11, a12, b1 : ” ); scanf( ”%lf%lf%lf”, &a11, &a12, &b1 ); printf( ”Input a21, a22, b2 : ” ); scanf( ”%lf%lf%lf”, &a21, &a22, &

16、b2 ); x1 = ; / 自己填入 x2 = ; / 自己填入 printf( “x1 = %lf, x2 = %lf”, x1, x2 );运行结果:程序13: 输入一个0到90度之间的一个角度值, 输出其正弦值。#include void main() double x; double sin_x; printf( ”Input angle x: ” ); scanf( ”%lf”, &x ); x = ( x / 360.0 ) * 2 * 3.14159265; / 角度变弧度 sin_x = x x*x/2 + x*x*x*x/4/3/2 x*x*x*x*x*x/6/5/4/3/

17、2; / 想更准确? printf( “sin %d = %lf ”, x, sinx );运行结果:程序14: 输入一个0到90度之间的一个角度值, 输出其三角函数值。#include #include / 数学函数库的头文件void main() double x; double sin_x; printf( ”Input angle x: ” ); scanf( ”%lf”, &x ); x = ( x / 360.0 ) * 2 * 3.14159265; / 角度变弧度 sin_x = sin(x); / 调库函数 printf( “sin %d = %lf ”, x, sin_x

18、); printf( “ncos %d = %lf ”, x, cos(x) ); / 调库函数 printf( “ncos %d = %lf ”, x, tan(x) ); / 调库函数运行结果:程序15: 一些数学库函数的调用。其它可查找数学函数表。#include #include / 数学函数库的头文件void main() printf( “n指数: %lf ”, exp( 2.302585 ) ); printf( “n幂函数: %lf ”, pow( 2, 0.5 ) ); printf( “n自然对数: %lf ”, log( 2 ) ); printf( “n底10对数: %

19、lf ”, log10( 2 ) );运行结果:程序16: 输入半径, 输出圆的面积和周长。#include #define PI 3.14159265 / 符号定义语句void main() double r; printf( ”Input radus : ” ); scanf( ”%lf”, &r ); printf( ”%lf, %lf”, 2*PI*r, PI*r*r ); 运行结果:符号定义语句#define 符号名 字符串注意: 所有#开头的语句需独占一行。作用: 编译起始时, 这一符号名会先用后面的字符串替代。程序17问题: 求过二点的直线方程。1. 输入:二个点( x1, y1

20、), ( x2, y2 )类型皆为 double2. 输出:系数a,b 使y=ax+b过上述二点;类型皆为 double3. 算法: x1a + b = y1 x2a + b = y2 ,求a,b(用解二元一次方程组的方法)。#inlcude void main() double x1, y1, x2, y2; / 这是存放输入的 double a, b; / 这时放结果的 scanf( ”%lf%lf%lf%lf%lf%lf”, &x1, &y1, &x2, &y2 ); a = ( y1 y2 ) / ( x1 x2 ); b = ( x1 * y2 x2 * y1 ) / ( x1 x2

21、 ); printf( ”y=%lfx+%lf ”, a, b );4. 代码比划过程编程思路总结:1. 先把外部的包装写上, 搭好框架;2. 列出题目中已知的量和待求的量, 定好类型, 起好名字;3. 思考需要引进哪些中间变量, 也定好类型, 起好名字;4. 列出计算公式或算法, 必要时先画图示意;5. 编程并运行验证。已知量输入量结果量输出量临时量计算公式算法描述输入加工输出在编写任何一个程序时的思考图 打草稿示例18输入加工输出这一思想应贯穿你的每个程序设计中。思想:步骤:问题分析算法设计程序编写问题: 已知3点, 求圆心和半径。 1. 输入:三个点( x1, y1), ( x2, y2

22、 ), ( x3, y3 );类型皆为 double2. 输出:圆心( x0, y0 ), 半径 r ;类型皆为 double3. 算法:( x x0 )2 + ( y y0 )2 = r2,不要查公式, 自己推导算法。代入3个已知点, 问题变为:( x1 x0 )2 + ( y1 y0 )2 = r2,( x2 x0 )2 + ( y2 y0 )2 = r2,( x3 x0 )2 + ( y3 y0 )2 = r2,求 x0, y0, r(以后的题目都是这样用自然语言简单描述, 自己把问题分析后具体化)(先在草稿纸上比划)草稿打完化简, 问题再变为:(x2-x1)x0+(y2-y1)y0 =

23、 ( x22-x12 + y22-y12 ) / 2 ,(x3-x1)x0+(y3-y1)y0 = ( x32-x12 + y32-y12 ) / 2 ,求出 x0, y0再得现在问题转化为: 对一个二元一次方程的求解和求2点之间的距离。为了使算法更清晰, 引入中间变量:a11, a12, a21, a22, b1, b2, 即2点的距离。类型皆为 double,置值为:a11 = x2 - x1; a12 = y2 - y1; b1 = ( x22 - x12 + y22 - y12 ) / 2; a21 = x3 - x1; a22 = y3 - y1; b2 = ( x32 - x12

24、+ y32 - y12 ) / 2;a11x0+a12y0 = b1 ,a21x0+a22y0 = b2 ,求出 x0, y0则问题进一步转化为:此时, 可解出:x0 = ( b1 * a22 a12 * b2 ) / ( a11 * a22 - a12 * a21 );y0 = ( a11 * b2 a21 * b1 ) / ( a11 * a22 - a12 * a21 );程海无边, 回头是岸; break?我们continue, 下一步就在机器上敲入程序了。步1. 先搭框架#inlcude #include void main() 注意: 要齐整! 向前看齐。步2. 变量先定义好#in

25、lcude #include void main() double x1, y1, x2, y2, x3, y3; / 这是存放输入的 double x0, y0, r; / 这是放结果的 double a11, a12, a21, a22, b1, b2; / 这些是临时存数用的(在草稿中Baidu一下)步3. 加数据输入和结果输出代码#inlcude #include void main() double x1, y1, x2, y2, x3, y3; double x0, y0, r; double a11, a12, a21, a22, b1, b2; scanf( ”%lf%lf%l

26、f%lf%lf%lf”, &x1, &y1, &x2, &y2, &x3, &y3 ); printf( ”(%lf,%lf), r = %lf”, x0, y0, r );步4. 添加数据加工用的核心代码#inlcude #include void main() double x1, y1, x2, y2, x3, y3; / 这是存放输入的 double x0, y0, r; / 这是放结果的 double a11, a12, a21, a22, b1, b2; / 这些是临时存数用的 scanf( ”%lf%lf%lf%lf%lf%lf”, &x1, &y1, &x2, &y2, &x3

27、, &y3 ); a11 = x2 - x1; a12 = y2 - y1; a21 = x3 - x1; a22 = y3 - y1; b1 = ( x2*x2 - x1*x1 + y2*y2 - y1*y1 ) / 2; b2 = ( x3*x3 - x1*x1 + y3*y3 - y1*y1 ) / 2; x0 = ( b1 * a22 a12 * b2 ) / ( a11 * a22 - a12 * a21 ); y0 = ( a11 * b2 a21 * b1 ) / ( a11 * a22 - a12 * a21 ); r = sqrt( ( x1 - x0 ) * ( x1 -

28、x0 ) + ( y1 y0 ) * ( y1 y0 ) ); printf( ”(%lf,%lf), r = %lf”, x0, y0, r );直接从代码上能看出做什么吗?(在草稿中Google一下)步5. 运行试试运行结果整半天, 就这几行代码? 要这么费劲?示例19问题: 求三元一次方程组的解。1. 输入:a11,a12,a13; a21,a22,a23; a31,a32,a33; b1,b2,b3;类型皆为 double2. 输出:x1, x2, x3;3. 算法: a11x1 + a12x2 + a13x3 = b1类型皆为 double a21x1 + a22x2 + a23x3

29、 = b2 a31x1 + a32x2 + a33x3 = b3 (a11- a31*a13/a33)x1 + (a12-a32*a13/a33)x2 = b1-b3*a13/a33由得 (a21- a31*a23/a33)x1 + (a22-a32*a23/a33)x2 = b2-b3*a23/a33解出 x1, x2 , 并得x3 = ( b3 - a31x1 - a32 x2 ) / a33;(这是一个二元一次方程组, 我们不引入中间变量来存放系数和 右端项, 我们计算后仍将其放在a11, a12, a21, a22, b1, b2变量中)第3个式子中解出x3代入前2个式子#inlcud

30、e void main() double a11, a12, a13, a21, a22, a23, a31, a32, a33, b1, b2, b3; / 这是存放输入的 double x1, x2, x3; / 这是放结果的 scanf( ”%lf%lf%lf%lf”, &a11, &a12, &a13, &b1 ); / 第1行输入 scanf( ”%lf%lf%lf%lf”, &a21, &a22, &a23, &b2 ); / 第2行输入 scanf( ”%lf%lf%lf%lf”, &a31, &a32, &a33, &b3 ); / 第3行输入 / 临时存放 a11 = (a1

31、1- a31*a13/a33); a12 = (a12-a32*a13/a33); b1 = b1-b3*a13/a33; a21 = (a21- a31*a23/a33); a22 = (a22-a32*a23/a33); b2 = b2-b3*a23/a33; x1 = ( b1 * a22 a12 * b2 ) / ( a11 * a22 - a12 * a21 ); / 这2句参考例18 x2 = ( a11 * b2 a21 * b1 ) / ( a11 * a22 - a12 * a21 ); x3 = ( b3 - a31 * x1 - a32 * x2 ) / a33; pri

32、ntf( ”x1=%lf, x2=%lf, x3=%lf”, x1, x2, x3 );4. 代码5. 运行试验示例20问题: 求经过三点的一条抛物线。1. 输入:三个点( x1, y1), ( x2, y2 ), ( x3, y3 );类型皆为 double2. 输出:a, b, c 使 y = ax2 + bx + c 经过以上3点;类型皆为 double3. 算法:代入3个已知点, 问题变为:x12 a + x1b + c = y1求 a, b, c;y = ax2 + bx + c;x22 a + x2b + c = y2x32 a + x3b + c = y3 ,这样, 可利用上例中的程序代码, 请在代码中核对。#inlcude void main() double x1, y1, x2, y2, x3, y3; / 这是存放输入的 double a, b, c; / 这是放结果的 double a11, a12, a13, a21, a22, a23, a31, a32, a33, b1, b2, b3; / 这是放临时值的 scanf( ”%lf%lf%lf%lf%lf%lf”, &x1, &y1, &x2,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论