欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C程序设计C程序设计 (82).pdf

    • 资源ID:52748799       资源大小:612.72KB        全文页数:36页
    • 资源格式: PDF        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C程序设计C程序设计 (82).pdf

    C C程序设计程序设计Programming in CProgramming in C使用动态内存使用动态内存1、动态内存的应用C C程序设计程序设计程序设计程序设计3 37.6.3 7.6.3 动态内存的应用动态内存的应用虽然动态内存分配适用于所有数据类型,但通常用于数组、字符串、字符串数组、自定义类型及复杂数据结构类型。4 47.6.3 7.6.3 动态内存的应用动态内存的应用动态内存不同于静态内存,在实际编程中,需要注意以下几点:(1)静态内存管理由编译器进行,程序员只做对象定义(相当于分配),而动态内存管理按程序员人为的指令进行。5 57.6.3 7.6.3 动态内存的应用动态内存的应用(2)动态内存分配和释放必须对应,即有分配就必须有释放,不释放内存会产生“内存泄漏”,后果是随着程序运行多次,可以使用的内存空间越来越少;另一方面,再次释放已经释放的内存空间,会导致程序出现崩溃性错误。6 67.6.3 7.6.3 动态内存的应用动态内存的应用(3)静态分配内存的生命期由编译器自动确定,要么是程序运行期,要么是函数执行期。动态分配内存的生命期由程序员决定,即从分配时开始,至释放时结束。特别地,动态分配内存的生命期允许跨多个函数。7 77.6.3 7.6.3 动态内存的应用动态内存的应用(4)静态分配内存的对象有初始化,动态分配内存一般需要人为的指令赋初始值。(5)避免释放内存后出现“迷途指针”,应及时设置为空指针。8 87.6.3 7.6.3 动态内存的应用动态内存的应用【例7.25】在不同函数中分配、使用、释放动态内存。9 97.6.3 7.6.3 动态内存的应用动态内存的应用例7.251#include#include 2#include#include 3 intint*f1f1(intint n n)4 /分配n个整型内存,返回首地址/分配n个整型内存,返回首地址5 intint*p p,i i;6 p p=(=(intint*)*)mallocmalloc(n n*sizeofsizeof(intint););/分配/分配7 forfor(i i=0 0;i i-0 0)printfprintf(%d,*(%d,*p p+);+);13 14 voidvoid f3f3(intint*p p)15 /释放内存/释放内存10107.6.3 7.6.3 动态内存的应用动态内存的应用例7.2516 freefree(p p););17 18 intint mainmain()()19 20 intint*pipi;21 pipi=f1f1(5 5););/分配/分配22 f2f2(pipi,5 5););/输出/输出23 f3f3(pipi););/释放/释放24 returnreturn 0 0;25 11117.6.3 7.6.3 动态内存的应用动态内存的应用例7.251#include#include 2#include#include 3 intint*f1f1(intint n n)4 /分配n个整型内存,返回首地址/分配n个整型内存,返回首地址5 intint*p p,i i;6 p p=(=(intint*)*)mallocmalloc(n n*sizeofsizeof(intint););/分配/分配7 forfor(i i=0 0;i i n n;i i+)+)p p i i=i i;/赋初始值/赋初始值8 returnreturn p p;9 第6行分配n个整型内存单元,第7行给分配到的每个内存单元赋初始值。12127.6.3 7.6.3 动态内存的应用动态内存的应用例7.2518 intint mainmain()()19 20 intint*pipi;21 pipi=f1f1(5 5););/分配/分配22 f2f2(pipi,5 5););/输出/输出23 f3f3(pipi););/释放/释放24 returnreturn 0 0;25 13137.6.3 7.6.3 动态内存的应用动态内存的应用1动态分配数组使用动态内存,可以轻而易举地解决本节开始提出的问题:在程序运行时产生任意大小的“数组”。14147.6.3 7.6.3 动态内存的应用动态内存的应用动态分配一维或多维数组的方法是由指针管理数组,二维以上数组按一维数组方式来处理,具体步骤为:定义指针p;分配数组空间,用来存储数组元素,空间大小按元素个数计算;按一维数组方式使用这个数组(例如输入、输出等);若是一维数组,则元素为pi;若是二维数组,则元素为pi*M+j,其中M为列元素个数,以此类推。释放数组空间;15157.6.3 7.6.3 动态内存的应用动态内存的应用【例7.26】计算n阶行列式的值(n由键盘输入)。16167.6.3 7.6.3 动态内存的应用动态内存的应用例7.261#include#include 2#include#include 3 doubledouble HLSHLS(doubledouble*A A,intint N N)/HLS(double ANN,int N)/HLS(double ANN,int N)4 /计算N阶行列式/计算N阶行列式5 intint i i,j j,m m,n n,s s,t t,k k=1 1;6 doubledouble f f=1.01.0,c c,x x;7 forfor(i i=0 0,j j=0 0;i i N N&j j N N;i i+,+,j j+)+)8 ifif(A A i i*N N+j j=0 0)/Aij 检查主对角线是否为0/Aij 检查主对角线是否为09 forfor(m m=i i+1 1;m m N N&A A m m*N N+j j=0 0;m m+);+);/Amj/Amj10 ifif(m m=N N)returnreturn 0 0;/全为0则行列式为0/全为0则行列式为011 elseelse12 forfor(n n=j j;n n i i;s s-)-)/列变换化成上三角行列式/列变换化成上三角行列式20 x x=A A s s*N N+j j;/Asj/Asj21 forfor(t t=j j;t t N N;t t+)+)/Ast-=Ait*(x/Aij)/Ast-=Ait*(x/Aij)22 A A s s*N N+t t-=-=A A i i*N N+t t*(*(x x/A A i i*N N+j j););23 24 25 forfor(i i=0 0;i i N N;i i+)+)f f*=*=A A i i*N N+i i;/Aii/Aii26 returnreturn k k*f f;27 28 intint mainmain()()29 30 intint i i,j j,n n=4 4;18187.6.3 7.6.3 动态内存的应用动态内存的应用例7.2631 doubledouble*A A;32 scanfscanf(%d,&(%d,&n n););33 A A=mallocmalloc(n n*n n*sizeofsizeof(doubledouble););/分配“数组”Ann/分配“数组”Ann34 forfor(i i=0 0;i i n n;i i+)+)35 forfor(j j=0 0;j j n n;j j+)+)36 scanfscanf(%lf,(%lf,A A+i i*n n+j j););/输入数据到Aij/输入数据到Aij37 printfprintf(detA=%lf(detA=%lfnn,HLSHLS(A A,n n););38 freefree(A A););/释放“数组”/释放“数组”39 returnreturn 0 0;40 19197.6.3 7.6.3 动态内存的应用动态内存的应用例7.261#include#include 2#include#include 3 double HLS(double*A,int N)/HLS(double ANN,int N)double HLS(double*A,int N)/HLS(double ANN,int N)4 /计算N阶行列式/计算N阶行列式5 int i,j,m,n,s,t,k=1;int i,j,m,n,s,t,k=1;6 double f=1.0,c,x;double f=1.0,c,x;7 for(i=0,j=0;iN&jN;i+,j+)for(i=0,j=0;iN&jN;i+,j+)8 if(Ai*N+j=0)/Aij 检查主对角线是否为0if(Ai*N+j=0)/Aij 检查主对角线是否为09 for(m=i+1;mN&Am*N+j=0;m+);/Amjfor(m=i+1;mN&Am*N+j=0;m+);/Amj10 if(m=N)return 0;/全为0则行列式为0if(m=N)return 0;/全为0则行列式为011 elseelse12 for(n=j;nN;n+)/两行交换for(n=j;nN;n+)/两行交换13 c=Ai*N+n;/Ainc=Ai*N+n;/Ain14 Ai*N+n=Am*N+n;/Ain=Amn;Ai*N+n=Am*N+n;/Ain=Amn;15 Am*N+n=c;/AmnAm*N+n=c;/AmndetA=40.00000043 1-1 2-5 1 3-4 2 0 1-1 1-5 3-320207.6.3 7.6.3 动态内存的应用动态内存的应用2动态分配字符串实际编程中,字符串类型表示文字信息数据,其特点是字符长度不固定。通过动态分配字符串,根据程序的需要确定字符串的实际长度。21217.6.3 7.6.3 动态内存的应用动态内存的应用动态分配字符串的方法是由字符指针管理字符串,具体步骤为:定义字符指针;分配字符串空间,用来存储字符串;使用这个字符串(例如输入、输出等);释放字符串空间;22227.6.3 7.6.3 动态内存的应用动态内存的应用例如:1#include#include 2#include#include 3 intint mainmain()()4 5 charchar*p p;/字符串指针/字符串指针6 p p=(=(charchar*)*)mallocmalloc(10001000*sizeofsizeof(charchar););/分配字符串空间/分配字符串空间7 getsgets(p p););/输入字符串/输入字符串8 putsputs(p p););/输出字符串/输出字符串9 freefree(p p););/释放字符串空间/释放字符串空间10 returnreturn 0 0;11 23237.6.3 7.6.3 动态内存的应用动态内存的应用3动态分配字符串数组使用二维字符数组来存储字符串可能会浪费内存空间。采用指针数组和动态内存分配,可以存储多个字符串而且减少不必要的内存开销。24247.6.3 7.6.3 动态内存的应用动态内存的应用动态分配字符串数组的方法是由指向字符指针的指针管理多个字符指针,由每个字符指针管理字符串,具体步骤为:定义字符指针数组的指针(即指向字符指针的指针);分配字符指针数组空间,用来存储若干字符串的指针;分配字符串空间,用来存储字符串;使用这些字符串(例如输入、输出等);释放字符串空间;释放字符指针数组空间。25257.6.3 7.6.3 动态内存的应用动态内存的应用1#include#include 2#include#include 3 intint mainmain()()4 5 intint i i,n n;6 charchar*pppp;7 scanfscanf(%d,&(%d,&n n););/输入字符串数目/输入字符串数目8 pppp=(=(charchar*)*)mallocmalloc(n n*sizeofsizeof(charchar*);*);/分配字符指针数组空间/分配字符指针数组空间9 forfor(i i=0 0;i i n n;i i+)+)10 pppp i i=(=(charchar*)*)mallocmalloc(100100*sizeofsizeof(charchar););/分配字符串空间/分配字符串空间11 getsgets(pppp i i););/输入字符串/输入字符串12 13 forfor(i i=0 0;i i n n;i i+)+)putsputs(pppp i i););/输出字符串/输出字符串14 forfor(i i=0 0;i i n n;i i+)+)freefree(pppp i i););/释放字符串空间/释放字符串空间15 freefree(pppp););/释放字符指针数组空间/释放字符指针数组空间16 returnreturn 0 0;17 26267.6.3 7.6.3 动态内存的应用动态内存的应用【动态内存应用举例】编程输出n阶魔方阵(n由键盘输入)。27277.6.3 7.6.3 动态内存的应用动态内存的应用例题分析根据前面述及的n阶魔方阵算法:(1)奇数(n=2K+1)阶魔方阵;(2)双偶(n=4K)阶魔方阵;(3)单偶(n=4K+2)阶魔方阵;分别设计3个函数给予实现,且使用动态内存而非数组实现“任意的n阶”。28287.6.3 7.6.3 动态内存的应用动态内存的应用例7.511#include#include 2#include#include 3 voidvoid OutMagicOutMagic(intint*A A,intint n n)4 /输出n阶魔方阵/输出n阶魔方阵5 intint i i,j j,L L,S S;6 forfor(i i=0 0;i i n n;i i+)+)/输出魔方阵/输出魔方阵7 S S=0 0;/S累计一行之和/S累计一行之和8 printfprintf();();9 forfor(j j=0 0;j j n n;S S=S S+A A i ij j,j j+)+)10 printfprintf(%4d,(%4d,A A i ij j););11 printfprintf(=%4d(=%4dnn,S S););/输出一行之和/输出一行之和12 13 printfprintf(=);(=);14 forfor(j j=0 0;j j n n;j j+)+)/输出魔方阵列之和/输出魔方阵列之和15 S S=0 0;29297.6.3 7.6.3 动态内存的应用动态内存的应用例7.5116 forfor(i i=0 0;i i n n;i i+)+)S S=S S+A A i ij j;17 printfprintf(%4d,(%4d,S S););/输出一列之和/输出一列之和18 19 L L=S S=0 0;20 forfor(i i=0 0;i i n n;i i+)+)S S=S S+A A i ii i,L L=L L+A A i in n-1 1-i i;21 printfprintf(=%4d=%4d(=%4d=%4dnn,S S,L L););/输出对角线与反对角线之和/输出对角线与反对角线之和22 23 voidvoid Magic2k1Magic2k1(intint*A A,intint n n,intint idxidx,intint oxox,intint oyoy)24 /奇数(n=2K+1)阶魔方阵,从idx开始填写/奇数(n=2K+1)阶魔方阵,从idx开始填写25 intint i i,x x,y y=0 0;26 x x=n n/2 2;27 forfor(i i=idxidx+1 1;i i=idxidx+n n*n n;i i+)+)28 A A oyoy+y yoxox+x x=i i;29 ifif(i i%n n=0 0)y y+;+;30 elseelse x x+,+,y y-;-;30307.6.3 7.6.3 动态内存的应用动态内存的应用例7.5131 x x=(=(x x%n n+n n)%)%n n;32 y y=(=(y y%n n+n n)%)%n n;33 34 35 voidvoid Magic4kMagic4k(intint*A A,intint n n)36 /双偶(n=4K)阶魔方阵/双偶(n=4K)阶魔方阵37 intint i i,j j,m m,L L,S S;38 intint x x=0 0,y y=0 0,oxox,oyoy;39 L L=n n*n n;40 forfor(i i=1 1;i i=L L;i i+)+)/先填数字/先填数字41 A A y yx x=i i;42 ifif(i i%n n=0 0)x x=0 0,y y+;+;43 elseelse x x+;+;44 45 S S=1 1+L L;/最大数和最小数之和/最大数和最小数之和31317.6.3 7.6.3 动态内存的应用动态内存的应用例7.5146 m m=n n/4 4;/以4x4大小分割魔方阵/以4x4大小分割魔方阵47 x x=y y=oxox=oyoy=0 0;48 L L=m m*m m;49 forfor(j j=1 1;j j=L L;j j+)+)50 forfor(i i=0 0;i i 4 4;i i+)+)/对每个4x4魔方阵做对角互补替换/对每个4x4魔方阵做对角互补替换51 A A oyoy+i ioxox+i i=S S-A A oyoy+i ioxox+i i;52 A A oyoy+i ioxox+(+(4 4-i i-1 1)=)=S S-A A oyoy+i ioxox+(+(4 4-i i-1 1););53 54 ifif(j j%m m=0 0)oxox=0 0,oyoy+=+=4 4;55 elseelse oxox=j j%m m*4 4;/转移到下一个4x4魔方阵/转移到下一个4x4魔方阵56 57 58 voidvoid Magic4k2Magic4k2(intint*A A,intint n n)59 /单偶(n=4K+2)阶魔方阵/单偶(n=4K+2)阶魔方阵60 intint i i,j j,k k,m m,L L;32327.6.3 7.6.3 动态内存的应用动态内存的应用例7.5161 Magic2k1Magic2k1(A A,n n/2 2,0 0,0 0,0 0););/填写A象限/填写A象限62 Magic2k1Magic2k1(A A,n n/2 2,n n*n n/4 4,n n/2 2,n n/2 2););/填写D象限/填写D象限63 Magic2k1Magic2k1(A A,n n/2 2,n n*n n/2 2,n n/2 2,0 0););/填写B象限/填写B象限64 Magic2k1Magic2k1(A A,n n/2 2,n n*n n*3 3/4 4,0 0,n n/2 2););/填写C象限/填写C象限65 m m=(=(n n-2 2)/)/4 4;/对ADBC象限奇数阶魔方阵做处理/对ADBC象限奇数阶魔方阵做处理66 forfor(i i=0 0;i i n n/2 2;i i+)+)67 forfor(j j=0 0;j j m m;j j+)+)/步骤2/步骤268 k k=(=(i i=n n/4 4)?n?n/4 4+j j:j j;69 L L=A A i ik k,A A i ik k=A A i i+n n/2 2k k,A A i i+n n/2 2k k=L L;70 71 forfor(j j=0 0;j j 2 2)82 A A=(=(intint*)*)mallocmalloc(sizeofsizeof(intint*)*)*n n););/分配n个数组行指针/分配n个数组行指针83 forfor(i i=0 0;i i n n;i i+)+)84 A A i i=(=(intint*)*)mallocmalloc(sizeofsizeof(intint)*)*n n););/分配行/分配行85 ifif(n n%2 2=1 1)86 Magic2k1Magic2k1(A A,n n,0 0,0 0,0 0););/奇数阶魔方阵/奇数阶魔方阵87 else ifelse if(n n%4 4=0 0)88 Magic4kMagic4k(A A,n n););/双偶阶魔方阵/双偶阶魔方阵89 elseelse90 Magic4k2Magic4k2(A A,n n););/单偶阶魔方阵/单偶阶魔方阵34347.6.3 7.6.3 动态内存的应用动态内存的应用例7.5191 OutMagicOutMagic(A A,n n););/输出魔方阵/输出魔方阵92 forfor(i i=0 0;i i 2(error input:n2nn););97 returnreturn 0 0;98 35357.6.3 7.6.3 动态内存的应用动态内存的应用77 intint mainmain()()78 /求解任意n阶魔方阵/求解任意n阶魔方阵79 intint*A A,i i,n n;80 scanfscanf(%d,&(%d,&n n););/输入n阶/输入n阶81 ifif(n n 2 2)82 A A=(=(intint*)*)mallocmalloc(sizeofsizeof(intint*)*)*n n););/分配n个数组行指针/分配n个数组行指针83 forfor(i i=0 0;i i n n;i i+)+)84 A A i i=(=(intint*)*)mallocmalloc(sizeofsizeof(intint)*)*n n););/分配行/分配行结束结束

    注意事项

    本文(C程序设计C程序设计 (82).pdf)为本站会员(刘静)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开