讲座2-一维数组查找统计、应用举例

合集下载

8.4 一维数组应用举例_C语言程序设计_[共2页]

8.4 一维数组应用举例_C语言程序设计_[共2页]
函数 fun( )的函数体重定义了一个 b 数组,在调用 fun( )函数时,系统为它开辟一串连续的元 素,b 是一个地址常量,不可对它重新赋值。虽然 a 和 b 有相同的说明形式,它们一个是作为形 参的指针,一个是函数体内定义的数组,具有完全不同的含义。
在函数 fun( )执行完毕,返回主函数时,系统释放 a 和 b 所占存储单元,指针变量 a 和数组 b 将不再存在。因此,函数 fun( )不应把 b 的值作为返回值,这样做,主函数中的指针变量 p 将不 指向任何对象而成为“无向指针”。
8.4 一维数组应用举例
【例 8-9】从键盘输入 10 个数,用起dio.h> int main() {
int a[10];
int i,j,tem;
for(i=0;i<=9;i++)
{
printf("请输入第%d 个数:",i+1);
scanf("%d",&a[i]);
}
for(i=9;i>0;i--)
//请注意这句!
for(j=0;j<i;j++)
if(a[j]>a[j+1])
{ tem=a[j];
a[j]=a[j+1];
189
第 8 章 数组
b 数组的开头。
#include<stdio.h> #define N 10 int *fun(int a[N],int n) {
int b[N]; return b; } void main() { int w[N]; p=fun(w,N); }
以上程序涉及几个概念。
在函数 fun( )中,形参 a 在形式上写作为 a[N],实际上它也可以写作 a[]或*a。但无论写成哪 种形式,C 编译程序都将其作为一个指针处理。在调用 fun 函数时,系统只为形参 a 开辟了存储 单元,并把 main( )函数中 w 数组的起始地址存入其中,使它指向 w 数组的首地址。因此,在 fun( ) 函数中,凡是指针变量可以参与运算,形式指针 a 同样可以参与,如可以进行 a++的操作,使它 移动去指向 w 数组的其他元素,还可以通过赋值语句使它不再指向 w 数组的元素。

一维数组(C语言)ppt课件

一维数组(C语言)ppt课件

printf(“\n〞);
}
B、运用getchar putchar getch getche函数。
字符数组
〔2〕将整个字符串一次输入或输出。用%s格式符。 例:char c[ ]=“china〞; printf(“%s〞,c);
结果为:china
留意: A、输出字符不包括终了符‘\0’; B、用%s格式符输出字符串时,printf 函数中的输出项是字
printf(“请输入数字字符串:〞); Scanf(“%s〞,str);
strlen(str)
main( ) {
insert(str)
char str[10]; scanf(“请输入
数字字符串:%s\n〞,&str);
insert(str);
}
char str[ ]; { int i1;
for(i1=strlen(str[10]);i1>0; i1--) {
一维数组
4、数组元素的初始化 普通方式为:
类型名 数组名[整型常量表达式]={常量1,常量2,…}
例:int a[10]={1,2,3,4,5,6,7,8,9,10}; 该语句定义了一个动态数组,并对该动态数组进展了初始化。
留意: 1、所赋初值的类型必需与阐明的类型一致。 2、在指定初值时,第一个值赋给下标为0的元素。 3、不能够跳过前面的元素给后面的元素赋初值。
scanf(" %d",&a[i]); printf(" \nyou input is :"); for (i=0;i<10;i++) printf(" %d, ",&a[i]); }
一维数组

一维数组的定义,赋值,遍历PPT教学课件

一维数组的定义,赋值,遍历PPT教学课件
一维数组
2020/12/09
1
主要内容
• 一维数组的定义 • 一维数组元素的引用 • 一维数组的初始化和赋值
• 一维数组的遍历
• 一维数组元素的查找 • 一维数组元素的排序
2020/12/09
2
一维数组的定义

2020/12/09
3
一维数组的定义
• 定义数组的语法: int a[10]; 数据类型说明符 数组名[数组长度];
2020/12/09
15
例题:从键盘输入10个整数存放在数组中,
找出其中最大的一个数,输出该最大数。
解法1:记下最大数其值 main() {
int i, max,a[10]; printf("enter data:\n"); for(i=0;i<10;i++) scanf("%d", &a[i]); max=a[0]; //假定a[0]的元素最大 for(i=1;i<10;i++)
if(a[i]>max) max=a[i];
printf(“最大数是%d\n", max); }
2020/12/09
解法2:记下最大数相应的下标 main() {
int i, max_id,a[10]; printf("enter data:\n"); for(i=0;i<10;i++) scanf("%d", &a[i]); max_id=0; //假定下标为0的元素最大 for(i=1;i<10;i++)
(3)不能对整个数组初始化; int data[5]=1; 错误,应为: int data[5]={1,1,1,1,1};

《一维搜索方法》课件

《一维搜索方法》课件

1
原理
根据斐波那契数列生成黄金分割比例,用于确定搜索范围的分割点。
2
思路
根据斐波那契数列的值,确定左右指针在搜索范围内的位置,直到找到最接近目 标值的点。
3
优缺点
迭代次数逐渐趋近于黄金分割点,但对搜索范围要求较高。
黄金分割法搜索方法的原理和思路
1
原理
将搜索范围按黄金分割点分割,选择较小的一部分作为新的搜索范围。
2
思路
通过反复按黄金分割点计算和调整搜索范围,逐步逼近最接近目标值的点。
3
优缺点
迭代次数相对较少,但需要较复杂的计算公式。
三分搜索方法的原理和思路
1
原理
将搜索范围分割为三等份,并判断目标值位于左、中、右三个部分,逐步缩小搜索范 围。
2
思路
根据目标值与分割点的大小关系,决定下一步搜索的范围,直到找到最接近目标值的 点。
3
优缺点
对于非单调函数,能更快地找到目标值,但需要较多的判断。
多点搜索方法的原理和思路
1
原理
同时使用多个起始点进行搜索,通过不断比较找到最接近目标值的点。
2
思路
根据多个起始点的初始值和搜索步长,逐步调整并比较得到最优解。
3
优缺点
相比于单点搜索,能更准确地找到目标值,但需要同时处理多个起始点的迭代。
2
思路
从起始点开始,依次向右增加或向左减小搜索范围,直到找到最接近目标值的点。
3
优缺点
简单易懂,但需要较多的迭代次数。
二分搜索方法的原理和思路
1
原理
将搜索范围一分为二,并判断目标值位于左半部分还是右半部分,逐步缩小搜索 范围。
2
思路

第十讲+一维数组与查询统计

第十讲+一维数组与查询统计


关键程序段:
int c[11]={0}; for (j=1;j<=20;j++) { scanf(“%d”, &s); //输入成 绩 k=s/10; //整除 c[k]=c[k]+1; //累加
五、分段统计
[例6] 输入20名学生一门课的考试成绩,然后统计出0~9, 10~19, 20~29,…., 80~89, 90~99, 100 各分数段的人数。
重点:统计有关算法 难点:插入排序法
一、顺序查找法
假设数组a[0]、a[1]、…、a[N-1]中保存有N个数据,从中 查找一个数据F。若F在数组a中存在,则显示元素下标; 若不存在,显示不存在信息。 顺序查找法:
从数组第1个元素依次向后与要找的数据F比较;若相同,则查找结 束;若不相同,则继续查找,直至数组最后一个元素。若所有元素均 不等于F,则说明F不在数组a中。
如果F>a[k] a[k] 如果F<a[k] a[k]
a[0] a[1]
a[k]
a[N-1]
b
k
b
k
e
k
ห้องสมุดไป่ตู้
e
二、二分查找法
[例2]随机产生100个0~99的随机整数存于数组中, 升序排序后显示于屏 幕上。然后从键盘输入一个数,用二分法查找其在数组中的位置。
随机产生100个100以内的整数并存于数组a中 把数组a中的数按升级排序 把数组a中的数按下标次序显示 死循环 等待从键盘输入要找的数存于F F<0 是 break b=0; e=99; found=0; k=b+(e-b)/2 a[k]==F 否 是 a[k]<F 是 found=1; b=k+1 b<=e found==0 break; 是 显示元素下标

专题5 一维数组和二维数组的概念及基本应用

专题5 一维数组和二维数组的概念及基本应用

A) 3
B) 6
C) 10
D) 20 D
5.有以下程序 [08年4月]
main()
{ int s[12]={1,2,3,4,4,3,2,1,1,1,2,3},c[5]={0},i;
for(i=0;i<12;i++) c[s[i]]++;
for(i=1;i<5;i++) printf(“%d”,c[i]);
if(a[j]<a[k]) k=j; t=a[k];a[k]=a[i];a[i]=t; } printf(“排序结果为:\n”); for(k=0;k<6;k++) printf(“%d”,a[k]); }
例2 用交换排序法对数据升序排序,请填空 #inlcude<stdio.h> main() { int a[5]={4,6,1,3,9} i, t; for(i=0;i<5;i++)
for(j=0;j<4-i;j++) if(a[j]>a[j+1]) {t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
printf(“排序结果为:\n”); for(i=0;i<5;i++)
printf(“%d”,a[i]);}
假设有5个数
98888 89666 66944 44493 33339
1 一维数组
数组是c语言中一种最简单的构造类型,每个定义好的数组包含一组同一 类型的变量,这些变量在内存中占有连续的存储单元,在程序中这些变量具 有相同的名字,但具有不同的下标,数组要先定义后使用。
1.1 一维数组定义的一般形式

