c语言大学实用教程数组新课件_第1页
c语言大学实用教程数组新课件_第2页
c语言大学实用教程数组新课件_第3页
c语言大学实用教程数组新课件_第4页
c语言大学实用教程数组新课件_第5页
已阅读5页,还剩171页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何计算一个班级学生的平均分数??如何记录直线上的整数点?比如(0,0)、(1、1)、(2、2)、(3、3)、(4、4)、(5、5)。。。数组如何计算一个班级学生的平均分数??数组问题:给一组数排序,这组数该如何存放呢???这些数据如何存放才便于排序82945637617188888888881111111111111118888888888?这便是本章所要解决的问题第6章数组数组问题:给一组数排序,这组数该如何存放呢???这些数据如内容提要数组类型;向函数传递一维数组和二维数组;常用算法:排序、查找、求最大最小值等;用字符数组存取字符串;使用字符串处理函数处理字符串内容提要数组类型;数组的用处保存大量同类型的相关数据如矩阵运算,表格数据等

构造数据类型之一数组:有序数据的集合,用数组名标识元素:属同一数据类型,用数组名和下标确定数组的用处保存大量同类型的相关数据构造数据类型之一6.1一维数组一维数组的定义:数据类型数组名[常量或常量表达式];合法标识符表示元素个数下标从0开始例

inta[6];编译时分配连续内存内存字节数=数组定义的元素个数*sizeof(元素数据类型)数组名表示内存首地址,是地址常量a014523a[0]0145a[1]a[2]a[3]a[4]a[5]23a6.1一维数组合法标识符表示元素个数例inta一维数组的引用数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组数组元素表示形式:数组名[下标]其中:下标可以是整型常量或整型表达式以0开始,到n-1结束例inta[10];printf(“%d”,a);()必须

for(j=0;j<10;j++)printf(“%d\t”,a[j]);()例intdata[5];data[5]=10;//C语言对数组不作越界检查,使用时要注意下标越界是大忌!使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果一维数组的引用例inta[10];例in数组的定义与初始化数组定义后的初值仍然是随机数,一般需要我们来初始化inta[5]={12,34,56,78,9};inta[5]={0};inta[]={11,22,33,44,55};数组大小最好用宏来定义,以适应未来可能的变化#defineSIZE10

