实验四

任务一:
代码:
`#include <stdio.h>

define N 4

define M 2

void test1() {
int x[N] = {1, 9, 8, 4};
int i;
// 输出数组x占用的内存字节数
printf("sizeof(x) = %d\n", sizeof(x));
// 输出每个元素的地址、值
for (i = 0; i < N; ++i)
printf("%p: %d\n", &x[i], x[i]);
// 输出数组名x对应的值
printf("x = %p\n", x);
}

void test2() {
int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
int i, j;
// 输出二维数组x占用的内存字节数
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");
// 输出二维数组名x, 以及,x[0], x[1]的值
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;
}`
实验结果:
问题一:
nt 型一维数组 x 在内存中是连续存放的。在 test1 函数中,通过打印每个元素的地址可以看出,地址是连续递增的。数组名 x对应的值和 &x[0]是一样的。在 test1 函数中,打印 x 的值和 &x[0] 的值,结果相同,都指向数组的首地址。
问题二:
int 型二维数组 x 在内存中是 “按行连续存放” 的。从打印每个元素的地址可以看出,先按行遍历,地址是连续递增的。数组名 x的值、x[0]、&x[0][0]在字面上的值是一样的,都指向二维数组的首地址。
x[0]和 x[1]相差 4 * N个字节(假设 int 型占 4 个字节)。这个差值的意义是代表了第一行和第二行的间隔,即一行元素所占用的内存空间大小。因为二维数组在内存中是按行连续存放的,所以这个差值正好是一行的字节数。

任务二:
代码:
`#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;
}`
实验结果:
问题:
函数input的功能:这个函数用于接收用户输入的n个整数,并将这些整数存储到给定的整数数组x中。它通过一个循环,逐个读取用户输入的整数,并将其存储到数组的相应位置。
函数compute的功能:这个函数用于计算给定整数数组中去掉最大值和最小值后的平均值。它首先假设数组的第一个元素为最大值和最小值的初始值,然后遍历数组,更新最大值high和最小值low,同时累加数组中的所有元素到ans。遍历结束后,从总和中减去最大值和最小值,再除以数组长度减 2(去掉最大值和最小值后的元素个数),最后返回这个平均值。

任务三:
代码:
`#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;
}`
实验结果:
问题一:两维数组作为函数形参时,第一维的大小可以省略,第二维不能省略。因为在传递二维数组时,实际上传递的是指向数组第一个元素的指针,而编译器需要知道第二维的大小以便正确地访问数组元素。
问题二:
函数 output 的功能是输出二维数组 x 的内容。它通过两层循环遍历二维数组的每一个元素,并以特定的格式输出每个元素的值,每行输出完一个元素后输出一个空格,每行输出完所有元素后输出一个换行符。
函数 init 的功能是初始化二维数组 x。它通过两层循环遍历二维数组的每一个元素,并将每个元素都初始化为给定的 value 值。

任务四:
代码:
`#include <stdio.h>

define N 100

void input(int x[], int n);
double median(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=0;
for(i;i<n;i++){
scanf("%d",&x[i]);
}
}

double median(int x[],int n){
int i,j,a;
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++){
if(x[j]>x[j+1]){
a=x[j];
x[j]=x[j+1];
x[j+1]=temp;
}
}
}
if(n%2==1)
return x[n/2];
else
return (x[n/2-1]+x[n/2])/2;
}
`
实验结果:

任务五:
代码:
`#include <stdio.h>

define N 100

// 函数声明
void input(int x[][N], int n);
void output(int x[][N], int n);
// 函数rotate_to_right声明
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调用
rotate_to_right(x,n);
printf("变换后矩阵:\n");
output(x, n);
return 0;
}
// 函数定义
// 功能: 输入一个nn的矩阵x
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]);
}
}
// 函数定义
// 功能: 输出一个n
n的矩阵x
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");
}
}
// 函数rotate_to_right定义
// 功能: 把一个n*n的矩阵x,每一列向右移, 最右边被移出去的一列绕回左边
void rotate_to_right(int x[][N],int n){
int i,m;
for(i=0;i<n;i++){
m=x[i][n-1];
for(int j=n-1;j>0;j--){
x[i][j]=x[i][j-1];
}
x[i][0]=m;
}
}`
实验结果:

任务六:
代码:
`#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); // 函数调用: 把 x 转换成二进制输出
dec_to_n(x, 8); // 函数调用: 把 x 转换成八进制输出
dec_to_n(x, 16); // 函数调用: 把 x 转换成十六进制输出
printf("\n");
}
return 0;
}

// 函数定义
// 功能: 把十进制数 x 转换成 n 进制,打印输出
void dec_to_n(int x, int n) {
int stack[N];
int i=0;
while(x>0){
stack[i++]=x%n;
x/=n;
}
if(i==0){
stack[i++] = 0;
}
while (i>0) {
int s=stack[--i];
if(s<10){
printf("%d",s);
} else {
printf("%c",s-10+'A');
}
}
printf("\n");
}`
实验结果:

任务七:
代码:
`#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)==1)
printf("是魔方矩阵\n\n");
else
printf("不是魔方矩阵\n\n");
}
return 0;
}

// 函数定义
// 功能: 输入一个 n*n 的矩阵 x
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]);
}
}

// 功能: 输出一个 n*n 的矩阵 x
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");
}
}

// 功能: 判断一个 n 阶方阵是否为魔方矩阵,如果是,返回 1,否则,返回 0
int is_magic(int x[][N], int n) {
int sum=0,i;
for(i=0;i<n;i++){
sum+=x[0][i];
}
for(i=1;i<n;i++){
int rowsum=0;
int j;
for(j=0;j<n;j++){
rowsum+=x[i][j];
}
if(rowsum!=sum){
return 0;
}
}
for(i=0;i<n;i++){
int colsum=0;
int j;
for(j=0;j<n;j++){
colsum+=x[j][i];
}
if(colsum!=sum){
return 0;
}
}
int diagsum1=0;
for(i=0;i<n;i++){
diagsum1+=x[i][i];
}
if(diagsum1!=sum){
return 0;
}
int diagsum2 = 0;
for(i=0;i<n;i++){
diagsum2+=x[i][n-1-i];
}
if(diagsum2!=sum){
return 0;
}
return 1;
}`
实验结果;

任务八:
代码:
`#include <stdio.h>
int fun(int num){
int a[10] = {0};
int square=numnum;
int cube=num
num*num;

while(square>0){
    a[square % 10]++;
    square/=10;
}

while(cube>0){
    a[cube%10]++;
    cube/=10;
}

for(int i=0;i<10;i++){
    if(a[i]!=1){
        return 0;
    }
}

return 1;

}
int main(){
int num=1;
while(1){
if(fun(num)) {
printf("%d\n",num);
break;
}
num++;
}
return 0;
}`
实验结果:

posted on 2024-11-10 16:50  达克夏尔  阅读(6)  评论(0编辑  收藏  举报