C++ 一维数组的使用

C++ 一维数组的使用

概念
数组的维数
这批类型相同的数据在排列上会有各种形式,比如排成一行 ,排成一片(矩阵),或者一堆(立方体),数组不仅要通过 下标区分它们,还要描述出位置信息,这可以通过定义数组 的维数来进行。 一维数组用于描述一行或者一列数据
数列 75 一维数组 a[0] a[1] a[2] a[3] a[4] a[5] 78 83 72 69 63
当采用定义时就赋值这种初始化形式时,数组长度应不小于初始化数据个数 ,否则编译出错。 比如 int a[2]={1,2,3,4}; 是错误的
一维数组
数组元素的输入输出
只能通过对每个元素进行操作来完成数据的输入、访问和输出 通常用循环结构来完成对每个元素的操作,循环控制变量既控制循环,又作 为数组元素的下标来使用。 int a[5]; 下面三种方式都可以实现对每个元素的访问 输入: for(int i=0;i<=4;i++) cin>>a[i]; 访问: for(int i=0;i<5;i++) sum+=a[i]; 输出: for(int i=1;i<=5;i++) cout<<a[i-1]; 循环控制变量 i 既控制循 环次数,也代表当前操作 元素的下标,所以习惯从0 开始,到最后一个元素的 下标结束。
一维数组
一维数组的应用
逆序 求最大(小)值 排序 比较互换法、选择法、冒泡法 插入(删除) 查找 一般查找、对分查找
一维数组的应用
将一个整数序列的数据对半交换并输出
对半交换,即第一个和最后一个呼唤,第二个和倒数第二个呼唤,依次类推,直到所有数据都完 成位置移动。 关键: 如果数据为n个,则只要执行 n/2 次交换过程即可,否则就又被换回来了。 int a[10]={1,2,3,4,5,6,7,8,9,10}; cout << "原始序列:"; for(int i=0;i<=9;i++) { cout << a[i]<<" "; } for(i=0;i<=10/2-1;i++) { int t=a[i]; a[i]=a[10-1-i]; a[10-1-i]=t; } cout << "交换后序列:"; for(i=0;i<=9;i++) { cout << a[i]<<" "; }