inta[SIZE];数组大小定义好后,将永远不变数组的定义与初始化数组定义后的初值仍然是随机数,一般需要我们一维数组的初始化初始化方式在定义数组时,为数组元素赋初值(在编译阶段使之得到初值)inta[5]={1,2,3,4,5};等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;说明:数组不初始化,其元素值为随机数对static数组元素不赋初值,系统会自动赋以0值当全部数组元素赋初值时,可不指定数组长度如inta[5]={6,2,3};等价于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;如inta[3]={6,2,3,5,1};()staticinta[5];等价于:a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;只给部分数组元素赋初值inta[]={1,2,3,4,5,6};编译系统根据初值个数确定数组元素个数一维数组的初始化在定义数组时,为数组元素赋初值inta[①floata[0]; /*数组大小为0没有意义*/

②intb(2)(3);/*不能使用圆括号*/

③intk,a[k];/*不能用变量说明数组大小*/

数组说明中其他常见的错误①floata[0]; /*数组大小为0没有数组的特点快速地随机访问一旦定义,不能改变大小数组的特点快速地随机访问只能逐个对数组元素进行操作(字符数组例外)输入方法:inta[10],i;输入第i个数组元素:scanf("%d",&a[i]);输入整个数组元素:for(i=0;i<10;i++)scanf("%d",&a[i]);输出方法:输出第i个数组元素:printf("%d",a[i]);输出整个数组元素:for(i=0;i<10;i++)printf("%d",a[i]);一维数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)输入方法:int程序举例例将10个整数存入数组,并打印输出。#include<stdio.h>#defineSIZE10main(){intx[SIZE]={0,1,2,3,4,5,6,7,8,9};inti;

for(i=0;i<SIZE;i++)printf("%d",x[i]);}#include<stdio.h>#defineSIZE10main(){intx[SIZE],i;printf("Enter10integers:\n");

for(i=0;i<SIZE;i++) scanf("%d",&x[i]);

for(i=1;i<SIZE;i++)

printf("%d",x[i]);}程序举例例将10个整数存入数组,并打印输出。#inclu程序举例例读10个整数存入数组,找出其中最大值和最小值步骤:1.输入:for循环输入10个整数2.处理:(a)先令max=min=x[0](b)依次用x[i]和max,min比较(循环)若max<x[i],令max=x[i]

若min>x[i],令min=x[i]3.输出:max和min#include<stdio.h>#defineSIZE10main(){intx[SIZE],i,max,min;printf("Enter10integers:\n");

for(i=0;i<SIZE;i++) scanf("%d",&x[i]);

max=min=x[0];

for(i=1;i<SIZE;i++){if(max<x[i])max=x[i];if(min>x[i])min=x[i];}printf("Maximumvalueis%d\n",max);printf("Minimumvalueis%d\n",min);}程序举例例读10个整数存入数组,找出其中最大值和最小值步文曲星猜数游戏由计算机随机生成一个各位相异的4位数字,由人来猜,每次提示:xAxBA前面的数字表示有几个数字猜对位置也对了B前面的数字表示有几个数字猜对但位置不对提示用数组a存计算机随机生成的4位数用数组b存人猜的4位数对a和b的相同位置的元素进行比较,得到A前面的数字对a和b的不同位置的元素进行比较,得到B前面的数字文曲星猜数游戏由计算机随机生成一个各位相异的4位数字,由人来文曲星猜数游戏随机生成一个各位相异的4位数字

srand(time(NULL));a[0]=rand()%10;

do{ a[1]= rand()%10;}while(a[0]==a[1]);

do{ a[2]=rand()%10;}while(a[0]==a[2]||a[1]==a[2]);

do{ a[3]=rand()%10;}while(a[0]==a[3]||a[1]==a[3]||a[2]==a[3]);文曲星猜数游戏随机生成一个各位相异的4位数字文曲星猜数游戏统计数字和位置都猜对的个数,对a和b的相同位置的元素进行比较,得到A前面的数字

right=0;

for(j=0;j<4;j++) {

if(a[j]==

b[j]) { right=right+1; } }j=0j=1j=2j=3ab文曲星猜数游戏统计数字和位置都猜对的个数,对a和b的相同位置文曲星猜数游戏统计人猜对的数字个数,对a和b的不同位置的元素进行比较,得到B前面的数字

good=0;

for(j=0;j<4;j++) {

for(k=0;k<4;k++) {

if(a[k]==b[j]) {

good=good+1; } } }

good=good-right;k=0k=1k=2k=3j=0abj=1文曲星猜数游戏统计人猜对的数字个数,对a和b的不同位置的元素餐饮服务质量调查打分有40个学生被邀请给自助餐厅的食品和服务质量打分(1~10等级),统计调查结果,并用*打印如下形式的统计结果直方图

GradeCount Histogram1 5 *****2 10 **********3 7 ******* ...餐饮服务质量调查打分有40个学生被邀请给自助餐厅的食品和服餐饮服务质量调查打分提示定义数组score存放打的分数定义数组count为计数器(count[0]不用)计算统计结果:设置一个循环,依次检查数组元素值score[i],是1则将数组元素count[1]加1,是2则将数组元素count[2]加1,依此类推 for(i=0;i<STUDENTS;i++) { count[score[i]]++; }打印统计结果,设置一个循环,按count数组元素的值,打印相应个数的符号’*’餐饮服务质量调查打分提示例6.1兔子繁殖问题打印每个月和年底时的总的兔子对数Fibonacci数列123581321345589144233,…

例6.1兔子繁殖问题例6.1#include<stdio.h>#defineYEAR_MONTH12main(){

intf[YEAR_MONTH+1]={0,1,2};

intmonth;

for(month=3;month<=YEAR_MONTH;month++) { f[month]=f[month-1]+f[month-2]; }

for(month=1;month<=YEAR_MONTH;month++) {

printf("%d\t",f[month]); }

printf("\nsum=%d\n",f[YEAR_MONTH]);}例6.1#include<stdio.h>例6.2—打印出最高分及其学生序号从键盘输入信管1班学生高数成绩(每班最多不超过45人,具体人数由键盘输入),试编程输出最高分及其学生序号。例6.2—打印出最高分及其学生序号从键盘输入信管1班学生高max(i=0)max(i=2)max(i=3)计算最大值算法max(i=0)max(i=2)max(i=3)计算最大值算Step1从键盘输入学生人数n;Step2从键盘输入所有学生的学号和成绩分别存入数组num和scoreStep3假设其中的一个学生成绩为最高,同时记录其学号,即令

maxScore=score[0] maxNum=num[0];Step4对所有学生成绩进行比较,即for(i=0;i<n;i++){ 若score[i]>maxScore, 则修改maxScore值为score[i], 并记录其学号maxNum=num[i];}Step5打印最高分maxScore及其学号maxNum。例6.2—算法Step1从键盘输入学生人数n;例6.2—算法......main(){ ......

for(i=0;i<n;i++) { scanf("%ld%f",&num[i],&score[i]); }

maxScore

=score[0];

for(i=1;i<n;i++) {

if(score[i]>maxScore) {

maxScore

=score[i];

} } printf("maxScore=%.0f\n",maxScore);}例6.2—打印最高分......例6.2—打印最高分......main(){ ......

for(i=0;i<n;i++) { scanf("%ld%f",&num[i],&score[i]); } maxScore=score[0];

maxNum=num[0];

for(i=1;i<n;i++) {

if(score[i]>maxScore) { maxScore=score[i];

maxNum=num[i];

} } printf("maxScore=%.0f,maxNum=

%ld\n",maxScore,

maxNum);}例6.2—打印最高分及其学生序号用函数实现?同时输出最高分和最低分及其学生序号,该如何改写程序呢?......例6.2—打印最高分及其学生序号用函数实现?#include<stdio.h>#defineARR_SIZE40floatFindMax(floatarr[],intn);main(){

floatscore[ARR_SIZE],maxScore;

intn,i;

printf("Pleaseentertotalnumber:"); scanf("%d",&n); printf("Pleaseenterthescore:\n");

for(i=0;i<n;i++) { scanf("%f",&score[i]); } maxScore=FindMax(score,n); printf("maxScore=%.0f\n",maxScore);}floatFindMax(floatarr[],intn){

floatmax;

inti;

max=arr[0];

for(i=1;i<n;i++) {

if(arr[i]>max) { max=arr[i]; } }returnmax; }现场编程

用函数实现打印最高分#include<stdio.h>floatFindMa

数组名作函数参数P174-6.3传递整个数组到另一个函数内,可以将数组的首地址作为参数传过去用数组名作为函数参数只拷贝一个地址自然比拷贝全部数据效率高由于首地址相同,故实参数组与形参数组占用同一段内存在该函数内,不仅可以读这个数组的元素,还可以修改它们数组名作函数参数P174-6.3传递整个数组到另一个函简单变量和数组作函数参数的区别简单变量和数组作函数参数的区别用数组名作函数参数时,此时形参应当用数组名或用指针变量。例-L函数地址传递.c有一个一维数组score,内放3个学生成绩,求平均成绩。用数组名作函数参数时,此时形参应当用数组名或用指针变量#include<stdio.h>floataverage(floatarray[3]);/*函数声明*/voidmain(){floatscore[3],aver;inti;printf("input3scores:\n");for(i=0;i<3;i++)

scanf("%f",&score[i]);printf("\n");aver=average(score);printf("averagescoreis%5.2f\n",aver);}#include<stdio.h>floataverage(floatarray[3]){inti;floataver,sum=0;for(i=0;i<3;i++)

sum=sum+array[i];aver=sum/3.0;returnaver;}运行情况如下:长度可以不声明吗?P174-175floataverage(floatarray[3]作业P1986.4作业P198现场演示排序算法交换法排序选择法排序现场演示排序算法交换法排序交换法排序第一轮后交换法排序第一轮后交换法排序第二轮后第三轮后交换法排序第二轮后第三轮后交换法排序交换法排序for(i=0;i<n-1;i++){

for(j=i+1;j<n;j++){

if(score[j]>score[i])

"交换成绩score[j]和score[i]",

"交换学号num[j]和num[i]";

}}交换法排序交换法排序选择法排序k=1k=2k=0k=1选择法排序k=1k=2k=0k=1选择法排序k=3k=4k=3k=4选择法排序k=3k=4k=3k=4选择法排序选择法排序for(i=0;i<n-1;i++){

k=i;

for(j=i+1;j<n;j++){

if(score[j]>score[k])记录此轮比较中最高分的元素下标k=j;

}

若k中记录的最大数不在位置i,则

"交换成绩score[k]和score[i]",

"交换学号num[k]和num[i]";}选择法排序选择法排序现场演示查找算法顺序查找折半查找现场演示查找算法顺序查找顺序查找intSearch(longa[],intn,longx){

inti;

for(i=0;i<n;i++){

if(a[i]==x){

return(i);}}

return(-1);}哈,找到了!顺序查找intSearch(longa[],int折半查找数组下标0123456第一次循环:9901199013990159901799019

①查找值x=99017lowmidhighx>a[mid],low=mid+1第二次循环:9901199013990159901799019

low=midhighx=a[mid],找到哈,找到了!折半查找数组下标012折半查找数组下标0123456第一次循环:9901199013990159901799019

②查找值x=99016lowmidhighx>a[mid],low=mid+1第二次循环:9901199013990159901799019

low=midhighx<a[mid],high=mid-1第三次循环:9901199013990159901799019

highlow不满足low<=high,循环结束,未找到

唉,没找到!折半查找数组下标012intBinSearch(longa[],intn,longx){

intlow,high,mid; low=0; high=n-1;

while(low<=high) { mid=(high+low)/2;

if(x>a[mid]) { low=mid+1; }

else

if(x<a[mid]) { high=mid-1; }

else

{

return(mid); } }

return(-1);}intBinSearch(longa[],intn排序&查找作业作业:

1.请将从键盘输入的5个整数,从大到小排列后输出到屏幕。2.从键盘随便输入的5个整数存储到数组a中,将这5个数中最大数的下标输出到屏幕。排序&查找作业作业:二维数组的定义和引用

二维数组定义的一般形式为类型说明符数组名[常量表达式][常量表达式];例如:定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组。如下:floata[3][4],b[5][10];不能写成

floata[3,4],b[5,10];二维数组的定义和引用二维数组定义的一般形式为不能写成fl注意我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如,可以把a看作是一个一维数组,它有3个元素:a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。注意我们可以把二维数组看作是一种特殊的一维数组:它的元素又是二维数组的定义

二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素…

一维数组在内存中的存放下图表示对a[3][4]数组存放的顺序二维数组的定义二维数组中的元素在内存中的排列顺序是:按地址

数组元素b[0][0]b[0][1]b[0][2]b[1][0]b[1][1]b[1][2]b[2][0]b[2][1]b[2][2]3000H3002H3004H3006H3008H300AH300CH300EH3010H例如:整型数组b[3][3]={{1,2,3},{4,5,6},{7,8,9}};123456789123456789地址值数组元素b[0][二维数组元素的表示形式为:数组名[下标][下标]

例如:a[2][3]下标可以是整型表达式,如a[2-1][2*2-1]数组元素可以出现在表达式中,也可以被赋值,例如:b[1][2]=a[2][3]/2注意不要写成a[2,3],a[2-1,2*2-1]形式二维数组的引用二维数组元素的表示形式为:数组名[下标][下标]数组元素可以常出现的错误有:

inta[3][4];

/*定义a为3×4的数组*/

┆a[3][4]=3;

在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。常出现的错误有:在使用数组元素时,应该注意下标值应在已定义可以用下面4种方法对二维数组初始化数据类型

数组名[常量表达式1][常量表达式2]={初始化数据};(1)

分行给二维数组赋初值。如:

inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

(2)

可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};二维数组的引用可以用下面4种方法对二维数组初始化数据类型(1)分行给二(3)

可以对部分元素赋初值。如

inta[3][4]={{1},{5},{9}};

100050009000也可以对各行中的某一元素赋初值,如inta[3][4]={{1},{0,6},{0,0,0,11}};100006000

0011

100056000000也可以只对某几行元素赋初值。如:inta[3][4]={{1},{5,6}};

(3)可以对部分元素赋初值。如1000也可以对(4)如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};它等价于:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:inta[][4]={{0,0,3},{},{0,10}};0030000001000§7.2.3二维数组的引用(4)如果对全部元素都赋初值,则定义数组时对第一维的长度可以二维数组的输入和输出数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)intb[2][3],i,j;输入方法:输入第i行第j列元素:scanf(“%d”,&a[i][j]);输入整个数组元素:for(i=0;i<2;i++)for(j=0;j<3;j++)scanf(“%d”,&a[i][j]);输出方法:输出第i行第j列元素:printf(“%d”,a[i][j]);输出整个数组元素:for(i=0;i<2;i++)for(j=0;j<3;j++)printf(“%d”,a[i][j]);二维数组的输入和输出数组的输入和输出只能逐个对数组元素进行操二维数组程序举例例kw1将一个二维数组行和列元素互换,存到另一个二维数组中。#include<stdio.h>voidmain(){inta[2][3]={{1,2,3},{4,5,6}};intb[3][2],i,j;printf("arraya:\n");for(i=0;i<=1;i++){for(j=0;j<=2;j++){printf("%5d",a[i][j]);/*打印输出矩阵a的元素,先行后列*/b[j][i]=a[i][j];/*给矩阵b赋值*/}printf("\n");/*下一行输出前,先换行*/}例如:a=12314456b=2536二维数组程序举例例kw1将一个二维数组行和列元素互换,存printf("arrayb:\n");for(i=0;i<=2;i++){for(j=0;j<=1;j++)printf("%5d",b[i][j]);/*打印输出矩阵b的元素,先行后列*/printf("\n");}}/*程序结束*/运行结果如下:arraya:123456arrayb:1425

3

6

printf("arrayb:\n");运行结果如下:例kw2:有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。先用N-S流程图表示算法

,如下:二维数组程序举例+1+1例kw2:有一个3×4的矩阵,要求编程序求出其中值最大的那#include<stdio.h>voidmain(){inti,j,row=0,colum=0,max;inta[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+1;/*记录行、列号*/colum=j+1;}printf("max=%d,row=%d,colum=%d\n",max,row,colum);}/*程序结束*/c语言大学实用教程数组新课件6.4向函数传递二维数组实际传送的是指向数组第一个元素的地址在声明二维数组形参时,不能省略数组第二维的长度,为什么?

a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]6.4向函数传递二维数组实际传送的是指向数组第一个元素的地例6.8计算每门课程的总分和平均分voidTotal(int

score[][COURSE],

intsum[],

floataver[],intn){

inti,j;

for(j=0;j<COURSE;j++) { sum[j]=0;

for(i=0;i<n;i++) { sum[j]=sum[j]+score[i][j]; } aver[j]=(float)sum[j]/n; }}例6.8计算每门课程的总分和平均分voidTotal(6.5字符数组字符char字符串6.5字符数组字符char字符串(String)与字符数组字符串一串以'\0'结尾的字符在C语言中被看作字符串用双引号括起的一串字符是字符串常量,C语言自动为其添加'\0'终结符C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理字符数组每个元素都是字符类型的数组charstring[80];字符串(String)与字符数组字符串字符数组的初始化P188用字符型数据对数组进行初始化charstr[6]={'C','h','i','n','a','\0'};

字符数组长度为6,但字符串实际长度为5charstr[6]={'C','h','i','n','a'};

用字符串常量直接对数组初始化charstr[6]={"China"};charstr[6]="China";charstr[]={"China"};charstr[]="China";charstr[5]="China";

长度不够,无法按照字符串来处理字符数组的初始化P188用字符型数据对数组进行初始化‘\0’作为字符串结束符的天生缺陷假若交给这些字符串处理函数的字符串没有'\0'会如何?‘\0’很关键,如果没有,那么这些处理函数会一直进行处理直到遇到一个‘\0’为止。此时可能已经把内存弄得乱七八糟ANSI

C定义了一些“n族”字符处理函数,包括strncpy、strncat、strncmp等,通过增加一个参数来限制处理的最大长度‘\0’作为字符串结束符的天生缺陷假若交给这些字符串处理函数例kw3字符数组的输出#include<stdio.h>#include<string.h>#defineARRA_SIZE4/*字符串最大长度*/main(void){ intn; charstr[ARRA_SIZE]={'a','b','c'},min[ARRA_SIZE]; printf(“%s\n",str); for(n=0;str[n]!='\0';n++) { printf(“%c”,str[n]);/*每次输出一个字符串*/

} printf("\n");}把4改成3看看输出结果例kw3字符数组的输出#include<stdio.§

