C++程序设计课件 设计制作:徐龙琴 2
?掌握 数组 的基本 概念 ;
?熟练掌握 一维 数组和 二维数组 的 使用方法 ;
?掌握 字符数组与字符串的关系
?会 分析、编写 利 用数组进行数据存储 和 处理 的
简单 程序 。
本章要点:
C++程序设计课件 设计制作:徐龙琴 3
§ 数组的概述
⒈ 数组的概念
数组是 具有一定 顺序关系 的若干 相同类型变量
的集合体,组成数组的变量称为该 数组的 元素 。
数组 属于 构造类型。
2 是一个数组的 所有元素的类型必须是相同 的。
1 数组元素的 个数必须是确定 的,但元素值是可变的;
⒉ 数组有两个特点:
C++程序设计课件 设计制作:徐龙琴 4
⒊ 数组的分类:
按数组元素类型分:
数值 数组,
字符 数组,
指针 数组,
int a[8],b[4]={2,4,5,9};
char c[ ]=“Thank”;
* d[3];
按维数来分:
一维 数组,
二维 数组,
多维 数组,
int m[2][2]={2,4,5,9};
int a[8],b[4]={2,4,5,9};
int n[2][2][2];
C++程序设计课件 设计制作:徐龙琴 5
例, 存储学生成绩用 实型数组 mark[100],
存储一行文字用 字符数组 str[200],
存储一个 4*6的矩阵用 二维 整型数组 a[4][6]。
其中,① mark,str,a 是数组名。数组名 是数组的 首
地址,是一个 地址常量 。
② [ ] 称为 下标运算符 。
③ 下标运算符的个数称为 数组的维数
④ 数组的成员称为 数组元素,mark[0],mark[1]
⑤ 数组元素的类型称为该 数组的基类型 。
C++程序设计课件 设计制作:徐龙琴 6
? 数组元素在内存里 顺序 存放
一维数组的存放:
⒋ 数组元素在内存的存放形式
每个数据元
素占用的字节
数,就是 基类
型 的字节数
mark[0]
mark[1]
mark[2]
mark[3]
.
.
.
mark[99]
86.5
92.0
77.5
52.0
.
.
.
94.0
低地址
高地址
C++程序设计课件 设计制作:徐龙琴 7
b[0][0]
b[0][1]
b[0][2]
b[1][0]
b[1][1]
b[1][2]
1
2
3
4
5
6
3000H
3002H
3004H
3006H
3008H
300AH
例如:整型数组 b
b[2][3]={ {1,2,3},
{4,5,6} };
多维数组的元素 按行 顺序存放。
二维数组的存放,
地址 值 数组元素
先存放第 1 行的所
有元素,再存放第
2 行的所有元素。
C++程序设计课件 设计制作:徐龙琴 8
int a[4]={2,4,5,9};
————————
————————
2
4
9
内存空间
————————
————————
5
————————
:
::
:
内存地址
3000
3002
3004
3006
数组 a
a[0]
a[1]
a[2]
a[3]
例:
C++程序设计课件 设计制作:徐龙琴 9
§ 一维数组
⒈ 一 维数组定义格式,
数组同变量一样,也必须 先定义、后使用
存储类型 数据类型 数组名 [常量表达式 ]
? 存储类型, 可以是,auto,static,extern,但不能是 register,
缺省值为 auto 。
数据类型, 可以是基本类型、复合类型,但不能是引用。
数组名,是标识符,是数组元素在内存中的起始地址,它是 地址常量
常量表达式, 指是数组的元素个数(又 称数组长度 ),是一个
整型值,包含 常数和符号常量,但 不能包含变量
C++程序设计课件 设计制作:徐龙琴 10
① float a[0]; /* 数组大小为 0没有意义 */
② int b(2)(3); /* 不能使用圆括号 */
③ int k,a[k]; /* 不能用变量说明数组大小 */
④ int n;
scanf (”%d”,&n);
int a[n];
例,数组的定义中常见的错误:
C++程序设计课件 设计制作:徐龙琴 11
⒉ 一 维数组初始化方法:
① 直接或部分赋值:
int b[4]={1,1,1,1};
int a[ ]={9,1,3,6,4,3};
int c[10 ]={1,4,3,2,4,6};
int d[2];
d[0]= 1;
d[1]= 5;
可以只对部分元素赋初值,
未赋初值的元素自动取 0值。
C++程序设计课件 设计制作:徐龙琴 12
② 用 cin:
int b[4];a[10];
for(int i=0;i<=3;i++)
cin>> b[i];
for(int j=0;k<=3;k++)
cout<< b[i];
for(int k=0;k<=3;k++)
a[k]=1+2*k;
C++程序设计课件 设计制作:徐龙琴 13
③ 用 scanf:
#include <stdio.h>
void main()
{int a[5];
for (int i=0;i<=4;i++)
scanf("%d",&a[i]);
for (int j=0;j<=4;j++)
printf("%d",a[j]);
}
C++程序设计课件 设计制作:徐龙琴 14
④ 用 menset( )函数,它可逐个字节的将数组设置为一
个指定的值。
#include <mem.h>
void main()
{int a[25];
float b[50];
memset(a,0,25*size(int));
memset(b,0,50*size(float));
}
C++程序设计课件 设计制作:徐龙琴 15
⒊ 一 维数组引用格式:
数组名 [下标 ]
例,a[2]=10; //将 10赋给数组中的 a[2]元素。
a[5]=a[2]; //将 a[2]元素的值赋给 a[5]元素
cout<<a[5]; //打印 a[5]元素的值
下标 表示 了 元素 在数组中
的 顺序号 。 只能为 整型常量或
整型表达式
C++程序设计课件 设计制作:徐龙琴 16
注意,
1 全局数组 和 静态数组 各元素的值 默认为 0。
2 在定义数组时,其 元素的个数必需确定,即 常量表
达式 只能是 常数 和 符号常量, 不能是 变量。
3 若 int a[10];则 a的 合法下标 为 0~9。 a[10]为越界。
4 数组名 是一个标是符,它 是 该 数组内存的首地址
5 常用 sizeof( a) /sizeof(类型) 确定数组的大小其中
sizeof( a),sizeof( a[i]) 分别表示 求数组 a及其元素在内
存中所占字节数
sizeof(类型) 表示求该类型每个数据在内存中所占字节数。
C++程序设计课件 设计制作:徐龙琴 17
例,一维数组的声明与引用
#include <iostream.h>
void main()
{ int A[10],B[10];
int i;
for(i=0;i<10;i++)
{ A[i]=i*2-1;
B[10-i-1]=A[i]; }
for(i=0;i<10;i++)
{cout<<"A["<<i<<"]="<<A[i];
cout<<" B["<<i<<"]="<<B[i]<<endl;}
}
C++程序设计课件 设计制作:徐龙琴 18
例,定义一个一维数组,把各元素值清 0,并输出各元素值。
#include <iostream.h>
void main( )
{ int i;
int b[5];
for(i=0;i<=4;i++)
b[i]=0;
for(i=4;i>=0;i--)
cout<<b[i]<<endl;
}
C++程序设计课件 设计制作:徐龙琴 19
例,用 数组来处理求 Fibonacci数列前 20项 。 Fibonacci数列,
前两项分别为 0和 1,从第 3项开始的每一项均为其前两
项之和 。
#include <iostream.h>
void main()
{ int i;
int f[20]={0,1};
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
{ if( (i+ 1)%5==0 )
cout<<endl;
cout<< f[i] << " "; }
}
程序运行结果如下:
0 1 1 2 3
5 8 13 21 34
55 89 144 233 377
610 987 1597 2584 4181
C++程序设计课件 设计制作:徐龙琴 20
② 数组名 用作 函数的 实参
① 数组元素 用作 函数的 实参
⒋ 向函数传递一维数组,
若用 数组名作为实参, 形参可以是 数组名也可以是
指针变量,形参数组在定义时,系统 不分配给它内存空
间,在调用时,将 实参数组名代表的地址赋给形参 。 对
形参数组 元素所进行的所有 操作, 实际上是 对 实参数组
元素所 进行的操作
C++程序设计课件 设计制作:徐龙琴 21
例,已知某个学生 5门课程的成绩,求平均成绩。
#include <stdio.h>
float aver(float a[ ]) /*求平均值函数 */
{int i;
float av,s=a[0];
for(i=1; i<5 ; i++) s += a[i];
av=s/5;
return av;}
void main()
{ float sco[5],av;
int i;
printf("\ninput 5 scores:\n");
for(i=0;i<5;i++)
scanf("%f",&sco[i]);
av=aver(sco);
printf("average score is %5.2f\n",av);}
av=aver(sco,5);
loat loat,int n )
i< n
C++程序设计课件 设计制作:徐龙琴 22
§ 二 维数组
⒈ 二 维数组定义格式:
存储类型 数据类型 数组名 [常量表达式 1] [常量表达式 2]
?常量表达式 1,标识数组了的 行数,它 必需是 一个 确定的值
常量表达式 2,标识数组的 列数,它不能为变量
C++程序设计课件 设计制作:徐龙琴 23
例, int a[3][4];
可以把它看作是一个 一维数组,它有 3个元素
a[0],a[1],a[2],这 每个元素又是一个分别含 4个元素的
一维数组:
a[0] a[0][0],a[0][1],a[0][2],a[0][3]
a a[1] a[1][0],a[1][1],a[1][2],a[1][3]
a[2] a[2][0],a[2][1],a[2][2],a[2][3]
二维数组 中元素 在 计算机 内存中的存放顺序是,按行存放,
即先在内存中存放第一行的元素,再放第二行的元素。一个
m x n的二维数组 a,其元素 a[i][j]在数组中的第
元素
i*n+j+1
a由三个一维数组 a[0],a[1],a[2]组成
a是 纵向 一维数组的 首地址
a[0], a[1], a[2]均是 横向 一维数组的 首地址
C++程序设计课件 设计制作:徐龙琴 24
② 连续赋值
① 按行分段赋值
⒉ 二 维数组初始化:
int a[2][3]={ {1},{4,0,5} }; 或 int a[ ][3]={ {1,2,1},{4,0,5} };
int a[2][3]={ 1,2,1,4,0,5 }; 或 int a[ ][3]={ 1,2,1,4,0,5 };
可以只对部分元素赋初值,
未赋初值的元素自动取 0值。
③ 用输入语句赋植
int a[2][3];
for( int i=0;i<2;i++)
for( int j=0;i<3;j++)
cin>>a[i][j];
⒊ 二 维数组元素的引用:
数组名 [下标 1] [下标 2] int a[2][3]; a[1][2]=9;例:
C++程序设计课件 设计制作:徐龙琴 25
例,一个学习小组有 5个人,每个人有三门课的考试成绩。求全组
分科的平均成绩和各科总平均成绩。
#include <iostream.h>
void main()
{int i,j; float s=0,l,v[3],a[5][3];
cout<<"input score\n";
for(i=0;i<3;i++)
{ for(j=0;j<5;j++)
{ cin>>a[j][i];
s=s+a[j][i]; }
v[i]=s/5;
s=0; }
l=(v[0]+v[1]+v[2])/3;
cout<<"语文,"<<v[0]<<"\n数学,"<<v[1]<<"\n化学,"<<v[2];
cout<<"\n总平均成绩,"<<l; }
分析,可设一个二维数组 a[5][3]存放五个人三门课的成绩。再
设一个一维数组 v[3]存放所求得各分科平均成绩,设变
量 l为全组各科总平均成绩。
C++程序设计课件 设计制作:徐龙琴 26
⒋ 向函数传递二维数组:
#include <iostream.h>
int maximum(int[][4],int,int);
void main()
{ int sg[3][4]={{68,77,73,86},{87,96,78,89},{90,70,81,86}};
cout <<"the max grade is " <<maximum(sg,3,4) <<endl;}
int maximum(int grade[][4],int pupils,int tests)
{ int max=0;
for(int i=0; i<pupils; i++)
for(int j=0; j<tests; j++)
if(grade[i][j]>max)
max=grade[i][j];
return max;}
例:
注意,当需要把一个二维数组传
给一个函数时, 实参 只需 写数组
名, 函数 形参 为 不带 数组 第一维
大小的二维数组, 还需要向函数
传递行数和列数 。
C++程序设计课件 设计制作:徐龙琴 27
将上例作降维处理也可写成下面的形式:
#include <iostream.h>
int maximum(int[],int);
void main()
{ int sg[3][4]={{68,77,73,86},{87,96,78,89},{90,70,81,86}};
cout <<"the max grade is " <<maximum(&sg[0][0],3*4) <<endl;}
int maximum(int grade[],int num)
{ int max=0;
for(int i=0; i<num; i++)
if(grade[i]>max)
max=grade[i];
return max;}
C++程序设计课件 设计制作:徐龙琴 28
例, 有一个 3× 4的矩阵,要求编程序求出其中值最大 的那个元素
的值,以及其所在的行号和列号。
#include <iostream.h>
void main()
{ int i,j,row=0,colum=0,max;
int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
max=a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
if(a[i][j]>max)
{ max=a[i][j];
row=i;
colum=j;}
cout<<"max="<<max<<","<<"row= "
<<row<<","<<"colum="<<colum<<endl;
}
运行结果如下:
max=10,row=2,colum=1
C++程序设计课件 设计制作:徐龙琴 29
§ 字符数组
⒈ 字符数组的定义格式:
用来存放字符型数据的数组 是 字符数组,数组中的一个
元素中只能存放一个字符,整个数组 可以存放一个字符串 。故
c++中用字符数组处理字符串。 字符数组也可以是二维或多维数
组,例如,char c[5][10];
char 数组名 [ 常量 1]
例,char c[5]={ ‘ c?,?h?,?i?,?n?,?a? } ;
C++程序设计课件 设计制作:徐龙琴 30
⒉ 字符数组初始化:
① 逐个 赋值,char ch[4]={‘ t?,?h?,?a?,?k?};
② 整体 赋值,char c [ ]={,china”};
或 char c [ ]=,china”;
c数组 长度为 5,它在内存的 存放形式为:
c[0] c[1] c[2] c[3] c[4]
c h i n a \0
c[5]
注意,字符串的长度并不包括结尾符。
C++程序设计课件 设计制作:徐龙琴 31
#include <iostream.h>
void main()
{ int i,j;
char a[ ][5]={{'B','A','S','I','C'},{'d','B','A','S','E'}};
for(i=0;i<=1;i++)
{ for(j=0;j<=4;j++)
cout<<a[i][j];
cout<<"\n";
}
}
例:
C++程序设计课件 设计制作:徐龙琴 32
⒊ 字符数组的输入及输出:
① 逐个 输入输出,char c [ ]=,thank you”;
for(i=0;i<9;i++)
printf(“%c”,c[i]);
② 整体输出,
printf(“%s”,c);
char c [ ]=,thank you”;
char c1[10 ],c2[7];
scanf(“%s%s”,c1,c2);
整体输入,
// 遇到第一个 ‘ \0?时就停止输出
输入,good morning
则,c1[ ]=“good”
c2[ ]=“morning,
char c1[10 ];
scanf(“%s”,c1);
输入,thank you
则,c1[ ]=“thank,
C++程序设计课件 设计制作:徐龙琴 33
③ 用 cin输入字符串, 与 scanf类似
例,某人名字为, Ian Aitchison”,我们可以用下面的语句输入:
char firstname [12],surname[12];
cout << "Enter name ";
cin >> firstname;
cin >> surname;
cout << "The name entered was "<< firstname << " " << surname;
执行上面的语句,若 输入 "Ian Aitchison",
输出结果如下:
The name entered was Ian Aitchison
总之,在 scanf中使用 %s或利用 cin可以 读入
一个字符串,当遇到 空格符或换行符时 就认
为字符串 结束 。 cout与 printf能 输出字符串,
直到 遇见 字符串结束标志 '\0'结束 。
C++程序设计课件 设计制作:徐龙琴 34
⒋ 字符串处理函数,
C ++提供了丰富的字符串处理函数,大致 可分为 字符串
的输入、输出、合并、修改、比较、转换、复制、搜索几类。
使用这些函数可大大减轻编程的负担。用于 输入输出的字符
串 函数,在 使用前应包含 头文件 <stdio.h>;使用 其他字符串
函数 则应 包含 头文件 <string.h>。 下面介绍几个最常用的字符
串函数。
C++程序设计课件 设计制作:徐龙琴 35
格式,puts (字符数组名 )
功能,把字符数组中的字符串输出到显示器。 即显示该字符串
① 字符串输出函数 puts
#include <stdio.h>
void main()
{char c[ ]="BASIC\ndBASE";
puts(c);
}
例,
程序运行结果如下:
BASIC
dBASE
注,puts函数中可以使用转义字符
C++程序设计课件 设计制作:徐龙琴 36
格式,gets (字符数组名 )
功能,从键盘上输入一个字符串。本函数得到一个函数值,即
为该字符数组的首地址。
② 字符串输入函数 gets
#include <stdio.h>
void main()
{char st[15];
printf("input string:\n");
gets(st);
puts(st); }
例,
input string,
c program
c program
C++程序设计课件 设计制作:徐龙琴 37
格式,strcat (字符数组名 1,字符数组名 2)
功能,把字符数组 2中的字符串连接到字符数组 1中字符串的后
面,并删去字符串 1后的串标志,\0”。本函数返回值是字
符数组 1的首地址。
③ 字符串连接函数 strcat
#include <string.h>
#include <stdio.h>
void main()
{char st1[30]="My name is ";
char st2[10];
printf("input your name:\n");
gets(st2);
strcat(st1,st2);
puts(st1); }
例,
input your name:
zhang shan
My name is zhang shan
C++程序设计课件 设计制作:徐龙琴 38
格式,strcpy (字符数组名 1,字符数组名 2)
功能,把字符数组 2中的字符串拷贝到字符数组 1中。串结束标
志,\0”也一同拷贝。字符数名 2,也可以是一个字符串常
量。这时相当于把一个字符串赋予一个字符数组。
④ 字符串拷贝函数 strcpy
#include<string.h>
#include<stdio.h>
void main()
{ char st1[15],st2[ ]="C Language";
strcpy(st1,st2);
puts(st1);
printf("\n"); }
例,
程序运行结果如下:
C Language
C++程序设计课件 设计制作:徐龙琴 39
格式,strcmp(字符数组名 1,字符数组名 2)
功能,按照 ASCII码顺序比较两个数组中的字符串,并 由函数
返回值返回比较结果。
字符串 1= 字符串 2,返回值= 0;
字符串 1>字符串 2,返回值 1;
字符串 1<字符串 2,返回值 -1。
⑤ 字符串比较函数 strcmp
C++程序设计课件 设计制作:徐龙琴 40
#include <string.h>
#include <stdio.h>
#include<iostream.h>
void main()
{ int k;
char st1[15],st2[ ]="Language";
cout<<"input a string,"<<endl;
gets(st1);
k=strcmp(st1,st2);
if(k==0) cout<<"st1=st2\n";
if(k>0) cout<<"st1>st2\n";
if(k<0) cout<<"st1<st2\n";
}
例,
程序运行结果如下:
input a string,
Chinese
st1<st2
C++程序设计课件 设计制作:徐龙琴 41
格式,strlen(字符数组名 )
功能,测字符串的实际长度 (不含字符串结束标志‘ \0?) 并作为
函数返回值。
⑥ 测字符串长度函数 strlen
#include <string.h>
#include<iostream.h>
void main()
{ int k;
char st[ ]="C language";
k=strlen(st);
cout<<"The lenth of the string is "<<k<<endl;
}
例,
程序运行结果如下:
The lenth of the string is 10
C++程序设计课件 设计制作:徐龙琴 42
#include <iostream.h>
#include <string.h>
void change(char c[],int m) //逆序存放函数
{ int i,j; char ch;
for(i=0,j=m-1;i<j;i++,j--)
{ch=c[i];
c[i]=c[j];
c[j]=ch;} }
void main()
{char s[10],ch; int n;
cout<<"input s[10]=";
cin>>s;
n=strlen(s);
change(s,n); //调用逆序存放函数
cout<<s<<endl;}
例 1:将一个字符串逆序存放并输出。假设字符数组中存放的
是 "abcdefg",则逆序后存成 "gfedcba"。
⒌ 字符 数组的应用:
分析,将已知的 字符串存放 在字符数组 s[]中,利用 strlen( )函
数求出字符串的 长度,然后利 用 一个字符型 中间变量 将
对应字符 进行交换,从而实现字符串的逆序存放。在该
程序中用 change()函数 实现字符串的逆序存放
C++程序设计课件 设计制作:徐龙琴 43
例 1,对 10个整数按由小到大排序
方法 1,冒泡法 (起泡法)
思路,将相邻两个数进行比较,将小数调到前头。
每轮比较后将一个大数“沉底”。
§ 程序举例
例如,将 2,9,7,1,6进行 冒泡排序的过程:
分析,第一轮,
第一次比较后,2,9,7,1,6
第二次比较后,2,7,9,1,6
第三次比较后,2,7,1,9,6
第四次比较后,2,7,1,6,9
第二轮:
第一次比较后,2,7,1,6,9
第二次比较后,2,1,7,6,9
第三次比较后,2,1,6,7,9
… … … …
输入 10个整数给 a 数组
for i = 1 to 9 (进行 9轮)
for j=0 to (9-i) (每轮比较次数 )
a(j) > a(j+1)
真 假
a(j)与 a(j+1)交换
输出 a 数组
C++程序设计课件 设计制作:徐龙琴 44
程序如下:
#include <stdio.h>
void sort(int a[ ],int n)
{int i,j,t;
for(i=1; i<=n-1; i++)
for(j=0; j<=n-1-i; j++)
if(a[j]>a[j+1])
{t=a[j]; a[j]=a[j+1]; a[j+1]=t;}
}
void main()
{int j,a[ 10 ]={89,76,-2,90,-35,0,56,34,123,-5};
sort(a,10);
printf("\n");
for(j=0; j<10; j++)
printf("%d ",a[j]); }
C++程序设计课件 设计制作:徐龙琴 45
方法 2,插入排序法
思路,(1)将数组中的头两个元素按排序顺序排列。
(2)把下一个元素 (第 3个 )插入到其对应于已排序元素的
排序位置。
(3)对于数组中的 其它 每个元素重复 (2)。即把第 4个元素
插入 到适当位置,然后是第 5‥‥‥
例,对 5个数,12 3 10 55 1 采用插入排序的过程:
第一轮,3 12 10 55 1
第二轮,3 10 12 55 1
第三轮,3 10 12 55 1
第四轮,1 3 10 12 55
C++程序设计课件 设计制作:徐龙琴 46
#include <stdio.h>
void isort(int a[],int size) //插入排序
{ int inserter,index;
for(int i=1;i<=size-1;i++)
{ inserter=a[i];
index=i-1;
while(inserter<a[index] && index>=0 )
{a[index+1]=a[index];
index--; }
a[index+1]=inserter;}}
int inserter,index
for i =1 to size - 1 (进行 size- 1轮)
index= i-1; inserter= a[i];
输出 a 数组
int a [size];
while(inserter<a[index] && index>=0 )
a[index+1])=a[index]);
index--
a[index+1]) =inserter
C++程序设计课件 设计制作:徐龙琴 47
方法 3,快速排序法
思路,首先 选择 一个 分界值 ( 其 确定 方法有:随机确定;或
被排序部分元素的中间值 ),把数组分成两部分, 大于等于
分界值的元素 集中到数组的某一 部分, 小于分界值的元素
集中到数组的另一部分 。 对于分出来的两部分,又分别 重
复这个过程,直到整个数组被排序完毕。
例, 设给定一个字符数组 fedacb,选定 d作为分界值,则
在第一遍划分后数组将重新安排如下:
b e d a c f
b c d a e f
b c a d e f
……
初 始 f e d a c b
第 1遍, b c a d e f
C++程序设计课件 设计制作:徐龙琴 48
void qsort(int a[],int left,int right) //快速排序法
{ int pivot,l=left,r=right,temp;
pivot=a[(left+right)/2];
while(l<r)
{ while(a[l]<pivot) ++l;
while(a[r]>pivot) --r;
if(l>=r) break;
temp=a[l];
a[l]=a[r];
a[r]=temp;
++l; --r;}
if(l==r) l++;
if(left<r) qsort(a,left,l-1);
if(l<right) qsort(a,r+1,right);
return;
}
若排序前:
a[10]= { 80,18,26,4,50,37,55,98,70,41}
则调用快速排序函数后:
pivot= a[4]=50
第一次交换完毕:
41,18,26,4,37,50,55,98,70,80
第二次交换完毕:
4,18,26,41,37,50,55,98,70,80
第三次交换完毕:
4,18,26,37,41,50,55,98,70,80
第四次交换完毕排序后的形参数组为:
4,18,26,37,41,50,55,70,80,98
C++程序设计课件 设计制作:徐龙琴 49
]A= [1 2 34 5 6 B= [1 42 53 6]
C(2× 2)=[14 3232 77]
细化
例 2,求矩阵 A(2× 3)与矩阵 B(3× 2)乘积 C=AB。
分析:
void mm (int a[][3],int arow,int acol,
int b[][2],int brow,int bcol,
int c[][2],int crow,int ccol)
{ for(int i=0; i<crow; i++)
for(int j=0; j<ccol; j++)
{ c[i][j]=0;
for(int n=0; n<acol; n++)
c[i][j]+= a[i][n] * b[n][j]; }
}
C++程序设计课件 设计制作:徐龙琴 50
#include <stdio.h>
void mm (int a[][3],int arow,int acol,
int b[][2],int brow,int bcol,
int c[][2],int crow,int ccol);
void main( )
{int a[ ][3]={1,2,3,4,5,6};
int b[][2]={ {1,4},{2,5},{3,6} };
int c[2][2],i,j;
mm(a,2,3,b,3,2,c,2,2);
for(i=0;i<2;i++)
{ for(j=0;j<2;j++)
printf(" %d",c[i][j]);
printf(" \n " ); }
}
void mm (int a[][3],int arow,int acol,
int b[][2],int brow,int bcol,
int c[][2],int crow,int ccol)
{ for(int i=0; i<crow; i++)
for(int j=0; j<ccol; j++)
{ c[i][j]=0;
for(int n=0; n<acol; n++)
c[i][j]+= a[i][n] * b[n][j]; }
}
C++程序设计课件 设计制作:徐龙琴 51
例 3,一个有趣的经典算法,出列问题,1
2
3
4
56
7
8
开始报数位置,start =0
间隔,interval =4
4 8 5 2 1 3 7
6号是胜利者!
算法要点:
有 n个人参加报数:
循环 n-1次
报数 循环, 计数 interval次
整体结构:两重循环
数组下标循环技巧:
取模
出列处理,置 0
C++程序设计课件 设计制作:徐龙琴 52
#include <iostream.h>
void main()
{ int a[8]={1,2,3,4,5,6,7,8},start,interval;
cin>>start>>interval;
for(int n = 1; ;n++)
{ int i,validCount = 0;
for(i=start; ; i++,i%=8)
{ if(a[i] != 0) validCount++;
if(validCount>=interval) break; }
cout<<a[i]<<endl;
if(n==8) { cout<<"\nNo."<<a[i]<<" boy is won.\n"; break;}
a[i] = 0;
start = i; }
}
1
2
3
4
56
7
8
C++程序设计课件 设计制作:徐龙琴 53
例 4:某班竞赛考试科目为高等数学 (MT),英语 (EN)和
物理 (PH),有 5人参加考试 。 要统计并输出一个表格,
包括学号, 各科分数, 总分, 平均分, 以及三门课均
在 90分以上者 ( 该栏标志输出为, Y”,否则为
,N”), 表格形式如下:
NO MT EN PH SUM V >90
-------------------------------------------------
1 97 87 92 276 92 N
2 92 91 90 273 91 Y
3 90 81 82 253 84 N
.....
分析:
可以将学生的学号和各科成绩放在数组 a[5][4]中, 然
后进行统计处理 。
C++程序设计课件 设计制作:徐龙琴 54
#include <stdio.h>
void main( )
{ int a[5][4],i,j,s=0;
char c;
for (i=0; i<=4; i++)
{ printf("Enter No,and score as,MT EN PH\n");
for (j=0; j<=3; j++)
scanf("%d",&a[i][j]); }
printf(" NO,MT EN PH SUM V >90\n");
printf("-------------------------------------\n");
for (i=0; i<=4; i++)
{printf("%4d:",a[i][0]);
for (s=0,j=1; j<=3; j++)
{s += a[i][j];
printf ("%4d",a[i][j]);}
if (a[i][1]>=90 && a[i][2]>=90 && a[i][3]>=90)
c='Y';
else c='N';
printf(" %d %d %c\n",s,s/3,c);}
}