实验4
实验任务1:
点击查看代码
#include <stdio.h>
#define N 4
#define M 4
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 < M; ++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:是连续存放; sizeof()表示的是存放的长度,&x[i]表示的是 x[i]具体的地址;x[i]表示这个数组中i位置存放的具体数值;x表示这数组起始的地址;
Q2;是按行连续存放;相同;差了16;即差了4个存放空间(中间间隔3个数)
实验任务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:形式参数写成(int x[]),实际参数直接写为(x);
Q2:input函数功能是将数值输入对应数组中;comput函数功能是找到最大最小值并求切尾平均值
实验任务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:形式参数写为完整的数组表示,即行列都要(若行空着,则与列同),即x[][N],和需要的参数,int n;实际参数声明时要明确写出行列;函数内只需写组名即可;
Q2:不能不写,形式参数第一维可不写,但第二维一定要写;
Q3:output作用是将init赋值后的x数组打印到屏幕上;init功能是将value赋值到n*n的矩阵中;
试验任务4:
点击查看代码
#include <stdio.h>
#define N 100
float median(int x[N],int n);
void input(int x[N],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[N], int n)
{
int i;
for(i = 0;i < n;i++)
scanf("%d",&x[i]);
}
float median (int x[N],int n)
{
int count,j;
int i;
int a, b;
int y[N];
double ans;
for(count = 0;count < (n - 1); count++)
{
for(i = 0; i < (n - 1);i++)
{
if(x[i] < x[i+1])
{
y[1] = x[i+1];
x[i+1] = x[i];
x[i] = y[1];
}
}
}
if(n % 2 == 0)
{
a = x[n/2];
b = x[n/2 -1];
ans = (a + b)/2.0;
return ans;
}
else
{
ans = x[(n - 1)/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 y[N][N];
int i,j;
for(i = 0;i < n; i++)
y[i][0] = x[i][n - 1];
for(i = 0;i < n;i++)
{
for(j = 0; j < n - 1;j++)
y[i][j + 1] = x[i][j];
}
for(i = 0;i < n; i++)
for(j = 0;j < n;j++)
x[i][j] = y[i][j];
}

实验任务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 y[N];
int i;
int j;
if(x == 0)
printf("0\n");
else
{
if(n == 2 || n == 8)
{
for(i = 0;x != 0;i++)
{
y[i] = x%n;
x/= n;
}
for(j = i - 1;j >= 0; j--)
printf("%d",y[j]);
printf("\n");
}
else
{
for(i = 0;x != 0;i++)
{
y[i] = x%n;
x/= n;
}
for(j = i-1;j>=0; j--)
{
if(y[j] >= 10)
{
y[j] = y[j] - 10 + 'A';
printf("%c",y[j]);
}
else
printf("%d",y[j]);
}
}
}
}

实验任务7:
点击查看代码
#include <stdio.h>
#define N 100
void input(int x[][N],int n);
void output(int x[][N],int n);
int is_magic(int x[][N],int n);
int main()
{
int x[N][N];
int n;
while(printf("输入n:"),scanf("%d",&n) != EOF)
{
printf("输入方阵:\n");
input(x,n);
printf("输出方阵:\n");
output(x,n);
if(is_magic(x,n))
printf("是魔方矩阵\n\n");
else
printf("不是魔方矩阵\n\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");
}
}
int is_magic(int x[][N],int n)
{
int i,j;
int a,b;
int c,e;
int y,y1;
int result1,result2;
int d[N];
int z[N];
c = 0;
result1 = 0;
result2 = 0;
for(i = 0;i < n;i++)
{
for(j = 0;j < n; j++,c++)
{
y = x[i][j];
z[c] = y;
}
}
a = z[0];
for(i = 1;i < c;i++)
{
b = z[i];
if(a == b)
return 0;
}
for(i = 0;i < n;i++)
{
for(j = 0;j < n; j++)
{
y = x[i][j];
if(y > n*n || y < 1)
return 0;
}
}
for(i = 0;i < n;i++)
{
y = 0;
for(j = 0;j < n; j++)
{
y1 = x[i][j];
y += y1;
}
d[i] = y;
}
e = d[0];
for(a = 1;a < n;a++)
{
b = d[a];
if(e != b)
return 0;
}
for(j = 0;j < n;j++)
{
y = 0;
for(i = 0;i < n; i++)
{
y1 = x[i][j];
y += y1;
}
if(y != e)
return 0;
}
for(i = 0,j = 0;i < n;i++,j++)
{
y1 = x[i][j];
result1 += y1;
}
for(i = n - 1,j = 0;i >= 0;i--, j++)
{
y1 = x[i][j];
result2 += y1;
}
if(result1 == e && result2 == e)
return 1;
else
return 0;
}



浙公网安备 33010602011771号