c语言之数组

数组

知识点:

一.一维数组

1. 初始化方法

第一种:完全初始化。依次赋值

如:a[5] = {2,3,4, 5, 6};

a[] = {1,2, 3, 4, 5, 6};

 

第二种:不完全初始化。初始化式中的值从a[0]开始,依次向后赋值,不足的默认用0填充赋值

如:a[5] = {4, 5, 6};

 

第三种:间隔初始化。未赋值的默认用0填充赋值

如:a[5]={100, [4] = 99};

a[5]={[1]=100, [4] = 99};

a[3000]={[5] = 200};

 

注:数组初始化之后不能再整体重新赋值,但可以单独重新赋值

 

2. 指针与数组的结合

数组名:数组名表示数组的首元素首地址,因此作右值可以直接赋值给指针。

 

如果有 int a[5];

则 a和&a[0]都表示数组首元素a[0]的首地址。(指向首元素)

而&a则表示数组的首地址。(指向整个数组)

 

3、字符数组

a、定义:char a[10];字符数组a长度为10。每个元素只能存放一个字符。

例如:

a[0]='h';a[1]='a';a[2]='p';……

b、初始化:

char a[]={'h','a','p','p','y'};

char a[]="happy";

char a[]={"happy"}; 注意,因为字符串结尾自动加'\0',所以char a[]="happy";长度为6,不是5。

c、C语言中没有字符串变量,字符串的输入、存储、处理和输出等必须通过字符数组实现。

4、字符串的输入。

scanf();可以用%c逐个字符输入比如char a[6];for(i=0;i<6;i++) scanf("%c",&a[i]);

可以用%S以字符串的形式输入,比如char a[6];scanf("%s",a);注意,a前不用加&,因为a是数组名,

已经代表了数组首地址。

注意:以%S输入时,以第一个非空白字符开始,终止于第一个空白字符。比如:输入How are you

时。只输出How.

gets();作用为输入一个字符串。与scanf();功能一致,但空格和回车都存放在数组中,最后自动加入‘\0’.

不会出现上面输出不全的情况。

调用方式为:gets(数组名);需要包含头文件“stdio.h”.

5、字符串的输出。

printf();可以使用%C逐个字符输出,比如:char a[6];for(i=0;i<6;i++) printf("%c",a[i]);

可以用%S以字符串的形式输出,比如char a[6];printf("%s",a);

puts();输出一个字符串,结尾自动换行。

调用形式:puts(字符数组名或字符串常量);需包含头文件“stdio.h”

常用字符串处理函数(以下函数需要头文件“string.h”)

a、strlen()作用是测试字符串长度。这里不包括‘\0’.使用形式strlen(数组名或字符串常量)

b、strcat()作用是连接两个字符串。调用方式strcat(字符数组1名,字符数组2名);合并后的字符串存放在字

符数组1中。

c、strcmp()比较两个字符串是否相等。调用方式strcmp(字符串1,字符串2);相等时值为0。1>2时为正数。

1<2时为负数。

d、strcpy()复制字符串。调用方式strcpy(字符数组1,字符串2);2的内容复制到1中。1只能是字符数组名。

 

解决问题:

①寻找配对数

#include<iostream>

using namespace std;

int main()

{int n,i,j,k,m,s=0;

cin>>n;

int a[1001];

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

cin>>a[i];

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

for(k=j+1;k<=n;k++)

for(m=k+1;m<=n;m++)

if(a[j]*a[k]==a[m]||a[j]*a[m]==a[k]||a[m]*a[k]==a[j])

s++;

cout<<s;

return 0;

}

注意循环变量的循环范围,j,k和m要保证都不一样。

②数组的逆序重放

需要指针,定义两个数组,

#include<iostream>

using namespace std;

int main()

{

    int a[101],b[101];

    int i,j,m=0,n;

    cin>>n;

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

    cin>>a[i];

    for(j=n-1;j>=0;j--)

   {

    b[m]=a[j];

    m++;

   }

   cout<<b[0];

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

   cout<<" "<<b[i];

}

③计算鞍点

#include <iostream>

using namespace std;

#define N 5

int a[N][N];

 

int main() {

int Max, Min, Ni, Nj;

int q = 0;

for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++)

cin >> a[i][j];

}

int i, j;

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

Max = a[i][0];

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

if (a[i][j]>=Max) {

Ni = i;

Nj = j;

Max = a[i][j];

}

}

Min = Max;

for (int k = 0; k < N; k++) {

if (a[k][Nj] < Min)

Min = a[k][Nj];

}

if (Max == Min) {

q = 1;

cout << Ni+1 << " " << Nj+1 << " " << Max << endl;

break;

}

}

if (q == 0)

cout << "not found";

 

return 0;

}

④矩阵交换行

#include<iostream>

using namespace std;

int main()

{

int a[6][6];

int m,n;

for(int i=1;i<=5;i++)

{

for(int j=1;j<=5;j++)

{

cin>>a[i][j];

     }

}

cin>>m>>n;

for(int j=1;j<=5;j++)

swap(a[m][j],a[n][j]);

for(int i=1;i<=5;i++)

{

for(int j=1;j<=5;j++)

{

cout<<a[i][j]<<" ";

}

    cout<<endl;

}

}

当然还可以解决一些更复杂的问题。

 

 

感想,,学了那么久的c,真的是越来越难啊!!

很多时候,可以想到的事情,却无法用代码表示出来。。真的好苦恼。

加油^0^~,还有一周的程序设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值