字符数组§字符数组的输入输出字符数组的输入输出可以有两种方法:

逐个字符输入输出。用格式符“%c”输入或输出一个字符。将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输出。

§字符数组§字符数组的输入输出字符数组的输入输出可以有charc[]={″China″};printf(″%s″,c);

例如在内存中数组c的状态charc[]={″China″};例如在内存中数组c的状逐个输入输出for(i=0;s[i]!='\0';i++){ putchar(s[i]);}putchar('\n');一次性输入输出scanf("%s",s);printf("%s",s);chars[10];字符数组的输入输出

gets("%s",s);puts("%s",s);逐个输入输出for(i=0;s[i]!='\0';i+如果利用一个scanf函数输入多个字符串,则在输入时以空格分隔(scanf函数遇空格、回车、制表符结束)。例如:charstr1[5],str2[5],str3[5];scanf(″%s%s%s″,str1,str2,str3);输入数据:Howareyou?数组中未被赋值的元素的值自动置′\0′。scanf(″%s″,str1);输入:Howareyou?数组str1中的字符串为“how”,而不是“Howareyou?”str1:str2:str3:如果利用一个scanf函数输入多个字符串,则在输入时以空格分puts()/gets()字符串处理函数c语言大学实用教程数组新课件在C的函数库中提供了一些用来处理字符串的函数,使用方便。几乎所有版本的C编译系统都提供这些函数。下面介绍几种常用的函数。

1.puts函数其一般形式为:puts(字符数组)其作用是将一个字符串(以′\0′结束的字符序列)输出到终端。假如已定义str是一个字符数组名,且该数组已被初始化为"China"。则执行puts(str);其结果是在终端上输出China。由于可以用printf函数输出字符串,因此puts函数用的不多。在C的函数库中提供了一些用来处理字符串的函数,使用方便。几乎用puts函数输出的字符串中可以包含转义字符。例如:charstr[]={″China\nBeijing″};puts(str);输出结果:ChinaBeijing

同时,在输出时,将字符串结束标志′\0′转换成′\n′,即输出完字符串后换行。用puts函数输出的字符串中可以包含转义字符。例如:同时,在2.gets函数其一般形式为:gets(字符数组)其作用是从终端输入一个字符串到字符数组,函数值返回值为字符串的首地址。该函数值是字符数组的起始地址。如执行下面的函数:gets(str);可以输入空格!!从键盘输入:Computer↙2.gets函数将输入的字符串"Computer"送给字符数组str(请注意送给数组的共有9个字符,而不是8个字符。注意:用puts和gets函数只能输入或输出一个字符串,不能写成puts(str1,str2)

或gets(str1,str2)将输入的字符串"Computer"送给字符数组str(请注意scanf()inti;

scanf("%d",&i);

/*假如不用&i,就用i,能达到效果吗?*/charstr[10];

scanf("%s",str);不能读入带空格的字符串,gets()可以这种用法很不安全。当用户的输入多于10个(含10个),str数组将越界scanf被公认为最易遭到黑客攻击的函数之一scanf()inti;

scanf("%d",&i);gets()字符串输入函数gets()也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机对输入字符串长度有限制的函数调用fgets(buf,sizeof(buf),stdin);gets()字符串输入函数gets()也没有提供限制输入字符字符串处理函数在<string.h>中定义了若干专门的字符串处理函数strcpy:string

copy字符串2复制到字符数组1中,应确保字符串数组1足够大strlen:string

length返回字符串的实际长度,不包括'\0‘strcat:string

combination字符串2连接到字符数组1的字符串后面,结果存在字符串数组1中strcmp:string

comparison当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小

赋值运算符“=”不能用于字符串赋值!str1=str2/*错误*/str1=str2/*错误*/字符串不能用关系运算符比较大小!if(str1<str2)/*错误*/字符串处理函数在<string.h>中定义了若干专门的字符串1.strcat函数其一般形式为:strcat(字符数组1,字符数组2)Strcat的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。1.strcat函数例如:charstr1[30]={″People′sRepublicof″};charstr2[]={″China″};printf(″%s″,strcat(str1,str2));或printf(″%s″,str1);输出:People′sRepublicofChina

例如:2.strcpy函数其一般形式为:strcpy(字符数组1,字符串2)

strcpy是“字符串复制函数”。作用是将字符串2复制到字符数组1中去。例如:charstr1[10],str2[]={″China″};strcpy(str1,str2);

str1:2.strcpy函数str1:1.字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。

2.“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。如strcpy(str1,″China″);

3.复制时连同字符串后面的′\0′一起复制到字符数组1中。

4.可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。例如:strcpy(str1,str2,2);作用是将str2中前面2个字符复制到str1中去,然后再加一个‘\0’。1.字符数组1必须定义得足够大,以便容纳被复制的字符串。字符5.不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如下面两行都是不合法的:str1=″China″;str1=str2;

而只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。如下面是合法的:chara[5],c1,c2;c1=′A′;c2=′B′;a[0]=′C′;a[1]=′h′;a[2]=′i′;a[3]=′n′;a[4]=′a′;

5.不能用赋值语句将一个字符串常量或字符数组直接给一个字符数3.strcmp函数其一般形式为:strcmp(字符串1,字符串2)

strcmp的作用是比较字符串1和字符串2。例如:strcmp(str1,str2);strcmp(″China″,″Korea″);strcmp(str1,″Beijing″);3.strcmp函数"A"<"B",

"a">"A","computer">"compare","36+54">"!$&#","CHINA">"CANADA","DOG"<"cat"

字符串比较的规则与其他语言中的规则相同,即对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到′\0′为止。如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。

例如"A"<"B",字符串比较的规则与其他语言中的规则相同,即比较的结果由函数值带回(1)

如果字符串1=字符串2,函数值为0。(2)

如果字符串1>字符串2,函数值为一正整数。(3)

如果字符串1<字符串2,函数值为一负整数。注意:对两个字符串比较,不能用以下形式:if(str1>str2)printf(″yes″);而只能用if(strcmp(str1,str2)>0)printf(″yes″);比较的结果由函数值带回4.strlen函数其一般形式为:strlen(字符数组)

strlen是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括′\0′在内)。如:charstr[10]={″China″};printf(″%d″,strlen(str));输出结果不是10,也不是6,而是5。也可以直接测试字符串常量的长度,如strlen(″China″);

4.strlen函数例kw4有3个字符串,要求找出其中最大者

#include<stdio.h>#include<string.h>voidmain(){charstring[20];charstr[3][20];inti;for(i=0;i<3;i++)gets(str[i]);/*每一个字符串输入以回车结束,若用scanf函数呢?*/if(strcmp(str[0],str[1])>0)/*str[0]比str[1]大*/strcpy(string,str[0]);/*把str[0]赋值个字符串string大*/else

strcpy(string,str[1]);if(strcmp(str[2],string)>0)strcpy(string,str[2]);printf("\nthelargeststringis:%s\n",string);}例kw4有3个字符串,要求找出其中最大者#includ运行结果如下:CHINA↙HOLLAND↙AMERICA↙

thelargeststringis∶HOLLAND运行结果如下:例6.9

从键盘任意输入5个学生的姓名,编程找出并输出按字典顺序排在最前面的学生姓名等价于求最小字符串例6.9从键盘任意输入5个学生的姓名,编程找出并输出按字典#include<stdio.h>#include<string.h>#defineARRA_SIZE80main(){

intn,num;

charstr[ARRA_SIZE],min[ARRA_SIZE]; printf("Pleaseenterfivenames:\n"); gets(str);

strcpy(min,str);

for(n=1;n<5;n++) { gets(str);

if(strcmp(str,min)<0) {

strcpy(min,str);

} } printf("Theminis:"); puts(min);}#include<stdio.h>这一章我们学习了了解了在什么情况下使用数组这种数据类型向函数传递一维数组和二维数组的方法用数组名作为函数参数和用简单变量作为函数参数的不同之处常用算法:求最大值,排序,查找这一章我们学习了了解了在什么情况下使用数组这种数据类型作业P194~1996.1~6.3写在书上6.11~6.12作业P194~199如何计算一个班级学生的平均分数??如何记录直线上的整数点?比如(0,0)、(1、1)、(2、2)、(3、3)、(4、4)、(5、5)。。。数组如何计算一个班级学生的平均分数??数组问题:给一组数排序,这组数该如何存放呢???这些数据如何存放才便于排序82945637617188888888881111111111111118888888888?这便是本章所要解决的问题第6章数组数组问题:给一组数排序,这组数该如何存放呢???这些数据如内容提要数组类型;向函数传递一维数组和二维数组;常用算法:排序、查找、求最大最小值等;用字符数组存取字符串;使用字符串处理函数处理字符串内容提要数组类型;数组的用处保存大量同类型的相关数据如矩阵运算,表格数据等

构造数据类型之一数组:有序数据的集合,用数组名标识元素:属同一数据类型,用数组名和下标确定数组的用处保存大量同类型的相关数据构造数据类型之一6.1一维数组一维数组的定义:数据类型数组名[常量或常量表达式];合法标识符表示元素个数下标从0开始例

inta[6];编译时分配连续内存内存字节数=数组定义的元素个数*sizeof(元素数据类型)数组名表示内存首地址,是地址常量a014523a[0]0145a[1]a[2]a[3]a[4]a[5]23a6.1一维数组合法标识符表示元素个数例inta一维数组的引用数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组数组元素表示形式:数组名[下标]其中:下标可以是整型常量或整型表达式以0开始,到n-1结束例inta[10];printf(“%d”,a);()必须

for(j=0;j<10;j++)printf(“%d\t”,a[j]);()例intdata[5];data[5]=10;//C语言对数组不作越界检查,使用时要注意下标越界是大忌!使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果一维数组的引用例inta[10];例in数组的定义与初始化数组定义后的初值仍然是随机数,一般需要我们来初始化inta[5]={12,34,56,78,9};inta[5]={0};inta[]={11,22,33,44,55};数组大小最好用宏来定义,以适应未来可能的变化#defineSIZE10

inta[SIZE];数组大小定义好后,将永远不变数组的定义与初始化数组定义后的初值仍然是随机数,一般需要我们一维数组的初始化初始化方式在定义数组时,为数组元素赋初值(在编译阶段使之得到初值)inta[5]={1,2,3,4,5};等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;说明:数组不初始化,其元素值为随机数对static数组元素不赋初值,系统会自动赋以0值当全部数组元素赋初值时,可不指定数组长度如inta[5]={6,2,3};等价于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;如inta[3]={6,2,3,5,1};()staticinta[5];等价于:a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;只给部分数组元素赋初值inta[]={1,2,3,4,5,6};编译系统根据初值个数确定数组元素个数一维数组的初始化在定义数组时,为数组元素赋初值inta[①floata[0]; /*数组大小为0没有意义*/

②intb(2)(3);/*不能使用圆括号*/

③intk,a[k];/*不能用变量说明数组大小*/

数组说明中其他常见的错误①floata[0]; /*数组大小为0没有数组的特点快速地随机访问一旦定义,不能改变大小数组的特点快速地随机访问只能逐个对数组元素进行操作(字符数组例外)输入方法:inta[10],i;输入第i个数组元素:scanf("%d",&a[i]);输入整个数组元素:for(i=0;i<10;i++)scanf("%d",&a[i]);输出方法:输出第i个数组元素:printf("%d",a[i]);输出整个数组元素:for(i=0;i<10;i++)printf("%d",a[i]);一维数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)输入方法:int程序举例例将10个整数存入数组,并打印输出。#include<stdio.h>#defineSIZE10main(){intx[SIZE]={0,1,2,3,4,5,6,7,8,9};inti;

for(i=0;i<SIZE;i++)printf("%d",x[i]);}#include<stdio.h>#defineSIZE10main(){intx[SIZE],i;printf("Enter10integers:\n");

for(i=0;i<SIZE;i++) scanf("%d",&x[i]);

for(i=1;i<SIZE;i++)

printf("%d",x[i]);}程序举例例将10个整数存入数组,并打印输出。#inclu程序举例例读10个整数存入数组,找出其中最大值和最小值步骤:1.输入:for循环输入10个整数2.处理:(a)先令max=min=x[0](b)依次用x[i]和max,min比较(循环)若max<x[i],令max=x[i]

若min>x[i],令min=x[i]3.输出:max和min#include<stdio.h>#defineSIZE10main(){intx[SIZE],i,max,min;printf("Enter10integers:\n");

for(i=0;i<SIZE;i++) scanf("%d",&x[i]);

max=min=x[0];

for(i=1;i<SIZE;i++){if(max<x[i])max=x[i];if(min>x[i])min=x[i];}printf("Maximumvalueis%d\n",max);printf("Minimumvalueis%d\n",min);}程序举例例读10个整数存入数组,找出其中最大值和最小值步文曲星猜数游戏由计算机随机生成一个各位相异的4位数字,由人来猜,每次提示:xAxBA前面的数字表示有几个数字猜对位置也对了B前面的数字表示有几个数字猜对但位置不对提示用数组a存计算机随机生成的4位数用数组b存人猜的4位数对a和b的相同位置的元素进行比较,得到A前面的数字对a和b的不同位置的元素进行比较,得到B前面的数字文曲星猜数游戏由计算机随机生成一个各位相异的4位数字,由人来文曲星猜数游戏随机生成一个各位相异的4位数字

srand(time(NULL));a[0]=rand()%10;

do{ a[1]= rand()%10;}while(a[0]==a[1]);

do{ a[2]=rand()%10;}while(a[0]==a[2]||a[1]==a[2]);

do{ a[3]=rand()%10;}while(a[0]==a[3]||a[1]==a[3]||a[2]==a[3]);文曲星猜数游戏随机生成一个各位相异的4位数字文曲星猜数游戏统计数字和位置都猜对的个数,对a和b的相同位置的元素进行比较,得到A前面的数字

right=0;

for(j=0;j<4;j++) {

if(a[j]==

b[j]) { right=right+1; } }j=0j=1j=2j=3ab文曲星猜数游戏统计数字和位置都猜对的个数,对a和b的相同位置文曲星猜数游戏统计人猜对的数字个数,对a和b的不同位置的元素进行比较,得到B前面的数字

good=0;

for(j=0;j<4;j++) {

for(k=0;k<4;k++) {

if(a[k]==b[j]) {

good=good+1; } } }

good=good-right;k=0k=1k=2k=3j=0abj=1文曲星猜数游戏统计人猜对的数字个数,对a和b的不同位置的元素餐饮服务质量调查打分有40个学生被邀请给自助餐厅的食品和服务质量打分(1~10等级),统计调查结果,并用*打印如下形式的统计结果直方图

GradeCount Histogram1 5 *****2 10 **********3 7 ******* ...餐饮服务质量调查打分有40个学生被邀请给自助餐厅的食品和服餐饮服务质量调查打分提示定义数组score存放打的分数定义数组count为计数器(count[0]不用)计算统计结果:设置一个循环,依次检查数组元素值score[i],是1则将数组元素count[1]加1,是2则将数组元素count[2]加1,依此类推 for(i=0;i<STUDENTS;i++) { count[score[i]]++; }打印统计结果,设置一个循环,按count数组元素的值,打印相应个数的符号’*’餐饮服务质量调查打分提示例6.1兔子繁殖问题打印每个月和年底时的总的兔子对数Fibonacci数列123581321345589144233,…

例6.1兔子繁殖问题例6.1#include<stdio.h>#defineYEAR_MONTH12main(){

intf[YEAR_MONTH+1]={0,1,2};

intmonth;

for(month=3;month<=YEAR_MONTH;mon

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论