数组实现的本周
arry[0] 为基地址
arry[i]被编译器解释为指向 arry + i *sizeof ( data type ) 的指针
————————————————————————————————————————————————————数组作为函数参数
①数组元素就是下标变量,它与普通变量并无区别。
形参和实参占用不同储存位字,所以实参不会受形参影响,用return才能得到形参
void nzp(int v){
if(v>0)
printf("%d ",v);
else
printf("%d ",0);
}
int main(void){
int a[5],i;
printf("input 5 numbers\n");
for(i=0;i<5;i++){
scanf("%d",&a[i]);
nzp(a[i]);
}
return 0;
}
②数组名作为函数参数
形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。
所以形参可以看做实参,形参的运算对实参产生影响
void nzp(int a[5]){
int i;
printf("\nvalues of array a are:\n");
for(i=0;i<5;i++){
a[i]=0;
printf("%d ",a[i]);
}
}
int main(void){
int b[5],i;
printf("\ninput 5 numbers:\n");
for(i=0;i<5;i++)
scanf("%d",&b[i]);
printf("initial values of array b are:\n");
for(i=0;i<5;i++)
printf("%d ",b[i]);
nzp(b);
printf("\nlast values of array b are:\n");
for(i=0;i<5;i++)
printf("%d ",b[i]);
return 0;
}
数组已经改变
————————————————————————————————————————————————————
动态构造二维数组
二维数组的实际表示是 一个一维数组 ,其中每个单元本身又是一个一维数组
创立步骤
1. type data **arry
2. 先给一个一维数组分配空间
3. 再这个一维数组的每一个单元分配一维数组
#include<stdio.h>
#include<stdlib.h>
// 创建一个 arry[5][5]
int **create (int**x)
{ int q=0;
x=(int**) malloc( sizeof(int) *5 );
for(q=0;q<5;q++ )
x[q]= (int *)malloc( sizeof(int) *5 );
x[2][1]=3;
return x;
}
int main(void)
{
int **x;
x= create(x);
printf("%d", x[2][1]);
}
————————————————————————————————————————————————————
do while 用法 ,至少执行一次,如果满足条件继续执行
do {
}
while ( 条件 ) ; //注意这个;
————————————————————————————————————————————————————
检查结构体是否相等的方法: 构造每一项对比的函数
结构日中亦可以放入结构体
————————————————————————————————————————————————————
枚举类型
enum week{ mon,tue,thrus
}day; //写法类似struct
enum week{ mon,tue,thrus
}day; 枚举默认mon为0,tue为1.......
enum week{mon,tue=2,thrus
}day=tue; //
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
多项式
譬如:A(x) = 3x20 + 2x5 + 6x3 + x + 4 ,
B(x) = 7x5 + x4 + 10x3 + 3x2 + 1
多项式结构:
struct polynomial
{ float ceof ; //系数
int expon; //指数
}
首先分配了固定的空间 struct polynomial terms[MAXSIZE];
几个多项式按照顺序一个接着一个共用这个空间
startA,finishA为 A项的初位和末位
// 系数X指数
//注意某些编译器须要在开头处申明变量,不能在其他地方
i=0;
while(输入A的时候)
{ 输入 term[i++]的coef和exp;}
finishA=i-1;
startB=i;
j=startB;
while(输入B的时候)
{ 输入 term[j++]的coef和exp;}
avail= j ;
//avail 可以做下一个多项式的起始位置;
多项式加法:(注意这里的多项式应该是标准的,指数大的靠前)
D=A+B
while(startA<= finishA&& startB<= finishB)
{ if( term[startA]的指数 >term[startB]的指数) 使D的多项式下一个为 term[startA] 。startA++
if( term[A]的指数 =term[A]的指数) 使D的多项式下一个为term[startA]和term[startB]系数相加,指数不变,
且startB++ startA++
if( term[A]的指数 >term[A]的指数) 使D的多项式下一个为 term[startB] 。startB++
}
//可能出现一个多项式全部加入到D项中,而另一个多项式因为前一个多项式已经扫描结束而一起结束,所以加上下面的函数
for(;startA<=finishA;startA++)
attach(terms[startA].ceof , terms[startA].expon,terms,avail );
for(;startB<=finishB;startB++)
attach(terms[startB].ceof , terms[startB].expon,terms,avail );
————————————————————————————————————————————————————
D的多项式是从avail开始
void attach(float coef,int exon,polynomial *terms,int *avail )
{ if( *avail > MAX_TERMS )
{ printf("error"); exit(EXIT_FAILURE); }
terms[ *avail].ceof = coef;
terms[ (*avail)++].expon=exon;
}
————————————————————————————————————————————————————
三元组转序的一个关键点:
//把每一行的元素数归0后
// 原三元组一个一个开始扫,没扫道一个 对应的行 的元素数++
————————————————————————————————————————————————————
矩阵:第一个的列数和第二个的行数相同
若A为{\displaystyle m\times n}矩阵,B为{\displaystyle n\times p}矩阵 //注意这俩个n 结果是m x p
稀疏矩阵的数据表示方法:三元组
#define MAX_TERMS 101 /* maximum number of terms +1*/
typedef struct{
int row;
int col;
int value;
} term;
term a[MAX_TERMS];
a[0] 用来记录矩阵的行数,列数,以及包含非0的元素的个数
矩阵相加: 首先满足两个矩阵行列均相等
矩阵a和矩阵b相加=矩阵c —思路:
//首先检验矩阵行列数是否相等
C[0] 的行列首先赋值
int i=1,j=1 ,ck=1 //i ,j 分别用来给a[],b[],c[]计数
while (i<=a[0].value && j<=b[0].value ) // 扫描a的元素,扫描b的元素, 因为是按a[],b[[]都是按照行顺序排列的,其中一个扫描结束,另外一个也将结束(此时不会出现行列相同的情况了)
{ if(a[i].row行= b[ i] .row)
{ if (a[i].col < b[j].cow)
a[i]的所有元素值 赋给 c[ck] i,ck都++ //这个a[i],c[ck]值分配结束
else if (a[i].col > b[j].col)
b[j]的所有元素值 赋给 c[ck] j,ck都++
}
else //行列数均相等情况
{ 此时a ,b 行列数相等,所以任意赋a或b的行列数给c
且c的value = a[i].value +b[ j ].value 且 i , j ,ck都加加 }
}
else if(a[i].row行< b[ i] .row)
{ a[i]的所有元素付给c[ck] ............. }
else
{ b[j]的所有元素付给c[ck] ............. }
}
//循环结束,可能会出现一个扫描完了,另一个还未扫描的情况。所以如下操作,但是如下操作只有可能执行其中一个循环
for ( ;i<=a[0].value ;i++ )
a[i]付给c .......
for ( ;j<=b[0].value ;j++ )
b[i]付给c .......
————————————————————————————————————————————————————