一维数组,二维数组演示课件

一维数组,二维数组演示课件
int n; scanf(“%d”,&n); int a[n];
12
6.2.2 引用一维数组的元素
➢ 必须先定义数组,才能引用数组中的元素 ➢ t=a[3],将a数组中序号为3的元素的值赋给变量t。 ➢ 只能逐个引用数组元素而不能一次引用整个数组中的
全部元素。 b=a[2];c=a[5]; printf(“%d,%d,%d,%d,%d,%d\n”,a);
16
#include <stdio.h> void main() { int i,a[10];
for(i=0;i<=9;i++) a[i]=i;
for(i=9;i>=0; i--) printf("%d ",a[i]);
printf("\n"); }
使a[0]~a[9]的值 为0~9
先输出a[9],最后输 出a[0]
6.2.1 定义一维数组 6.2.2 引用一维数组的元素 6.2.3 一维数组的初始化 6.2.4 一维数组程序举例
8
6.2.1 定义一维数组
一维数组是最简单的数组。
数组元素只有1个下标—一维数组,s[5],相当于“线”。 数组元素有2个下标—二维数组,s[1][2],相当于 “面”。 数组元素有3个下标—三维数组,s[2][4][3],相当于 “体”。
448 2 2
a[3]
222 8 0
a[4]
000 0 8
a[5]
999 9 9
27
for(i=0;i<3;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; }

19一维数组的查找

19一维数组的查找

