实验四

实验四

实验任务一

代码

点击查看代码
#include<stdio.h>
#include<stdlib.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();
	system("pause");
    return 0;
}

截图
image

ans1:是存在连续存放的;数组名x对应的值和&x[0]是一样的
ans2:是“按行连续存放的”;数组名x的值、x[0]、&x[0][0]在字面上是一样的;x[0]和x[1]的差值是4,二者差值表示从第一行首地址到第二行首地址的偏移量

实验任务二

代码

点击查看代码
#include<stdio.h>
#include<stdlib.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);
    }
	system("pause");
    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;
}

截图
image

观察:一维数组作为形参时书写形式为int x[];实参的书写形式时数组名
ans:函数input的功能是从标准输入读取n个整数,并将其存储到数组x中。函数compute的作用是计算数组x中所有元素排除数组中的最大值和最小值的平均值。

实验任务三

代码

点击查看代码
#include<stdio.h>
#include<stdlib.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");
    }
	system("pause");
    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;
}

截图
image

观察:两维数组作为函数形参时,形参的书写形式时int x[][N],实参的书写形式是二维数组名,即x
ans1:第二维的大小不能省略
ans2:函数output的功能是输出一个nxn的二维数组x;函数init的功能是将一个nxn的二维数组x的所有元素初始化为指定的值

实验任务四

代码

点击查看代码
#include <stdio.h>
#define N 100

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

double median(int arr[],int n){
    for(int i=0;i<n-1;i++){
        for(int j=0;j<n-i-1;j++){
            if(arr[j]>arr[j+1]){
                int temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
    if(n%2==1){
        return(double)arr[n/2];
    }else{
        return((double)arr[n/2-1]+(double)arr[n/2])/2;
    }
}

截图
image

实验任务五

代码

点击查看代码
#include <stdio.h>
#define N 100
#include <stdlib.h>

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("输入n: ");
    scanf("%d", &n);
    input(x, n);

    printf("原始矩阵:\n");
    output(x, n);

    rotate_to_right(x,n);

    printf("变换后矩阵:\n");
    output(x, n);
    system("pause");
    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");
    }
}

void rotate_to_right(int x[][N],int n){
    int temp[N];
    int i,j;

    for (i = 0; i < n; ++i) {
        temp[i] = x[i][n - 1];
    }
    for (j = n - 1; j > 0; --j) {
        for(i = 0; i < n; ++i){
            x[i][j] = x[i][j - 1];
        }
    }
    for (i = 0; i < n; i++){
        x[i][0] = temp[i];
    }
}

截图
image

实验任务六

代码

点击查看代码
#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){
	char map[]="0123456789ABCDEF";
	char ans[N];
	int d,r;
	int cnt=0;
	while(1){
		r=x%n;
		d=x/n;
		ans[cnt++]=map[r];
		if(d==0)
			break;
		x=d;
	}
	for(--cnt;cnt>=0;--cnt)
		printf("%c",ans[cnt]);
	printf("\n");
}

截图
image

posted @ 2025-04-20 20:59  任书静  阅读(12)  评论(0)    收藏  举报