配色: 字号:
第四章__数组
2012-11-21 | 阅:  转:  |  分享 
  
第四章数组4.1一维数组4.2二维数组4.3字符串4.4指针和数组4.5程序举例4.1一维数组4.1.3数组元素的引用和基本操作1.数组元素的引用形式:数组名[下标]相当于一个普通变量4.1.4数组排序4.2二维数组4.2.1二维数组的定义和初始化1.数组的定义形式:数据类型数组名[常量表达式1][常量表达式2];如:floata[2][3];4.2.2二维数组的基本操作4.3字符串4.3.2CString类4.4指针和数组4.4.3指针和字符串可通过字符指针来访问字符数组,二者的区别:4.5程序举例#include"iostream.h"#include"afx.h"voidmain(){CStringst1('''',30);//产生30个空CStringst2("ABCDEFGHIJKLMNOPQRS");for(inti=1;i<=10;i++)cout<maxlen) {maxlen=len;//找最长的单词长度 maxst=st1;//找最长的单词 }}cout<a<=>&a[0](2)p+i<=>&a[i](3)(p+i)<=>(a+i)<=>a[i]指针可以作数组名用即:p[i]<=>a[i]设有:p=a;for(i=0;i<10;i++) cin>>a[i];则等价于:p=a;for(i=0;i<10;i++) cin>>p++;p=a;for(i=0;i<10;i++,p++) cin>>p;p=a;for(i=0;i<10;i++) cin>>(p+i);思考:第三种方法与其它二种区别何在?分析下列程序:#includevoidmain(){inta[10],i,p;p=a;for(i=0;i<10;i++)cin>>p++;;for(i=0;i<10;i++,p++)cout<>p;或gets(s);s[0]=’c’;s[1]=’h’;//逐个赋值cin>>s;gets(s);赋值charp=“china”;charp=s;chars[]=“china”;初始化charp;chars[6];定义字符指针字符数组4.1.1引例:【例4.1】求N个学生的平均成绩,并统计高于平均分的人数。用以前所学知识实现:intk=0;floats,ave,sum=0;for(inti=0;i<100;i++){cin>>s;sum=sum+s;}ave=sum/100;for(i=0;i<100;i++){cin>>s; if(s>ave)k++;}用数组来实现:intk=0;floats[100],ave,sum=0;for(i=0;i<100;i++){cin>>s[i];sum=sum+s[i];}ave=sum/100;for(i=0;i<100;i++)if(s[i]>ave)k++;数组:一组数据类型相同的元素按一定顺序存放,构成的数据集合。4.1.2一维数组的定义、存储和初始化1.定义形式数据类型数组名[整型常量表达式];如:ints[5];s[0]s[1]s[2]s[3]s[4]下标从0开始数组名是常量,表示数组在内存中的首地址。数组长度应该为整型常量表达式,不能是变量。如:s正确:constints=10;inta[s];floatf[5]; 错误:ints=10;inta[s];floatb[3.4]2.数组的初始化1)给所有元素赋初值。如:inta[5]={0,2,4,6,8};或inta[]={0,2,4,6,8};2)给部分元素赋初值。如:inta[10]={1,3,5,7,9};花括号内列出的值赋给了前面的若干个元素,其余元素系统自动赋0。花括号错误:inta[10];a={1,3,5,7,9};//数组名是个地址常量,不能被赋值。inta[10];a[10]={1,3,5,7,9};//a[10]不是数组中的元素,不能用花括号为一个元素赋多个值。intc[3]={1,2,3,4};//常量个数超过数组定义的长度。如有:inta[10]={1,2,3,4,5,6,7,8,9,10},b[10],i(2);则:a[3]=a[0]+a[i];cout<>a[j];(2)通过随机函数rand()产生0~100的N个数据for(i=0;imax)max=a[j];(5)求最大元素下标imax=0; //imax代表最大元素下标for(j=1;ja[imax])imax=j;(6)将最大元素放于某一特定位置(如放在最前头)imax=0;for(j=1;ja[imax])imax=j;if(imax!=0){t=a[0];a[0]=a[imax];a[imax]=t;}排序是将一组数按递增或递减的次序排列,如按学生的成绩、球赛积分等排序。常用的算法有:选择法(√)冒泡法(√)插入法快速排序法…...1.选择法排序基本思想:(1)从n个数的序列中选出最小的数(递增),与第1个数交换位置;(2)除第1个数外,其余n-1个数再按(1)的方法选出次小的数,与第2个数交换位置;(3)重复(1)n-1遍,最后构成递增序列。【例4.2】对存放在数组中的6个数,用选择法按递增排序。下标01~5 12~523~5 3 4~5 4 5for(i=0;i<5;i++){min=i;for(j=i+1;j<6;j++)if(a[j]a[j]){temp=a[j-1]; a[j-1]=a[j];a[j]=temp;}思考:当数据未交换,说明数组已有序,如何结束排序?a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]以“先行后列”的规则连续存放:序号:012345序号=当前行号每行列数+当前列号2.数组的初始化(1)按在内存排列顺序对所有元素赋初值。(2)按行给所有元素赋初值,每一行的数据放于一个花括号内。(3)按行给部分元素赋初值,在静态存贮类型static中省略的元素初值此时自动为0。 对应的数组b为:(4)按行赋初值也可省略第一维的长度。 对应的数组c为:inta[2][3]={1,2,3,4,5,6};或inta[][3]={1,2,3,4,5,6};inta[2][3]={{1,2,3},{4,5,6}};staticintb[3][4]={{1,2},{0,3,4},{0,0,5}}staticintc[][3]={{1},{},{2}};1.数组的输入、输出【例4.4】输入两个矩阵A、B的值,求c=A+B。分析:A、B矩阵相加,其实质是将两矩阵的对应元素相加。相加的条件是有相同的行、列数。#include"iostream.h"#include"iomanip.h"voidmain(){inta[2][3],b[2][3],c[2][3],i,j;for(i=0;i<2;i++)for(j=0;j<3;j++) cin>>a[i][j];for(i=0;i<2;i++)for(j=0;j<3;j++) cin>>b[i][j];for(i=0;i<2;i++)//A+B矩阵,每个对应元素相加for(j=0;j<3;j++) c[i][j]=a[i][j]+b[i][j];for(i=0;i<2;i++){for(j=0;j<3;j++) cout<max){max=a[i][j];imax=i;jmax=j;}矩阵转置将矩阵以主对角线为轴线,将元素的行和列位置调换。 【例4.6】对3×3方阵转置123 147a=456b=258789 369for(i=0;i<3;i++)for(j=0;j>s1[i];//s1中是字符,不是字符串注意:输入时各输入项之间不需加空格分隔字符串整体的输入/输出 chars1[10],s2[2][5];输入: 输出:cin>>s1; ?cout<>s1;语句,字符串中不能有空格。函数gets()和puts()是对字符串整体输入/输出,应加#include“stdio.h”命令。 gets(字符数组名或字符指针变量名); puts(字符数组名或字符指针变量名); #include"stdio.h"#include"iostream.h"voidmain(){inti;charc[5]={''C'',''h'',''i'',''n'',''a''};charb[]="China"; for(i=0;i<5;i++) //不能用puts(c);也不能用cout<>c; st1=c; cout<<"输出结果:";cout<、<、==>=、<=、!=关系运算st1==”ASDF”st1




献花(0)
+1
(本文系觉悟社心天...首藏)