练习题1:
定义一个一维字符数组cnum, 再从键盘上 , 定义一个一维字符数组 输入一个字符ch, 输入一个字符 ,查找数组中是否有字符 相等。 与ch相等。如果有,输出相应的下标;如 相等 如果有,输出相应的下标; 果没有,输出“该字符在数组中不存在” 果没有,输出“该字符在数组中不存在” 。
练习题2:
#include <stdio.h> main() { int num[10], x, i, j; for(i=0; i<10; i++) scanf("%d", &num[i]); printf(“input x:”); scanf("%d", &x); for(i=0; i<10; i++) if (num[i]==x) //找到了 找到了 break;(continue 输出 输出i-1) if(i==10)//没有找到 没有找到 printf(“该数在数组中不存在 "); 该数在数组中不存在 else printf(“该数在数组中的下标是 该数在数组中的下标是%d”,i); 该数在数组中的下标是 }
一维数组元素的查找 一维数组元素的查找
一维数组元素的查找 一维数组元素的查找
思路与实现:利用循环遍历数组中的 思路与实现: 元素, 元素,在遍历的过程中比较要查找的 数与数组元素是否相等,若相等, 数与数组元素是否相等,若相等,输 出下标,若到数组末尾都未找到, 出下标,若到数组末尾都未找到,则 显示没有找到。 显示没有找到。
一维数组元素的查找 一维数组元素的查找
例:定义一个一维数组num, 再从键盘 定义一个一维数组 , 上输入一个整数x, 上输入一个整数 ,查找数组中是否有元 素的值与x相等 如果有, 相等。 素的值与 相等。如果有,输出相应的下 如果没有,输出“ 标;如果没有,输出“该值在数组中不存 在” 。

一维数组应用实例

一维数组应用实例

一维 应用
实例一 分类统计
例【7-1】利用一维数组统计一个班学生的成绩在0-9、10-19、20 99以及100各分数段的人数分布
解题思路:定义一个有11个元素的一维数组a( 0 to 10),
a(0):0-9分的学生人数;
a(1):10-19分的学生人数;
a(2):20-29分的学生人数;

Dim num1 As Integer, num2 As Integer
A = Split(Text1.Text, ",")
N = UBound(A)
num1 = 0: num2 = 0
For i = 0 To N
Select Case Val(A(i))
Case Is < 60
num1 = num1 + 1
7

第三轮排序结果
1
1
6
7
9
8
直接选择法排序
“求值”按钮Command1的Click事件过程:
Private Sub Command1_Click() Dim A, N As Integer Dim MaxNum As Integer, MinNum As _ Integer, Average As Single A = Split(Text1.Text, “,”) N = UBound(A) Total = 0 MaxNum = Val(A(0)) MinNum = Val(A(0))
8
1
9
7
6
1
1
直接选择法排序
A(1) A(2) A(3) A(4) A(5) A(6)
第一轮(3) k=2, a(2)与 a(1)交换

数组的基本概念一维数组二维数组字符数组数组的应用举例

数组的基本概念一维数组二维数组字符数组数组的应用举例

但变量间不存在确定的相互关系。
数组的概念引入
用基本数据类型可以解决所有问题吗? 例如:对某班学生的成绩按由高到底的次序进行排序。
3 名?
30 名?
数组的基本概念
数组:一种常用的构造型数据类型。 由具有固定数目 相同类型 的元素按一定顺序排列。
特点: 1、数组元素的个数是确定,不可改变,元素值可变 2、数组元素的类型必须相同,不允许混合。
判断
错误: int n=5; int a[n]; 正确: #define N 5 int a[N];
正确: int a[10], b[5][4]; char name[8], ch[2][3]; float x[8*2+1], table[2][3][4]; #define NUM 40; int a[NUM], b[NUM+2];
比较n-2次
这种排序方法之所以叫“冒泡法”,是因为在排序过程 中,较小的数象气泡一样逐渐往前冒(向上冒),大的 数逐渐向后沉,最终完成排序。
起泡排序
对具有n个元素的序列按升序进行起泡排序的步骤: • 首先将第一个元素与第二个元素进行比较,若为 逆序,则将两元素交换。然后比较第二、第三个 元素,依次类推,直到第n-1和第n个元素进行了 比较和交换。此过程称为第一趟起泡排序。 经过第一趟,最大的元素便被交换到第n个位置。 • 对前n-1个元素进行第二趟起泡排序,将其中最大 元素交换到第n-1个位置。 • 如此继续,直到某一趟排序未发生任何交换时, 排序完毕。对n个元素的序列,起泡排序最多需要 进行n-1趟。
定义时赋值
1、对数组的全部元素赋初值。 int a[3]={3,6,9}; a[0]=3; a[1]=6; a[2]=9; 2、对数组的部分元素赋初值。 int a[4]={3,6,9} ; a[0]=3; a[1]=6; a[2]=9; a[3]=0; 3、对全部数组元素赋初值时,可以不指定数组长度。但若提供 初值的个数与定义的数组长度不一样,则数组长度不能省略。 int a[]={3,6,9}; int a[3]; a[0]=3; a[1]=6; a[2]=9;

