C语言程序设计教程 第08章 一维数组的应用
一维数组及其应用
x = linspace(1,5) s = [2,5,9] a = x(s)
引用一维数组x中的第2、5、9个元素, 将其赋值给变量 a
b = x(end:-1:1)
c = x(1:2:end) d = x(2:2:end)
b=? c=?d=?
4、一维数组中子数组的赋值
x = linspace(1,5) x([1,4]) = [2,7]
4、一维数组的逻辑运算
逻辑运算可以在标量与标量,数组与数组,标量与数组间进行
a = [0, 1, 2, 0, 3], b = [4, 5, 0, 0, 6], c = 7
逻辑运算 与 或 非 异或 运算符 a&b a|c ~a 函数形式 and(a, b) or(a, c) not(a) xor(a, b) 结果 [0, 1, 0, 0, 1] [1, 1, 1, 1, 1] [1, 0, 0, 1, 0] [1, 0, 1, 0, 0]
x
2134
0.2346
x(1)
x(2)
x(1,1)
x(2,1)
… 6.555
…
… x(k)
… 一维编号
… x(k,1)
… 二维编号
3、标量(scalar)
一个数,称为标量,在Matlab中看作为 1 X 1 矩阵(二维数组)
a=
2134
在matlab中,使用a(1)和a(1,1)都可以访问变量a
Matlab中,标量和向量一般用小写字母表示
x = linspace(1,5) s = [1,4] a = [2,7] x(s) = a
将2、7分别赋值给x的第1、4个元素
5、利用空数组进行赋值可以修改数组的大小
(1)执行如下赋值语句:
C语言 第八讲 一维数组
• 数组名是数组变量在内存中的起始地址, 定义了数组之后,这个地址固定,相当 于一个地址常量。
int a[10]; printf(“%d”,a); printf(“%d”,&a[0]);
int a[ ]={1,2,3,4,5}; int a[5]={1,2,3}; int a[ ]={1,2,3};
2、一维数组在程序中赋值 只有初始化的时候能对数组整体赋值, 其他时候必须对数组元素单独赋值。
int a[5]; a={1,2,3,4,5}; a[5]={1,2,3,4,5};
逐个赋值 float a[4]; a[0]=1.23;a[1]=3.4; a[2]=5.32;a[3]=3.67; 用循环语句赋值 例:将数组a的各元素赋值为奇数序列 int a[10],i; for(i=1;i<10;i++) a[i]=2*i+1;
第八讲 一维数组及应用
主要内容
一维数组的定义和引用 一维数组的赋值 一维数组的应用举例
• 数组:是相同类型变量的有序集合。 • 元素:一个数组里集合了多个数据对象, 这些数据对象被称为数组中的元素。 • 数组中的每一个元素用统一的数组名称 和下标来唯一确定。 数组元素表示形式: 数组名[下标] • 数组名:合法的标识符 • 下标:元素在数组中的位置,数组的下 标从0开始。 • 数组长度:数组中的元素个数
一维数组的定义和引用
1、一维数组的定义 当数组中每个元素都只带有一个下标 时,这个数组就被称为一维数组。
数据类型 数组名[常量表达式]; 例如:int a[6];
C语言程序设计ppt数组
达数组中打头元素旳地址
2024/10/10
6
8.2.1 一维数组旳申明
例8.1 具有基本数据类型旳一维数组旳申明
#define SIZE 10 int array[5]; double d[5],e[SIZE]; char name[SIZE*5];
13. double even;
21. course_even[i]=course_su
/*分别为全部课程旳总分、平均分 m[i]/5.0;
*/
22. sum+=course_sum[i];
14. int i;
23.
} /* 计算各门课平总分 */
24. even=sum/(3.0*SIZE);
2024/10/10
2024/10/10
17
例8.10
8. int course_sum[3]={0,0,0}; 15. for(i=0;i<5;i++){
9. double course_even[3];
16. course_sum[0]+=math[i];
/组**分/ 别为各门课程总分、平均分数17. course_sum[1]+=physics[i];
用若干个数字序号(下标)来区别各数组元素
例如定义float score[30],可表述30位学生成绩 用数组具有什么好处?
2024/10/10
3
8.1 数组概述
问题
计算全班30位同学某门课程旳平均成绩
处理措施
设置30个float型变量来统计成绩 设置一种有30个float型元素旳数组来统计成绩
C语言程序设计 一维数组的应用
int a[N] , i , j , temp;
printf("请输入 10 个数:\n");
for( i = 0 ; i < N ; i++)
scanf("%d",&a[i]); /* 输入数据 */
printf("\n");
printf("原始数据为:\n");
for( i = 0 ; i < N ; i++)
下面以 5 个数为例说明冒泡排序的过程。设有 5 个数如图 5-1 所示。
a[0]
9
7
7
7
7
a[1]
7
9
5
5
5
a[2]
5
5
9
6
6
a[3]
6
6
6
9
1
a[4]
1
1
1
1
9
⑴
⑵
⑶
⑷
⑸
图 5-1 冒泡法排序
第一次先将 a[0]和 a[1]比较,9 大于 7,将 a[0]和 a[1]的值对换(图 5-1(1));第二
a[ 0 ]
1
a[ 1 ]
5
a[ 2 ]
6
a[ 3 ]
7
a[ 4 ]
9
图 5-4 排序结果
可以推知,如果有 n 个数,要进行(n-1)趟处理,在第 i 趟中要比较(n-i)次。流程图如 图 5-5 所示。
·109·
参考程序如下:
/*程序名:5_5.c*/ /*程序功能:选择法排序*/ #include <stdio.h> #define N 20
C语言编程一维数组的使用
char m[20],n[20]; cin>>m>>n; int i = cmp(m,n); if (i == 0) cout <<"0"<<endl; if (i == 1) cout << "1"<< endl; if (i == -1) cout << "-1" << endl; return 0; } int cmp(char *s, char *p) { while (*s&&*p) { if (*s>*p) return 1; else if (*s < *p) return -1; else { if (*(s+1) == '\0' && *(p+1) != '\0') return -1; else if (*(s+1) != '\0' && *(p+1) == '\0') return 1; else if (*(s+1) == '\0'&&*(p+1)=='\0') return 0; else { s++,p++; continue; } } } } 5.编程序将输入的字符串删去空格输出。 编写程序:
for(j=i;j<10;j++) { max= ((a[j]>a[max])?j:max); } temp=a[max]; a[max]=a[i]; a[i]=temp; } printf("The arry after sort is:\n"); for(i=0;i<10;++i) { printf("%d,",a[i]); } printf("\n"); printf("Plesae input another number:"); scanf("%d",&temp); for(i=0;i<10;i++) { if(temp>a[i]) { break; } } for(j=10;j>=i;--j) { a[j]=a[j-1]; } a[i]=temp; for(i=0;i<11;i++) { printf("%d ",a[i]); } getchar(); return 0; }
C程序设计 一维数组应用(教案)
一维数组应用
课型
实训课
教学时数
2
教学目的
掌握数组的常见操作(输入/输出,逆序,找最大、最小值,平均值)
重点难点
一维数组的定义、初始化
采用教法
讲解演示
学法建议
讨论交流、模仿练习
教学
过程
设计
(复习内容、课题引入、主要知识点序列或操作步骤教法设计、时间分配等)
1、布置上机练习作业及要求
随机产生10个[10,50平均值及各元素之和。
根据实验中发生问题,有针对性小结
交流讨论
3、完成上机实训报告册
备注
思考与
练习
试归纳数值数组元素的输入、输出操作。
总结如何根据题意将循环变量与数组下标结合起来使用的思路与方法。
教学后记
从键盘输入10个战士的身高,输出最高、最低的身高。
从键盘输入20个整数,求出它们的平均值及比平均值大的数。
从键盘上输入20个元素的值存入一维数组a中,然后将下标为(1、3、5、7、9……)的元素值赋值给数组b,输出数组b的内容。
2、实验操作考察
实验预习情况,源程序、测试数据准备情况
程序实现过程,问题解决指导
第8章 数组和其应用(一维数组)
2019年1月23日
stu2
5
4 void main() 8 { float stu1,stu2,stu3,stu4,stu5,…,stu100; 12 float aver,sum; … printf("\nenter 100 students grade:"); 396 scanf("%f,%f, %f",&stu1,&stu2,&stu3); scanf("%f,%f, %f",&stu4,&stu5,&stu6); ……. scanf("%f,%f, %f",&stu98,&stu99,&stu100); sum=stu1+stu2+stu3+stu4+stu5+stu6+…+stu100; aver=sum/100; printf("\n100 students aver:%f",aver); } C 语言程序设计
解决办法什么是
数组呢?
用数组,可共用一个scanf命令,并利用循环 结构读取。 int score[100],i; for (i=0;i<100;i++) scanf(“%d”,&score[i]);
数组是有序数据的集合。数组中的每一个 元素都属于同一个数据类型。用一个统一的 数组名和下标来唯一地确定数组中的元素。
2019年1月23日
编程计算100个学生的平均成绩。 stu stu[100]
8.1
一维数组
0
stu[0] stu[1] stu[2] stu[3] …… stu[99]
语言程序设计 一维数组的定义和初始化
数组元素类型 数组名
定义了100个元素,分别为a[0]、a[1]、a[2]、……、a[99],相当于100个int类型 的变量,每一个称为数组中的一个元素,这些元素在内存中的存储示意如下。
a[0]
a[1]
a[2]
……
a[99]
C语言 一维数组定义
# include <stdio.h>
int main( )
C语 言 程 序 设 计
一维数组的定义和 初始化
C语言 数组类型的引入
例:设计程序实现,输入100个整数,反序输出。
01
分析:
02
因为要反序输出,所以直到最后一个数输入前我们无法输出,必须保存这100个整数的值。 应用前面所学的知识,我们进行如下的数据定义和输入函数调用。
a1
a2
a3
……
a100
int main( )
//下标值由大到小遍历 // 输出a[i]的值
C语言 一维数组元素的引用
如何使两个数组的值相等?
main()
{
int a[5] = {1,2,3,4,5}, b[5];
b = a; }
×
原因:数组名表示数组的首地址,其 值不可改变!
解决方法:
方法1:逐个元素赋值
b[0]=a[0];
b[1]=a[1]; b[2]=a[2];
C语言 一维数组的初始化
定义数组后,数组元素的初值是随机数,可以在定义数组的同 时对数组元素进行初始化。
int a[5] = { 12, 34 }; √ int a[5] = { 12, 34, 0, 0, 0 }; √ int a[5] = { 0 }; √ int a[ ] = { 12, 34, 56 ,78 ,9 }; √ int a[5] = { 12, 34, 56 ,78 ,9,18,20 }; ×
一维数组应用
一维数组的相关应用1.数组的定义:定义格式:数据类型数组名[数组的长度]其中:数据类型就是前面讲到的int、float、long、double、char等基本类型,当然也可以是我们后面还要介绍的其他类型(此处暂不考虑)。
数组名与普通变量的起名规则是一样的。
但不能与同一函数中的其他任何变量起一样的名字。
数组的长度定义是数组的长度只能是常量或常量表达式,否则就会出现编译错误。
例如:我们要定义一个整型数组,它里面能够存放10个元素,则应该定义成如下形式:int a[10];其他类型的数组与此类似,如:float f1[5], f2[10];long long1[10], long2[50];char ch1[30], ch2[10];也可以采用常量表达式来定义:如#define N 100main() {float num[N]; //定义了具有N个浮点型数据元素的数组,其中N为常量…}以下列举一些关于数组的应用,记住一点,数组的操作跟循环是息息相关的。
一维数组对应单重循环,后面要讲的二维数组对应的是二重循环。
2.给一维数组元素赋值:程序如下#include <stdio.h>main() { myfunc( ); }myfunc( ) {int a[10], i;printf(“input ten int number:\n”);/*下面的for循环将给数组a的每个元素赋值(从键盘上输入的)*/for (i=0; i<10; i++)scanf(“%d”, &a[i]);}3.一维数组元素的输出:程序如下#include <stdio.h>main() { myfunc( ); }myfunc( ){int a[10], i;printf(“input ten int number:\n”);/*下面的for循环将给数组a的每个元素赋值(从键盘上输入的)*/ for (i=0; i<10; i++)scanf(“%d”, &a[i]);/*下面的代码,将已经赋值的数组各元素输出到屏幕上*/for (i=0; i<10; i++)printf(“%d “, a[i]);}4.对一维数组元素进行相应处理后再输出。
一维数组的应用课程设计
一维数组的应用课程设计一、实训目标熟练掌握使用一维数组的编程方法和常用算法。
1、掌握数组的定义、输入和输出方法。
2、掌握下标变量的使用方法。
3、掌握求极值、分类统计、排序、查找、移动等常用算法。
4、进一步熟练程序的调试和测试方法。
5、*学习数组作为函数参数的编程方法。
二、语法练习1、数组是把同类型的变量组织在一起。
2、int a[5]; 表示定义了5 个整形类型的变量,分别为:a[2]、a[3]、a[4] 、a[0],各元素在内存中连续存放,数组名a表示数组在内存中的初始地址。
3、在C语言中对一维整型数组的正确定义为D。
A)int a(10); B)int n=10,a[n];C)int a[ ]; D)#define N 10int a[N];4、以下能对一维数组a进行初始化的语句是:(C )A.int a[5]=(0,1,2,3,4,);B.int a(5)={} ;C.int a[3]={0,1,2};D.int a[5]={5*1};5、已知:int a[10]; 则对a数组元素的正确引用是(D )。
A、a[10]B、a[3.5]C、a(5)D、a[0]6、若有以下数组说明,则数值最大的和最小的元素下标分别是( B ) int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};A.1,12B.0,11C.1,11D.0,127、若有以下数组说明,则i=4;a[a[i]] 元素数值是( A )int a[6]={ 8,11,3,6,2,12};A.3B.2C.6D.118、设有定义int a[5],i; 用for 循环结构分别写出数组的输入和输出程序段。
for(i=0;i<5;i++)scanf( “%d” ,&a[i]);for(i=0;i<5;i++)printf( “%d”,&a[i]);1三、实训内容和步骤1、定义一个具有10个元素的一维整型数组, 从键盘给各元素赋值,并以每行4 个数的格式输出。
C语言程序设计第3版课件第8章 数组
返回
下一页
main( )
{ float num[8];,sum, max, min, average;
num[8]={89, 88, 67, 23,45,54,0,0};
sum=0; fsourm(i==0s;ui<m8+;in+u+m) [0]; sum=sum+num[i1];]; sauvmer=asguem=+sunmum/8[;2];
返回
下一页
二、一维数组的初始化
例: float s[6];
S[0] S[1] S[2] S[3] S[4] S[5]
如何给数组s赋一组初始值{65.5, 89.2, 90, 89.8, 45.5, 60}
1、依次赋值。s[0]=65.5; s[1]=89.2; s[2]=90; s[3]=89.8; s[4]=45.5; s[5]=60;
返 回 上一页
main( ) { int s[3][4]; int i,j;
for(i=0;i<3;i++) for(j=0;j<4;j++) scanf(“%d”,&s[i][j]); for(i=0;i<3;i++) {for(j=0;j<4;j++) printf(“%5d”,s[i])[j]); s[i][j]=s[i][j]+5; printf(“\n”);} for(i=0;i<3;i++) {for(j=0;j<4;j++) printf(“%5d”,s[i][j]); printf(“\n”);}
返回
下一页
插入排序
一维数组简单应用
【例1】输入10个整数,按顺序输出。
main( )
{ int i,a[10];
程序的运行情况:
printf("input
10
numbers:\n")i;nput
10
输入元素
numbers:
for(i=0;i<=9;i++) scanf("%d",&a[i]);
1 2 3 4 5 6 7 8 9 10↙
max=max;
if(a[2]>max) max=a[2];
if(a[3]>max) max=a[3];
else
max=max;
else
max=max;
if(a[3]>max) max=a[3];
if(a[4]>max) max=a[4];
else
max=max;
else
max=max;
ቤተ መጻሕፍቲ ባይዱ
if(a[4]>max) max=a[4];
二、一维数组简单应用
【例2】输入10个整数,求所有元素之和及平均值。
main( ) { int i,a[10],sum=0;
float average; printf("input 10 numbers:\n");
输入元素
for(i=0;i<=9;i++)
scanf("%d",&a[i]) ; for(i=0;i<=9;i++)
C语言程序设计
主讲:刘春英
二、一维数组简单应用
在C语言中只能逐个使用下标变量引用数组元素,而不
C语言程序设计教程 第08章 一维数组的应用
本例题涉及的是对数组元素进行操作 的基本算法。对一维数组各元素的访问, 通常是在单重循环中实现。通过循环变量 与循环体内语句的配合,可以灵活地、有 选择地访问指定元素。 读者在阅读以下程序时,应理解数组 元素下标与数组元素值的区别;掌握如何 用循环变量控制数组元素的下标;以及如 何在连续输出的过程中控制输出换行。
8.4 与一维数组有关的参数传递
8.4.1 数组元素作实参
数组元素就是带下标的变量。所以,
数组元素作实参与简单变量作实参一样,
对应的形参应该是同类型的简单变量。
例8.3 编写程序:利用随机函数产生 6个50以内的整数存入数组a中,然后调用 自定义函数isodd依次判断数组a中的元素 是否为奇数。 程序如下 #include "stdlib.h" int isodd(int x)
需要说明的是:当数组名作为实参时, 对应的形参应该是指针,但还允许其他表 示形式。以ArrIn函数为例,对于调用语句: ArrIn(a,20);,相应的函数首部允许是以下 三种形式: ① void ArrIn(int *x,int n) ② void ArrIn(int x[ ],int n) ③ void ArrIn(int x[N],int n) 无论表示形式如何,C编译器都将x按 指针处理。
/* 形参是与实参相同类型的普通变量x */
{ if(x%2==1) return 1; else return 0; }
main( ) { int a[6],i; for(i=0; i<6; i++) { a[i]=rand( )%50; printf("%4d",a[i]); } printf("\n");
一维数组的使用
⼀维数组的使⽤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);}}。
C语言 一维数组的定义和引用 数组
3 34 377 4181
5 55 610 68765
例T7-3.c 用起泡法对6个数排序(由小到大) 思路:将相邻两数两两比较,若小则调到前头,不小也要比较
988888 895555 559444 444922 222290
000009
85555 58444 44822 22280 00008
printf (“a[%d]=%d\ n”,i,a[i]=i+1);
printf (“a[5]=%d\t”,a[5]);
printf (“a[6]=%d\ n”,a[6]);
}
运行结果:
a[0]=1
a[1]=2
a[2]=3
a[3]=4
a[4]=5
a[5]=-30
a[6]=285
精选ppt课件
3
4.数组大小的定义只能是常量,而不能是变 量或动态地定义。 例7-0-2. C main( ) { int n=5,a[n];
第一轮大数沉底 第二轮
5444 4522 2250 0005
第三轮
42
24
2
00
0
4
2
第四轮 第五轮
此处:n=6 外层循环j(1~n-1)次
内层循环i (1~n-j)次
精选ppt课件
9
精选ppt课件
10
main( ) {int a[7]; int i, j , t; printf (“input 6 numbers:\ n”); for(i=1;i<7;i++) scanf(“%d”, &a[i ]; printf (“\ n”); for(j=1; j<=5; j++)
C语言编程一维数组的使用
实验三一维数组的使用【实验目的】1掌握一维数组、二维数组的定义和初始化方法。
2熟悉使用字符数组处理字符串处理的方法。
【实验内容】1 •输入10个学生的成绩,求平均成绩,并将低于平均成绩的分数打印出来编写程序:#in elude <stdio.h>void readdata (float score[10]){int i;printf("依次输入10个学生的成绩:\n");for(i=0;i<10;i++)scan f("%f",&score[i]);return;}float aver(float score[10]){float sum;int i;for(sum=0,i=0;i<10;i++)sum=sum+score[i];return(sum/10);}void prin tff(float score[10],float ave) { int i;printf("低于平均分的成绩为:\n");for(i=0;i<10;i++) if(score[i]<ave) prin tf("%8.2f",score[i]); return;}mai n(){void readdata (float score[10]);float aver(float score[10]);void prin tff(float score[10],float ave); float ave,score[10]; readdata(score);ave=aver(score);prin tf("average=%6.2f\n",ave);prin tff(score,ave);}2、将一个数组中的值按逆序重新存放。
例如,原来顺序为8, 6, 5, 4, 1。
要求改为1,4, 5, 6, 8<编写程序:#include viostream.h>int main(){int i,j,a[5]={8,6,5,4,1},b[5];for(i=0,j=4;iv5,j>=0;i++,j--)b[j]=a[i];for(i=0;i<5;i++)a[i]=b[i];for(i=0;i<5;i++)coutv<a[i]vv"\t";}3、应用一维数组,对10个从键盘输入的数进行冒泡排序,使其按照从大到小的顺序输出。
C语言一维数组教案
学科:计算机科学与技术课程:C语言程序设计课题:一维数组课时:2教学目标:1、掌握一维数组的定义和引用2、掌握一维数组的初始化方法3、了解与一维数组有关的应用编程方法教学重点:一维数组的定义和引用、初始化方法教学难点:与一维数组有关的应用编程方法教学方法:举例法,引导法教学步骤:1、通过一个例子提出问题来引出本节课的知识点2、讲授一维数组的定义和引用、初始化方法3、示例训练4、进行本节课的总结及作业布置教具:黑板计算机投影仪教学过程:一、导入:提问:保存一个班50位同学的一门功课的成绩,并且找出最高分和最低分,应如何实现?解题思路:定义50个变量,从键盘中输入值,然后再相互比较。
处理起来很复杂,是否有更简便的方法?引出本节课的知识点-----数组。
二、讲授:1、数组概述:·数组:是数目固定,类型相同的若干个变量的有序集合,用数组名标识。
序:是数组元素之间的位置关系,不是元素值的大小顺序。
数组名:是用于区别其它数组及变量的。
·数组元素:集合中的变量,属同一数据类型,用数组名和下标确定。
下标:是数组元素在数组中的位置。
·数组的维数:数组名后所跟下标的个数。
2、一维数组的定义一维数组是指由一个下标数组元素组成的数组。
其定义形式为:存储类型数据类型数组名[常量表达式]例如:static int score[50];它表示定义了一个名为score的数组,该数组有50个元素,其存储类型为静态型,数据类型为整型。
说明:(1)存储类型为任选项,可以是auto、static、extern存储类型,但是没有register 型。
(2)数据类型是用来说明数组元素的类型:int , char , float。
(3)数组名的命名应遵守标识符的命名规则,但是不能与其他变量同名。
(4)数组名后是用方括号[ ]括起来的常量表达式。
常量表达式表示的是数组元素的个数,即数组的长度。
在上例中定义了数组score [50],第一个元素为score [0],最后一个为score [49]。
一维数组(C语言)
字符数组
C、如果数组长度大于字符串实际长度,也只输出到遇‘\0’结束。 D、如果一个字符数组中包含一个以上‘\0’,那么遇到和第一个‘\0’ 就结束。〔利用scanf输入字符串,空格可作为结束符。〕
例:char str[13]; scanf(“%s〞,str);
字符数组
〔3〕给字符数组元素逐个赋初值。 char str[9]; str[0]=‘H’;str[1]=‘e’;str[2]=‘\0’;
应注意:用字符数组来存放字符串时,假设是逐个字符 赋值给数组元素,要在最后一个字符之后加上字符串结 束标志‘\0’。 用逐个字符给字符数组赋初值,对字符串的存取不太方 便。
printf(“\n〞);
}
B、使用getchar putchar getch getche函数。
字符数组
〔2〕将整个字符串一次输入或输出。用%s格式符。 例:char c[ ]=“china〞; printf(“%s〞,c);
结果为:china
注意: A、输出字符不包括结束符‘\0’; B、用%s格式符输出字符串时,printf 函数中的输出项是字
int a[10], b[10], k; for (k=0;k<10;k++) scanf(“%d〞,&a[k]); b=a; /*error*/ for(k=0;k<10;k++) b[k]=a[k];
一维数组
(3) 在使用数组元素时,数组元素中的下标表 达式的值必须是整型。 下标表达式值的下限为0,值的上限为该数 组元素的个数减1。 使用数组时注意其下标不要越界。如果下 标越界,程序无法得到正确的结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(i=0; i<10; i++) scanf("%d",x+i); for(i=0; i<10; i++) printf("%3d",*(x+i)); 注意:在上面的程序段中,我们只是 使用了代表数组首地址的数组名x,并没有 (也不允许)改变它的值。
8.3.3 通过指针访问数组元
素
通过地址常量——数组名可以访问数 组元素,显然,通过存放地址的变量—— 指针也可以访问数组元素,而且更具灵活 性。 若有如下定义: int x[10],*p,i; 在执行了语句:p=x;或p=&x[0];后, 指针p中存放的是数组x的首地址。
printf("输出值为偶数的元素:\n"); for(i=0;i<20;i++) if(x[i]%2==0) printf("%3d",x[i]); printf("\n");
}
程序的运行结果如下: 分两行逆序输出: 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 输出下标为偶数的元素: 3 5 7 9 11 13 15 17 19 输出值为偶数的元素: 2 4 6 8 10 12 14 16 18 20
8.3.2 通过数组首地址访问
数组元素
设有如下定义:
int x[10],i;
通过上一节的叙述已知:数组名是数 组的首地址,从而有:
x+0 等价于 &x[0] x+1 等价于 &x[1] … x+i 等价于 &x[i] 在得到地址后,可以通过间接访问运 算符来引用地址所在的存储单元。因此有:
*(x+0)或*x 等价于 *&x[0] 即x[0] *(x+1) 等价于 *&x[1] 即x[1] … *(x+i) 等价于 *&x[i] 即x[i] 如果要利用数组首地址对x数组的所有 元素逐个输入输出,则可由以下程序段实 现:
如果不移动指针,也可以采用首地址 +位移量的形式逐个输入输出数组元素: p=x; for(i=0; i<10; i++) scanf("%d",p+i); for(i=0; i<10; i++) printf("%3d",*(p+i));
在上一小节的讨论中,我们曾经得出 结论:*(x+i)等价于x[i]。细心的读者可能 会问:在这里*(p+i)是否也等价于p[i]呢? 确实如此。事实上方括号[ ]也是一种运算 符。 概括起来,如果有如下定义和语句: int x[10],*p,i; p=x;
8.4 与一维数组有关的参数传递
8.4.1 数组元素作实参
数组元素就是带下标的变量。所以,
数组元素作实参与简单变量作实参一样,
对应的形参应该是同类型的简单变量。
例8.3 编写程序:利用随机函数产生 6个50以内的整数存入数组a中,然后调用 自定义函数isodd依次判断数组a中的元素 是否为奇数。 程序如下 #include "stdlib.h" int isodd(int x)
本例题涉及的是对数组元素进行操作 的基本算法。对一维数组各元素的访问, 通常是在单重循环中实现。通过循环变量 与循环体内语句的配合,可以灵活地、有 选择地访问指定元素。 读者在阅读以下程序时,应理解数组 元素下标与数组元素值的区别;掌握如何 用循环变量控制数组元素的下标;以及如 何在连续输出的过程中控制输出换行。
8.4.2 数组名作实参
数组名作为实参传递时,传送给形参 的是数组的首地址。因此,对应的形参必 须是基类型相同的指针变量。 例8.4 编写程序:利用自定义函数 ArrIn和ArrOut实现数组元素的输入和输 出。
源程序如下: #define N 100 void ArrIn(int *x,int n) /* 对应的形参x是指针变量 */ { int i; for(i=0; i<n; i++) scanf("%d",x+i); }
根据以上信息,编译器决定分配多大 的存储空间给该数组使用。例如: int a[10]; 这里a是数组的名称,方括号中的10表 明数组一共有10个元素,下标应该从0开始 到9结束;类型名int限定数组a的每个元素 中只能存放整型数。根据这一定义,系统 将为数组a开辟能容纳10个整型数的连续存 储单元。
由此可见:数组名是地址常量;指针 是存放地址的变量,它们都可以用来描述 数组元素的地址,进而可以得到元素的内 容。所以,我们不仅可以直接用带下标的 变量形式来访问数组元素,还可以通过数 组的首地址(数组名)和指针来访问数组 元素,从而大大地增加了数组使用的灵活 性,但也同时增加了初学者全面掌握C语 言的难度。
/* 形参是与实参相同类型的普通变量x */
{ if(x%2==1) return 1; else return 0; }
main( ) { int a[6],i; for(i=0; i<6; i++) { a[i]=rand( )%50; printf("%4d",a[i]); } printf("\n");
源程序如下: main( ) { int x[20],i; for(i=0;i<20;i++) /* 为数组赋值 */ x[i]=i+1; printf("分两行逆序输出:\n"); for(i=19;i>=0;i– –) /* 控制从数组尾部开始输出 */
{ printf("%3d",x[i]); if( i%10==0 ) printf("\n"); /* 控制每输出10个元素后换行 */ } printf("输出下标为偶数的元素:\n"); for(i=2; i<20; i+=2) printf("%3d",x[i]); printf("\n");
(3)指针变量是用来存放地址值的, 它可以通过加、减一个整数在一串连续的 存储单元中移动,并可以利用间接访问运 算符得到指针所指单元的内容。因此,数 组名、数组元素和指针变量之间可以通过 数组元素的地址建立起关系。若有如下定 义: int a[6]={1,2,3,4,5,6},*p; 则语句: p=a; 等价于 p=&a[0];
都是错误的。数组名x和y作为地址常 量可以使用,不可以重新赋值。而表达式: x+1、y+2 则是合法的。它们表示以数组名为首 地址增加一个偏移量后的地址值。
(2)就整体而言,每个数组元素都 是数组这个集合中的一分子,由于数组所 占地址空间是连续的,通过数组名这个首 地址就可以找到数组中的所有元素;就个 体而言,每个数组元素都可以看作是一个 带下标的变量,它完全可以像普通变量一 样进行求地址运算。因此,用数组名表示 的地址与数组元素的地址之间就有如下关 系: x+1等价于&x[1] 、y+2等价于&y[2]
数组一经建立,在内存中就占据着一
串连续的存储单元。
8.1.4 一维数组的初始化
8.2 一维数组的简单应用
例8.1 编写程序,在数组x中存储自 然数1~20,然后按以下要求输出数据: ① 按逆序分两行输出元素值。 ② 在一行上输出所有下标为偶数的数 组元素。 ③ 在一行上输出所有值为偶数的数组 元素。 问题分析
(5)数组的定义可以和普通变量的定 义出现在同一个定义语句中。例如: float k,x[5],y[20]; 以上语句在定义单精度变量k的同时, 定义了两个单精度型的一维数组x和y。数 组x共有5个元素,下标的使用范围是0~4; 数组y共有20个元素,下标的使用范围是 0~19。
8.1.3 一维数组元素的引用
void ArrOut(int *x,int n) { int i; for(i=0;i<n;i++) { printf("%4d",*(x+i)); if((i+1)%5==0) printf("\n"); /* 控制输出5个元素后换行 */ } }
main( ) { int a[N]; ArrIn(a,20); /* 数组名a作实参 */ ArrOut(a,10); }
则表示数组x中的元素可以有以下四种 形式: ① x[i] ② *(x+i) ③ *(p+i) ④ p[i] 当然,这里的i必须满足条件:0≤i< 10,否则下标就越界了。 与数组名不同,指针是变量,它可以 通过赋值语句移动位置。因此可以采用以 下方法,通过顺序移动指针来逐个输入输 出数组元素:
p=x; for(i=0; i<10; i++) { scanf("%d",p); p++; } p=x; for(i=0; i<10; i++) { printf("%3d",*p); p++; } 注意:由于在输入时移动了指针,输 出前还应通过赋值操作使指针再次指向数 组的第一个元素。
for(i=0; i<6; i++) if(isodd(a[i])) /* 数组元素a[i]作实参 */ printf("a[%d] is odd.\n",i); else printf("a[%d] is not odd.\n",i); }
运行结果如下: 46 30 32 40 6 17 a[0] is not odd. a[1] is not odd. a[2] is not odd. a[3] is not odd. a[4] is not odd. a[5] is odd.