实验四
实验任务1
实验代码:
#include<stdio.h>
#define N 4
#define M 2
void test1(){
int x[N]={1,9,8,4};
int i;
printf("sizeof(x)=%d\n",sizeof(x));
for(i=0;i<N;++i)
printf("%p:%d\n",&x[i],x[i]);
printf("x=%p\n",x);
}
void test2(){
int x[M][N]={{1,9,8,4},{2,0,4,9}};
int i,j;
printf("sizeof(x)=%d\n",sizeof(x));
for(i=0;i<M;++i)
for(j=0;j<N;++j)
printf("%p:%d\n",&x[i][j],x[i][j]);
printf("\n");
printf("x=%p\n",x);
printf("x[0]=%p\n",x[0]);
printf("x[1]=%p\n",x[1]);
printf("\n");
}
int main(){
printf("测试1:int型一维数组\n");
test1();
printf("\n测试2:int型二维数组\n");
test2();
return 0;
}
运行截图:
Q1:是连续存放的。数组名x和&x[0]是一样的。
Q2:是按行连续存放的。数组名x、x[0]、&x[0][0]在字面上值是一样的。x[0]和x[1]相差的值是16个字节,等于一行元素所占的字节长度。
实验任务2
实验代码:
#include<stdio.h>
#define N 100
void input(int x[],int n);
double compute(int x[],int n);
int main(){
int x[N];
int n,i;
double ans;
while(printf("Enter n:"),scanf("%d",&n)!=EOF){
input(x,n);
ans=compute(x,n);
printf("ans=%.2f\n\n",ans);
}
return 0;
}
void input(int x[],int n){
int i;
for(i=0;i<n;++i)
scanf("%d",&x[i]);
}
double compute(int x[],int n){
int i,high,low;
double ans;
high=low=x[0];
ans=0;
for(i=0;i<n;++i){
ans+=x[i];
if(x[i]>high)
high=x[i];
else if(x[i]<low)
low=x[i];
}
ans=(ans-high-low)/(n-2);
return ans;
}
运行截图:
Q1:函数input的功能是为一维数组的n个元素依次赋值。函数compute的功能是计算该一维数组中,除去最大值和最小值以外其他元素的平均值。
实验任务3
实验代码:
#include<stdio.h>
#define N 100
void output(int x[][N],int n);
void init(int x[][N],int n,int value);
int main(){
int x[N][N];
int n,value;
while(printf("Enter n and value:"),scanf("%d%d",&n,&value)!=EOF){
init(x,n,value);
output(x,n);
printf("\n");
}
return 0;
}
void output(int x[][N],int n){
int i,j;
for(i=0;i<n;++i){
for(j=0;j<n;++j)
printf("%d",x[i][j]);
printf("\n");
}
}
void init(int x[][N],int n,int value){
int i,j;
for(i=0;i<n;++i)
for(j=0;j<n;++j)
x[i][j]=value;
}
运行截图:
Q1:第二维的大小不能省略
Q2:函数output的作用是把二维数组中的元素按行输出。init的作用是把二维数组中的每一个元素赋值为指定值value。
实验任务4
实验代码:
#include<stdio.h>
#define N 100
double median(int x[],int n);
void input(int x[],int n);
int main(){
int x[N];
int n;
double ans;
while(printf("Enter n:"),scanf("%d",&n)!=EOF){
input(x,n);
ans=median(x,n);
printf("ans=%g\n\n",ans);
}
return 0;
}
void input(int x[],int n){
int i,j,s;
for(i=0;i<n;++i){
scanf("%d",&x[i]);
}
for(i=1;i<n;++i){
for(j=0;j<n-i;++j){
if(x[j]>x[j+1]){
s=x[j+1];
x[j+1]=x[j];
x[j]=s;}
}
}
}
double median(int x[],int n){
double ans;
if(n%2==0)
ans=(x[n/2]+x[(n/2)-1])/2.0;
else
ans=x[n/2];
return ans;
}
运行截图:
实验任务5
实验代码:
#include<stdio.h>
#define N 100
void input(int x[][N],int n);
void output(int x[][N],int n);
void rotate_to_right(int x[][N],int n);
int main(){
int x[N][N];
int n;
printf("Enter n:");
scanf("%d",&n);
input(x,n);
printf("原始矩阵:\n");
output(x,n);
rotate_to_right(x,n);
printf("变换后矩阵:\n");
output(x,n);
return 0;
}
void input(int x[][N],int n){
int i,j;
for(i=0;i<n;++i){
for(j=0;j<n;++j)
scanf("%d",&x[i][j]);
}
}
void output(int x[][N],int n){
int i,j;
for(i=0;i<n;++i){
for(j=0;j<n;++j)
printf("%4d",x[i][j]);
printf("\n");
}
}
void rotate_to_right(int x[][N],int n){
int i,j;
for(i=0;i<n;++i){
x[i][n]=x[i][n-1];
}
for(j=n-2;j>=0;--j){
for(i=0;i<n;++i){
x[i][j+1]=x[i][j];
}
}
for(i=0;i<n;++i){
x[i][0]=x[i][n];
}
}
运行截图:
实验任务6
实验代码:
#include<stdio.h>
#define N 100
void dec_to_n(int x,int n);
int main(){
int x;
while(printf("输入十进制整数:"),scanf("%d",&x)!=EOF){
dec_to_n(x,2);
dec_to_n(x,8);
dec_to_n(x,16);
printf("\n");
}
return 0;
}
void dec_to_n(int x,int n){
int i=0,s=0;
int a[N];
while(x>0){
a[i++]=x%n;
x/=n;
}
s=i-1;
for(s;s>=0;--s){
if(a[s]>9){
printf("%c",'A'+a[s]-10);}
else{
printf("%d",a[s]);}
}
printf("\n");
}
运行截图: