c的详细学习(5)数组
到目前为止,前面介绍的都是属于基本类型的数据。除此之外,C语言还提供了一些更为复杂的数据类型,称为构造类型。数组就是最基本的构造类型。若要针对一批数据进行某种操作,采用数组是一种方便可行的方法。
(1)一维数组:
1.一维数组的定义与引用
数组在引用之前必须事先定义。定义的作用是通知编译程序在内存中分配出连续的单元供数组使用。
一维数组定义的一般形式:
类型说明符 数组名[正整型常量表达式]
*正整型常量表达式可以使符号常量或字符常量。
int c['A'];
*在使用数组的过程中要注意数组下标不能越界。
2.一维数组的初始化
定义时给数组赋值,称为数组的初始化。具体实现的方法如下:
*定义时初始化:
int x[5]={2,4,6,8,10};
*给数组中部分元素赋初值:
int a[6]={3,4,5};表示仅仅把a[0],a[1],a[2]赋初值,其余为0。
*初值的个数不允许大于定义数组时限定的元素个数:
int a[2]={1,2,3};是错误的。
*对数组全部元素的赋值可以不指定元素的个数:
int b[5]={0,1,2,3,4};可以写成int b[]={0,1,2,3,4};
3.一维数组的程序举例:
3.1利用数组计算斐波那契数列的前20个数,并以每行5个数输出:(斐波那契数列的前两个数都是1,从第3个数开始,每个数都是前两个数之和,f[0]=f[1]=1,f[n]=f[n-1]+f[n-2],2<=n<=19。)
#include<stdio.h> int main(){ int i,f[]={,};
for(int i=;i<;i++){
f[i]=f[i-]+f[i-];
}
for(int i=;i<;i++){
if(i%==&&i!=){
printf("\n");
}
printf("%6d",f[i]);
}
printf("\n");
return ;
}
3.2采用冒泡法,实现对一维数组中元素数据,按从小到大排序。
冒泡排序的思想是:从第一个数开始,用第一个数同第二个数进行比较,如果前一个数大于后一个数,则交换两个数,否则不进行交换。再用第二个同第三个数进行比较,如果前一个数小于后一个数则不交换,否则进行交换。这样比较下去就将数组中的最大数交换到最后了。如果有n个数,第一遍要比较n-1次。然后进行下一轮的比较,共比较n-2次,将第二次大的数放在了倒数第二位置,这样继续进行下去直到整个数组排序完毕为止。n个数据一共要比较n-1遍,用程序实现时采用双层循环,外层循环控制比较多少遍,内层循环控制每一遍要比较多少次。过程如下。
#include<stdio.h> int main(){ int i,j,n,temp,a[];
scanf("%d",&n);
printf("The origin numbers:\n");
for(i=;i<n;i++){
scanf("%d",&a[i]);
}
for(i=;i<n-;i++){
for(j=;j<n-i;j++){
if(a[j-]>a[j]){
temp=a[j-];
a[j-]=a[j];
a[j]=temp;
}
}
}
printf("The sorted number:\n");
for(i=;i<n;i++)
printf("%d ",a[i]);
return ;
}
(2)二维数组的定义与引用
1.二维数组的定义与引用:
具有两个下标的数组元素构成的数组称为二维数组。在许多实际应用中,常常需要使用二维数组,以更方便的解决问题。二维数组的形式类似数学中的矩阵。
二维数组在内存中的存储的顺序是"按行优先级原则顺序存放。"
2.二维数组的初始化:
*按行给二维数组置初值。
int a[2][3]={{1,2,3},{4,5,6}};
在赋值号后边的一对大括号中,第一对大括号代表第一行的数组元素,第二对大括号代表第二行的数组元素。
*将所有的数组元素按行顺序写在一个大括号内:
int a[2][3]={1,2,3,4,5,6};
*对部分数组元素赋初值:
int b[3][4]={{1},{4,3},{2,1,2}};
*如果对全部数组元素置初值,则二维数组的第一个下标可以省略,但第二个下标不能省略:
int a[2][3]={1,2,3,4,5,6}可以写成int a[][3]={1,2,3,4,5,6};
3.二维数组的程序举例:
3.1将矩阵a2*3转存到b3*2存储
#include<stdio.h> int main(){ int i,j,a[][]={{,,},{,,}},b[][];
printf("Array a:\n");
for(i=;i<;i++){
for(j=;j<;j++){
printf("%5d",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
printf("Array n:\n");
for(i=;i<;i++){
for(j=;j<;j++){
printf("%5d",b[i][j]);
}
printf("\n");
}
return ;
}
3.2求一个班级10名学生4门课程的平均成绩:
为了调试程序方便,使用随机数生成10名学生的各科成绩。生成随机数的函数rand(),该函数在stdlib.h中定义。rand()%b+a可以生成从a到b之间(包括a不包括b的随机整数)为了使每次生成的随机整数都不同,则在使用rand函数之前要使用包含在time.h中的srand(time(NULL))重新部署一下种子;
#include<stdio.h>
#include<time.h>
#include<stdlib.h> int main(){
int i,j,sum,grade[][];
double aver;
srand(time(NULL));//为了产生不同的随机数,重置随机种子
for(i=;i<;i++){
for(j=;j<;j++){
grade[i][j]=rand()%6+;//生成大于20的两位随机整数
}
}
for(i=;i<;i++){
sum=;
for(j=;j<;j++){
sum+=grade[i][j];//累计每名学生的各科总成绩
}
aver=sum/4.0;//求每名学生的平均成绩
printf("The average score of %d student:%5.1lf\n",i+,aver);
}
return ;
}
(3)字符数组
在数组中,若每个数组元素存放的都是字符型数据,则称为字符数组。
1.字符数组的定义
字符数组用char来说明其类型,一维字符数组可以用char c[5],也可以定义为int c[5];
当将一个字符常量赋给整型字符数组数组元素时,是将该字符的ASCII码的值赋给了相应的数组元素(下标变量)。字符型和整型可以互相通用。
2.字符数组的初始化
char c[7]={'p','r','o','g','r','a','m'};
*若花括号中的初值个数大于数组的长度,则按语法错误处理。
*若花括号中的初值个数小于数组的长度,其余的元素自动添入空字符'\0'。
3.字符数组与字符串
在c语言中,用字符数组存放字符串。在定义数组时,也可以用字符串为字符数组赋初值,例如:
char c[]={'C Program'};
或char c[]="C Program";
这时c数组的长度为10,在字符m的后面的字节中系统自动添加了空字符'\0'。
若采用下面的方法进行初始化:
char c[]={'T','h','e',' ','C',' ','L','a','n','g','u','a','g','e'};
与char c[]={"The C Language"};
上述字符串的长度相同,但他们在内存中占用的空间不同。前者是14,后者是15。
4.字符数组的输入和输出
字符数组的输入和输出有以下两种格式:
*%c格式用于一个字符的输入和输出。
*%s格式用于一个字符串的输入和输出。
1)在输出字符串时,遇到字符'\0'就停止输出。'\0'是空操作,不输出任何字符。所以无论后面还有多少个'\0',都只有第一个起作用。
2)在scanf函数中使用%s时,再输入项中不要加地址符号'&',直接写出字符数组名即可,因为数组名表示该数组在内存的起始地址。
3)如果用scanf函数输入多个字符串,则字符串间用空格分隔。
char str1[4],str2[4],str3[5];
scanf("%s%s%s",str1,str2,str3);
若输入:
How are you!<回车>
则三个单词分别被存到字符数组里。
如果要输入带空格的字符串,最好用gets函数,若要用scanf("%s",s);则只接收字符串中第一个空格前的字符。
(4)字符串处理函数:
c语言函数库提供了字符串处理函数,这些函数定义在string.h库文件中。用户可以使用预编译命令#include<string.h>将文件string.h包含在程序中,直接引用字符串函数。
1.输出字符串函数puts();
2.输入字符串函数gets();
3.字符串连接函数strcat();
4.字符串复制函数strcpy();
5.字符串比较函数strcmp();
6.检测字符串长度函数strlen();
7.字符串小写函数strlwr();
8.字符串大写函数strupr();
实例测试如下:
#include<stdio.h>
#include<string.h> int main(){
printf("1.输出字符串函数puts()的实例:\n");
char c[]="你好啊!\t我很好!";
puts(c);
printf("\n"); printf("2.输入字符串函数gets()的实例:\n");
char str1[];
gets(str1);//这里不能用str2=gets(str1);因为不能将char*转化为char[10];
puts(str1);
printf("\n"); printf("3.字符串连接函数strcat()的实例:\n");
char st1[]="Microsoft ";//将字符串2连接到1的后面,结果放在字符串数组1中。
char st2[]="Computer";//第一个字符串定义的长度要大于连接后的字符串的长度。
printf("%s",strcat(st1,st2)); //后面字符串与前面的字符串连接时,去掉前面字符串后面的'\0';
printf("\n");
printf("\n"); printf("4.字符串复制函数strcpy()的实例:\n");
char c1[];
char c2[]="student!" ;
strcpy(c1,c2);
puts(c1);
printf("\n"); printf("5.字符串比较函数strcmp():\n");
char a1[]="abcc";
char a2[]="abcd";
if(strcmp(a1,a2)){
printf("测试成功!\n");
}
printf("\n"); printf("6.检测字符串长度函数strlen()的实例:\n");
int length;
char aa[]="字符串的长度为8!";//中文一个算俩,数字一个,叹号一个,'\0'算一个。共17个!
printf("The length is %d:\n",strlen(aa));
printf("\n"); printf("7.字符串大写函数strupr()的实例:\n");
char string1[]="This";
printf("%s",strlwr(string1));
printf("\n");
printf("\n"); printf("8.字符串小写函数strlwr()的实例:\n");
char string2[]="This";
printf("%s",strupr(string2));
printf("\n");
return ;
}
(5)字符数组应用举例:
1.编写程序打印菱形图案:
#include<stdio.h>
#include<math.h>
#define L 3 //定义宏,代表基准行上边或下边的行数
#define Z 2*L+1//定义宏,代表菱形图案的总的行数 int main(){
int m,n;
for(m=-L;m<=L;m++){
for(n=;n<fabs(m);n++){
printf(" ");
}
for(n=;n<Z-*fabs(m);n++){
printf("*");
}
printf("\n");
}
return ;
}
2.不使用strcat()函数将两个字符串连接起来:
#include<stdio.h> int main(){
char str1[],str2[];
int i=,j=;
printf("请输入第一个字符串:\n");
gets(str1);
printf("请输入第二个字符串:\n");
gets(str2);
while(str1[i]!='\0'){
i++; //将前字符串下标定位到字符串尾部 '\0'的位置。
}
while(str1[i++]=str2[j++]!='\0');
printf("连接后的字符串是:\n");
puts(str1);
return ;
}
在上述代码的结果中存在一个明显的错误下面是修改后的代码:
#include<stdio.h> int main(){
char str1[],str2[];
int i=,j=;
printf("请输入第一个字符串:\n");
gets(str1);
printf("请输入第二个字符串:\n");
gets(str2);
while(str1[i]!='\0'){
i++; //将前字符串下标定位到字符串尾部 '\0'的位置。
}
while(str2[j]!='\0'){
str1[i]=str2[j];
i++;
j++;
}
str1[i]='\0';
printf("连接后的字符串是:\n");
puts(str1);
return ;
}
3.输出若干字符串中的最短的字符串:
#include<stdio.h>
#include<string.h> int main(){
char str1[],min[];
int k,len;
printf("Input a string!\n");
gets(str1);
strcpy(min,str1);
len=strlen(min);
gets(str1);
while(str1[]!='\0'){//以空字符串作为结束标记
k=strlen(str1);
if(k<len){
len=k;
strcpy(min,str1);
}//确定最短字符串
gets(str1);//继续输入其他字符串
}
printf("len=%d,min=%s\n",len,min);
return ;
}
(6)数组的编程实例:
1.用选择法对10个整数按从小到大的顺序排序:
选择法排序的思想,首先从1~n个元素中选择最小的数交换到第一个位置上,然后从第2~n个元素中选出次小的数交换到第二个位置上,以此类推!
#include<stdio.h>
#include<string.h> int main(){
int a[];
int temp=;
printf("Please input 10 number:\n");
for(int i=;i<;i++){
scanf("%d",a+i);
}
printf("你输入的数据在数组中:\n");
for(int i=;i<;i++){
printf("%4d",a[i]);
if((i+)%==&&i!=){
printf("\n");
}
}
for(int i=;i<;i++){
for(int j=i;j<;j++){
if(a[i]>a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
printf("排序后的结果输出如下:\n");
for(int i=;i<;i++){
printf("%4d",a[i]);
if((i+)%==&&i!=){
printf("\n");
}
}
return ;
}
在这里出现一个意料之外的现象,如果将21~23行的代码封装到一个函数中,貌似不能达到交换数值的目的。
#include<stdio.h>
#include<string.h> void swap(int a,int b){
int temp=;
temp=a;
a=b;
b=temp;
}
int main(){
int a=;
int b=;
printf("交换之前的a=%d,b=%d\n",a,b);
swap(a,b);
printf("交换之后的a=%d,b=%d\n",a,b);
return ;
}
--这里用地址传递结果就会正确!
2.编写程序打印杨辉三角形(要求打印7行):
#include<stdio.h>
#include<string.h> int main(){
int a[][];
for(int i=;i<;i++){
a[i][]=;
a[i][i]=;
}
for(int i=;i<;i++){
for(int j=;j<i;j++){
a[i][j]=a[i-][j-]+a[i-][j];
}
}
for(int i=;i<;i++){
for(int j=;j<=i;j++){
printf("%4d",a[i][j]);
}
printf("\n");
}
return ;
}
3.编写程序判断给定字符串是否为回文数。(回文是指正读和逆读都一样的字符串):
#include<stdio.h>
#include<string.h> int main(){
char a[];
char b[];
int flag=;
int i=;
printf("Please input a string!");
gets(a);
while(a[i++]!='\0'){
flag++;
}
for(int i=;i<flag;i++){
b[flag-i-]=a[i];
}
i=;
while((a[i++]!=b[i++])&&(a[i]!='\0')){
printf("此字符串不是回文数.\n");
return ;
}
printf("此字符串是回文数!\n");
return ;
}
c的详细学习(5)数组的更多相关文章
- PHP学习之中数组-遍历一维数组【2】
在PHP学习之中数组[1]中学会怎么创建一个数组,如果PHP学习之中数组[1]中的元素多的话,我们访问元素又是一个问题了,下面我们就使用for语句while,foreach来遍历我们的数组: < ...
- Python学习之数组类型一:
Python学习之数组类型一: Numpy中的向量与矩阵: 1.创建: 向量.矩阵均由array函数创建,区别在于向量是v=array( [逗号分隔的元素] ), 矩阵是M=array( [[ ]] ...
- [ 转载 ] Java基础12--基础学习总结——数组
java基础学习总结——数组 一.数组的基本概念 数组可以看成是多个相同类型数据组合,对这些数据的统一管理. 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量. 数组的 ...
- Hbase技术详细学习笔记
注:转自 Hbase技术详细学习笔记 最近在逐步跟进Hbase的相关工作,由于之前对Hbase并不怎么了解,因此系统地学习了下Hbase,为了加深对Hbase的理解,对相关知识点做了笔记,并在组内进行 ...
- Numpy学习之——数组创建
Numpy学习之--数组创建 过程展示 import numpy as np a = np.array([2,3,9]) a array([2, 3, 9]) a.dtype dtype('int32 ...
- 详细学习ORACLE JOBS
一点一点学习jobs的各个方面比较长,比较烦,但是应该看完后会对jobs比较好的应用 一.学习准备 开始dbms_job学习前,先认识一个参数job_queue_processes a.job_que ...
- [jQuery学习系列二 ]2-JQuery学习二-数组操作
前言 上一篇内容 已经对于Jquery 有了一些认识, 包括Jquery的选择器和DOM对象, 那么这一篇继续来看下Jquery中很实用的Jquery对于数组的操作. Jquery中对数组的操作大致有 ...
- java学习之数组(一)【内存】
在java语言当中,为了更方便多个数据的管理,这里提供数组. 比如说,现在我们有一组数据,7,8,9,9,为了保存这四个数据,我们分别要定义变量来保存,少了还好说.但是假如,有100多个数据呢,我们一 ...
- Java菜鸟学习笔记--数组篇(三):二维数组
定义 //1.二维数组的定义 //2.二维数组的内存空间 //3.不规则数组 package me.array; public class Array2Demo{ public static void ...
随机推荐
- C#动态生成XML
通过C#动态生成图书信息XML文件(Books.xml),文件如下: <?xml version="1.0" encoding="iso-8859-1"? ...
- python按行读取apk中版本号、包名等信息
主要是读apk中manifest.xml中的信息. 读单一apk信息:见“文件”中“apkInfo.xml”.实际运行时,需要将后缀由“.xml”改为“.py". 批量自动获取apk软件信息 ...
- url中带有加号的处理方法
最近项目中出现了一个问题,图片的路径正确,但是转成URL之后无法找到... 找了各种原因之后,最后注意到URL中的图片名称和本地路径名称有点不一样,如下图 1.URL图片 2.本地路径 上网查了一下发 ...
- FormatFloat
http://www.delphibasics.co.uk/RTL.asp?Name=FormatFloat 1 function FormatFloat ( const Formatting : ...
- ASP.NET CORE RAZOR :将搜索添加到 Razor 页面应用
https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/search 本文档中,将向索引页面添加搜索功能以实现按“流派”或 ...
- 深入理解Tomcat系列之五:Context容器和Wrapper容器
前言 Context容器是一个Web项目的代表,主要管理Servlet实例,在Tomcat中Servlet实例是以Wrapper出现的.如今问题是怎样才干通过Context容器找到详细的Servlet ...
- HDU 4883 TIANKENG’s restaurant Bestcoder 2-1(模拟)
TIANKENG's restaurant Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/O ...
- python .py .pyc .pyw .pyo .pyd区别
.py 文件 以 .py 作扩展名的文件是 Python 源代码文件,由 python.exe 解释,可在控制台下运行.当然,也可用文本编辑器进行修改. .pyc 文件 以 .pyc 作扩展名的文件是 ...
- MySQL_知识点
1.执行顺序 语句模板: (8)SELECT (9)DISTINCT (11)<Top Num> <select list> (1)FROM [left_table] (3)& ...
- Springboot Maven 多模块项目中 @Service跨模块引用失败的问题
子模块中引用另一个子模块中的Service, @Autowired失败. 添加了模块之间的依赖没解决. 组以后在启动类上加上 @SpringBootApplication(scanBasePackag ...