数组
知识点:
一.一维数组
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^~,还有一周的程序设计。