一维数组的使用

一维数组的使用

⼀维数组的使⽤1.什么是数组?数组是⼀种特殊的类型,数组的"地址"是⾸地址,他的值也是⾸地址。

虽然值相同但是类型是不同的。

1.1如何定义⼀个数组/**** @author sadfoo @date 2018年8⽉31⽇* @tips:数组申明、遍历*/public class TestArray {public static void main(String[] args) {// 数组申明或者定义有2种⽅式:// 数组申明String[] names;// 第⼀种:静态初始化,初始化数组与给元素赋值同时进⾏names = new String[] { "数组001", "数组002", "数组003" };// 数组申明int score[];// 第⼆种:动态初始化,初始化数组与给元素赋值分开进⾏score = new int[4];// 通过数组元素下⾓标调⽤,数组从0开始,n-1结束(n表⽰数组的长度)score[0] = 87;score[1] = 88;score[3] = 99;// 数组的长度,通过数组的length属性来调⽤System.out.println("names的分配空间长度为:" + names.length);System.out.println("score的分配空间长度为:" + score.length);// 如何遍历数组元素// NO1:直接打印脚标遍历(累赘)System.out.println("我是names第⼀种数组遍历⽅式:");System.out.println(names[0]);System.out.println(names[1]);System.out.println(names[2]);System.out.println("我是score第⼀种数组遍历⽅式:");System.out.println(score[0]);System.out.println(score[1]);System.out.println(score[3]);// NO2:循环⽅法遍历(优选)System.out.println("我是names第⼆种数组遍历⽅式:");for (int i = 0; i < names.length; i++) {System.out.println(names[i]);}System.out.println("我是score第⼆种数组遍历⽅式:");for (int i = 0; i < score.length; i++) {System.out.println(score[i]);}}}遇到问题:数组下标越界异常1.2默认初始化值// 对于基本数据类型:byte、short、int、long⽽⾔,初始默认值为:0 byte[] bt = new byte[6];// 假设赋⼀个值bt[0] = 90;bt[5] = 99;for (int i = 0; i < bt.length; i++) {System.out.println("byte默认值为:" + bt[i]);}// 对于基本数据类型:float、double⽽⾔,初始默认值为:0.0float[] ft = new float[7];// 假设赋⼆个值ft[1] = 12f;ft[3] = 12f;for (int i = 0; i < ft.length; i++) {System.out.println("float默认值为:" + ft[i]);}// 对于基本数据类型:char⽽⾔,初始默认值为:空格char[] cr = new char[8];for (int i = 0; i < cr.length; i++) {System.out.println("char默认值为:" + cr[i]);}// 对于基本数据类型:boolean⽽⾔,初始默认值为:falseboolean[] bl = new boolean[9];for (int i = 0; i < bl.length; i++) {System.out.println("boolean默认值为:" + bl[i]);}// 对于引⽤类型的变量构成的数据⽽⾔,初始默认值为:null// 数组申明String[] sr = new String[10];sr[0] = "AA";sr[1] = "BB";sr[3] = "DD";for (int i = 0; i < sr.length; i++) {System.out.println("引⽤类型默认值为:" + sr[i]);}1.3数组练习题import java.util.Scanner;/**** @author sadfoo @date 2018年9⽉1⽇* @tips:练习⼀维数组的使⽤*/public class TestStudentScore {@SuppressWarnings("resource")public static void main(String[] args) {/*** 从键盘读⼊学⽣成绩,找出最⾼分,并输出学⽣成绩等级, 成绩>=最⾼分-10:等级为'A' ,成绩>=最⾼分-20:等级为'B', * 成绩>=最⾼分-30:等级为'C' ,其余:等级为D*/// 创建scanner对象,并从键盘获取学⽣的个数nScanner sc = new Scanner(System.in);System.out.println("请输⼊学⽣的个数:");int count = sc.nextInt();// count⽤来记录学⽣的个数// 根据输⼊的学⽣个数n,创建⼀个长度为n的int型数组int[] scores = new int[count];int maxScore = 0;// 依次从键盘获取n个学⽣的成绩,并赋给相应的数组元素,并获取n个学⽣的最⾼分System.out.println("请依次输⼊"+count+"个学⽣的成绩:");for (int i = 0; i < scores.length; i++) {int score = sc.nextInt();// 依次从键盘获取学⽣的成绩scores[i] = score;if (scores[i] > maxScore) {maxScore = scores[i];}}// 遍历学⽣成绩的数组,并根据学⽣成绩最⾼分的差值赋予相应的等级并输出System.out.println("最⾼分值为:" + maxScore);for (int i = 0; i < scores.length; i++) {char level;if (scores[i] > maxScore - 10) {level = 'A';} else if (scores[i] > maxScore - 20) {level = 'B';} else if (scores[i] > maxScore - 30) {level = 'C';} else {level = 'D';}System.out.println("student " + i + ",score is " + scores[i] + ",grade is " + level);}}}/**** @author sadfoo @date 2018年9⽉1⽇* @tips:求⼀个⼆维数组⾥所有数之和*/public class TestGetSum {public static void main(String[] args) {// 创建⼀个⼆维数组并赋值(根据情况采⽤静态还是动态赋值)int[][] m = new int[][] { { 1, 2, 3 }, { 4, 5 }, { 6 } };// 创建sum记录总和int sum = 0;//遍历数组for (int i = 0; i < m.length; i++) {for (int j = 0; j < m[i].length; j++) {System.out.println(m[i][j] + "\t");sum += m[i][j];}System.out.println();}System.out.println("所有⼆维数组的和值尾:"+sum);}}。

一维数组及其应用优秀课件

一维数组及其应用优秀课件
一维数组及其应用优秀课件
一为什么要使用数组
§两个数中得到最 大值?
§If (a>=b) max=a; § else max=b;
§三个数中得到最 大值?
§max=a; §If (max<=b) max=b ; §If (max<=c) max=c
§四个数中得到最 大值?
§max=a; §If (max<=b) max=b ; §If (max<=c) max=c ; §If (max<=d) max=d
程序举例
#include <stdio.h>
#define SIZE 10 例 读10个整数存入数组m,ain找()出其中最大值和最小值
{ int x[SIZE],i,max,min;
printf("Enter 10 integers:\n");
for(i=0;i<SIZE;i++)
步骤:
{ printf("%d:",i+1);
F11 F21 Fn Fn1 Fn2
(n1) (n2) (n3)
#include <stdio.h> main() { int i;
int f[20]={1,1}; for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1]; for(i=0;i<20;i++) { if(i%5==0) printf("\n");
1. 输入:for循环输入10个整数 scanf("%d",&x[i]);
2. 处理:
}
(a) 先令max=min=x[0] max=min=x[0];

一维数组统计指定整数个数

一维数组统计指定整数个数

要统计一维数组中指定整数的个数,可以使用循环遍历数组,并检查每个元素是否与指定整数相等。

以下是一个简单的Java程序,演示如何实现此功能:
java
public class CountDistinctElementsInArray {
public static void main(String[] args) {
int[] arr = {6, 10, 5, 4, 9, 120, 4, 6, 10};
int target = 6; // 要统计的整数
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
count++;
}
}
System.out.println("数组中指定整数(" + target + ")的个数为:" + count);
}
}
在这个程序中,我们定义了一个整数数组arr,并指定要统计的整数为6。

然后,我们使用一个循环遍历数组中的每个元素,如果当前元素等于指定整数,则将计数器count加1。

最后,输出计数器的值即可。

一维数组的应用(下)

一维数组的应用(下)

第7章 数组——一维数组典型案例
C语言程序设计
例:已知有序的整型数组
a[10]={1,30,50,200,900},试编写一程序
输入一个整数并将其插入到数组的合适位置,确保插入后
数组的元素仍然有序。 情况分类:
当插入1000,则 1,30,50,200,900,1000 当插入100, 则 1,30,50,100,200,900 当插入-10, 则 -10,1,30,50,200,900
思考:
C语言程序设计
在有序的数列中插入若干个数,使数列在插入过程中 始终保持有序。
C 语言程序设计
谢谢大家!
输入一个整数s并ca将n其f("插%入d"到,&数da组ta的); 合适位置,确保插入后 for(i=n-1;i>=0; i--)
数组的元素仍{然有i序f(a。[i]>data)
a[i+1]=a[i];
else
break; }
a[i+1]=data;
n=n+1; }
第7章 数组——一维数组简单应用
C 语言程序设计
第7章 数组 ——一维数组的应用(下)
主讲人:王 燕
第7章 数组——定义: 元素类型名 数组名[常量表达式]
例:int a[5];
例: 已知有序的整型数组a[10]={1,30,50,200,900},从键 盘输入一个整数并将其插入到数组的合适位置,确保 插入后数组的元素仍然有序。
第7章 数组——一维数组典型案例
C语言程序设计
main( ) 例:已知有序的{ 整型in数t a组[10]={1, 30, 50, 200, 900};
a[10]={1,30ip,n5rti0ni,,t2fd0("a0Pt,al9e,0an0s=}e5,;in试pu编t写a 一int程eg序er:");
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
例题1:查找x(1)
给定一列数组,在数组中查找数据x,如果x存在于数组中,则输出x的
位置,否则输出-1。
例题分析: 本题采用枚举法,从数组的第一个元素开始逐一比较,查找当前元素是否和x相同, 如果相同,则记录当前元素的位置并退出循环,直至循环结束。方便起见,可以将
3、其他应用
JSOI2018江苏省信息学奥林匹克冬令营
例题9:猴子选大王
例题分析:
有了数组工具,我们可以使用数组来模拟猴子选大王的过程。定义一个含m个元素的数 组monkey来记录猴子的状态。用元素下标代表猴子的编号,元素的值表示猴子的状态:
monkey[k]=0表示第k只猴子仍在圈中;monkey[k]=1则表示第k只猴子已经出圈。
位置的初始值记为-1。这种从头开始,逐一枚举的查找方法称为顺序查找法。
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
例题2:查找x(2)
给定一列数组,在数组中查找数据x,如果x存在于数组中,则输出x的
个数,否则输出0。
例题分析: 本题和上题的区别在于数组中可能存在多个x,这时候不管有没有找到x,都需要将 数组完整地扫描一遍。初始时,记x的个数s为0,每找到一个x,则s++,扫描完毕
次数 1 2 3 4 5 6 7 8 9 10
猜数
提示
500

750

625

562

531

516

508

504

502

503

1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
二分查找
如果待查找的元素是有序的,一般我们采用二分查找法来查找元素。
二分查找又称折半查找,其基本思想是:
1. 将n个元素分成大致相等的两部分,取a[n/2]与x做比较; 2. 如果x=a[n/2],则找到x,算法中止; 3. 如果x<a[n/2],则只要在数组a的左半部分查找x; 4. 如果x>a[n/2],则只要在数组a的右半部分查找x。
//如果left=right,表示没有找到。
//记住:right所在的位置是取不到的!
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
二分查找的平均查找长度
已知一个有序表为(13 18 24 35 47 50 62 83 90 155 134),当用
二分法查找算法进行元素搜索时,成功的平均查找长度是多少?
3、其他应用
JSOI2018江苏省信息学奥林匹克冬令营
例题8:求1~N之间的质数
输入格式:一个数n(1<n<1000000)
输出格式:以空格隔开的素数 输入样例:10 输出样例:2 3 5 7
例题分析: 判断一个数是否为素数一般用循环结构解决。求范围内的素数可以枚举范围内的每一个
数,判断它是否为素数。还有没有更高效的做法?
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
例题3:找出第二小的数(NOIP2014提高组初赛)
if (S[1] < S[2]) FirstMin = S[1], SecondMin = S[2]; else FirstMin = S[2], SecondMin = S[1]; 在最坏情况下,该算法需要做
50
3、其他应用
JSOI2018江苏省信息学奥林匹克冬令营
例题8:求1~N之间的质数
算法设计: 1. 初始化数组a的元素值都为0, 假设它们都是素数; 2. a[1]=0,1既不是素数,也不是合数; 3. 循环枚举2~sqrt(n)+1,如果当前的数没有被删除,它就是素数;如果当前数是素 数,则删除该素数的所有<=n的倍数,即令a[i]=1; 4. 循环枚举2~n,输出所有值为零的元素下标。
JSOI2018江苏省信息学奥林匹克冬令营
例题9:猴子选大王
M只猴子要选大王,选举办法如下:所有猴子按1…M编号围坐一圈,
从第1号开始按顺序1,2,…,N报数,凡报到N的猴子退出到圈外,如 此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王。M和N由 键盘输入,打印出最后剩下的那只猴子的编号。
输入样例:8 3 输出样例:7
第二讲 数组应用
目录
JSOI2018江苏省信息学奥林匹克冬令营
1、查找元素
2、数值统计 3、其他应用
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
查找元素
在一列数组元素中按要求查找元素是数组应用中的基本操作,也是很
多较复杂题的重要组成部分。按照题目要求的不同,查找可以分为各
种不同种类,这里主要解决两类查找问题: 1. 查找确定的元素 2. 查找最大的元素
目录
JSOI2018江苏省信息学奥林匹克冬令营
1、查找元素
2、数据统计 3、其他应用
2、数据统计
JSOI2018江苏省信息学奥林匹克冬令营
数据统计
统计学是一门收集、处理、分析、解释数据并从数据中得出结论
的科学。常见的统计方式包括求总数、求平均数、求中位数、求众数
等。由于参与统计的数据通常比较多,所以数组是统计类题目里不可 或缺的工具。
(2) 求考试成绩平均分,并输出; (3) 枚举学生成绩,输出高于平均分的学生学号和成绩。
2、数据统计
JSOI2018江苏省信息学奥林匹克冬令营
例题5:求众数
所谓众数,就是是一组数据中出现次数最多的数,比如,3 3 4 4 4 5 6 6 8 8 9 这
列数中,众数就是4。有时候,在一组数中有好几个众数。
分析:可以画一个表格模拟查找的过程。
下标 数值
0 13
4
1 18
3
2 24
2
3 35
4
4 47
3
5 50
1
6 62
4
7 83
3
8 90
2
9 10 155 134
4 3
查找
所以,总的查找次数是 1*1+2*2+3*4+4*4=33, 平均查找长度是 33/11。
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
JSOI2018江苏省信息学奥林匹克冬令营
p=0; for (int i=1; i<=m-1; i++) { while (k<n) { p++; if (p>n) p=1; if (a[p]==0) k++; } a[p]=1; k=0; }
ASL=∑Ki / n = ((1+n)*n/2)/n = (1+n)/2
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
讨论:猜数
这是一个猜数游戏,一位同学默想一个小于1000的正整数,让另一个
同学去猜,然后给出大或者小的提示,采取什么样的策略才能让猜的
次数尽量少呢?
一般我们会采用二分的策略,假如要猜得的数是503,猜数过程如下:
3、其他应用
JSOI2018江苏省信息学奥林匹克冬令营
例题8:求1~N之间的质数
参考程序段: memset(a, sizeof(a), 0); for (int i=2; i*i<=n; i++) if (a[i]==0) for (int j=2; i*j<=n; j++) a[i*j]=1;
3、其他应用
5. 回到1,在新的区域里查找x。
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
参考程序段
left=1; right=1000; k=0; while (left<right) { mid=(left+right)/2; k=++k; if (mid==x) break; else if (mid>x) right=mid; else left=mid+1; } cout<<k; //这里采取左闭右开的写法,即右边的数不在范围内
程序采用模拟的方法,开始时设置报数变量k的值为0,当前报数猴子的编号变量p的初 值也置为0,如果当前猴子在圈中,则报数,当报数达到n时,对当前报数的猴子作出圈
处理,即monkey[p]置1,同时k清0,然后进行下一轮报数。报数过程循环m-1次,删
除m-1只猴子后,剩下的那只猴子就是选出的大王。
3、其他应用
目录
JSOI2018江苏省信息学奥林匹克冬令营
1、查找元素
2、数值统计 3、其他应用
3、其他应用
JSOI2018江苏省信息学奥林匹克冬令营
例题6:转换二进制
众所周知,整数的十进制转换成二进制采用的是“除2取余,按权展开,
倒序排列”的方法。现给出一个十进制数,保证它在整数(integer) 范围内,请你将它转换成二进制数。

A. 2n
)次比较。
for (i = 3; i <=n; i++) if (S[1] < SecondMin) if (S[1] < FirstMin) SecondMin = FirstMin ,FirstMin = S[1] ; else SecondMin = S[1] ;
B. n-1
C. 2n-3 D. 2n-2
后,输出s的值即可。
1、查找元素
JSOI2018江苏省信息学奥林匹克冬令营
平均查找长度
为确定元素在数组中的位置,关键字和给定值进行比较的比较次数的期望值称为查
找算法在查找成功时的平均查找长度(ASL)。对于含有n个数据元素的查找表,查
相关文档
最新文档