数组基本操作
数组逆置
- 函数
void reverse(int a[],int n){
int i,r;
for(i=0;i<n/2;i++){//数组逆置for循环判断条件为i<n/2
r=a[i];
a[i]=a[n-1-i];
a[n-1-i]=r;
}
}
- 测试函数
#include "stdio.h"
void reverse(int a[],int n){
int i,r;
for(i=0;i<n/2;i++){
r=a[i];
a[i]=a[n-1-i];
a[n-1-i]=r;
}
}
int main(){
int a[5]={1,2,3,4,5};
int i;
reverse(a,5);
for(i=0;i<5;i++)printf("%d",a[i]);//printf(“%d”,n);
return 0;
}
用数组实现最大值最小值
#include "stdio.h"
int main(){
int n;
int max,min;
scanf("%d",&n);
int i;
int a[n];
for(i=0;i<n;i++)scanf("%d",&a[i]);
max=a[0];//求一串数的最值时注意,把max,min设成a[0]再遍历数组通过替换得到所求最值
min=a[0];
for(i=0;i<n;i++){
if(a[i]<min)min=a[i];
if(a[i]>max)max=a[i];
}
printf("%d\n%d",max,min);
return 0;
}
用数组实现求和(实现平均值)
for(i=0;i<n;i++)sum+=a[i];
average=sum/n;
数组排序
1.用选择排序遍历数组
#include "stdio.h"
int main(){
int n;
scanf("%d",&n);
int i;
int a[n];
for(i=0;i<n;i++)scanf("%d",&a[i]);
int j,temp;
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){//对于每一个i都用j=i+1遍历数组确保每一个a[i]都在正确的位置上
if(a[j]<a[i]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(i=0;i<n;i++)printf("%d",a[i]);
return 0;
}
2.冒泡法数组排序
函数段
void f(int a[],int n){
int i,r;
bool flag=true;
while(flag){
flag =false;
for(i=0;i<n;i++){
if(a[i]>a[i+1]){
r=a[i];
a[i]=a[i+1];
a[i+1]=r;
flag=true;
}
}
}
}
测试程序
//冒泡法数组排序加输出
#include "stdio.h"
#include "stdbool.h"
void f(int a[],int n){
int i,r;
bool flag=true;
while(flag){
flag =false;
for(i=0;i<n;i++){
if(a[i]>a[i+1]){
r=a[i];
a[i]=a[i+1];
a[i+1]=r;
flag=true;
}
}
}
}
int main (){
int n;
scanf("%d",&n);
int i;
int a[n];
for(i=0;i<n;i++)scanf("%d",&a[i]);
f(a,n);
for(i=0;i<n;i++)printf("%d",a[i]);
return 0;
}
3.插入法数组排序
void f(int n,int a[]){
int i,j,k,r;
for(i=1;i<n;i++){
j=i-1;
while((a[j]>a[i])&&(j>=0))j=j-1;
r=a[i];
for(k=i-1;k>=j+1;k--)a[k+1]=a[k];
a[j+1]=r;
}
}
指针数组专题
指针标记数组进行求和(两个指针标记数组大小)
#include<stdio.h>
#define SIZE 5
int sump(int *start,int *end);
int main(){
int num[SIZE]={1,2,3,4,5};
long answer;
answer=sump(num,num+SIZE);
printf("The total number is %d.",answer);
return 0;
}
int sump(int *start,int *end){
int total=0;
while(start<end){
total+=*start;
start++;
}
return total;
}
数组每项依次+相同值
#include "stdio.h"
void f(int a[],int n,int plus){
int i;
for(i=0;i<n;i++)a[i]+=plus;
}
int main(){
int a[5]={1,2,3,4,5};
f(a,5,1);
int i;
for(i=0;i<5;i++)printf("%d",a[i]);
return 0;
}
数组一个用来输出一个用来进行数乘操作,输出原本数组和操作后的数组
#include "stdio.h"
void show(const float a[],int n);
void change(float a[],int n,float mult);
int main(){
float a[5]={1,2,3,4,5};
show(a,5);
change(a,5,2.5);
show(a,5);
return 0;
}
void show(const float a[],int n){
int i;
for(i=0;i<5;i++)printf("%f\n",a[i]);
}
void change(float a[],int n,float mult){
int i;
for(i=0;i<n;i++)a[i]*=mult;
}
矩阵转置
- 定义新数组传入
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[n][n],b[n][n];
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++)scanf("%d",&a[i][j]);
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)b[j][i]=a[i][j];
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(j<n-1)printf("%d ",b[i][j]);
else printf("%d\n",b[i][j]);
}
}
return 0;
}
2.不需要新数组,只需要设一下循环内部的判断条件
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
if(i <= j){
temp = a[i][j]; /*行列元素互换*/
a[i][j] = a[j][i];
a[j][i] = temp;
}
}
}
测试函数
#include "stdio.h"
int main(){
int n;
scanf("%d",&n);
int a[n][n];
int i,j,temp;
for(i=0;i<n;i++){
for(j=0;j<n;j++)scanf("%d",&a[i][j]);
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(i<=j){
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
{
if(j<n-1)printf("%d ",a[i][j] );
else printf("%d\n",a[i][j]);
}
}
return 0;
}