实验四

任务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("=%p\n",x);
    printf("x[0]=%p\n",x[0]);
    printf("x[1]=%p\n");
    printf("\n");
}

int main(){
    printf("测试1:int型一维数组\n");
    test1();
    
    printf("\n测试2: int型二维数组\n");
    test2();
    
    return 0;
}

 

问题1:一维数组在内存中是连续存放,数组名相对应的值和&x[0]是不一样的

问题2:是按行连续存放,各个值在子,字面上是一样的,二者之间相差4,意味着一个字符占用四个字节

任务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;    
}

 

问题1 作为形参的形式为x[ ],作为实参的形式为x[ N]

问题2  input 的功能是给x[ ]赋值,compute的功能是将数组x[ ]中的最大值和最小值去掉并求平均值

任务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;
}

问题1  第二维的大小不能省

问题2 output的功能是将x[ ]以n行n列的形式输出,init的功能是将x[ ]中的所有数赋值为value

任务4

#include <stdio.h>
#define N 100

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

 

任务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);
     
     
     
     
     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,t;
    for(i=0;i<n;i++){
        t=x[i][n-1];
        for(j=n-1;j>=0;j--){
            x[i][j]=x[i][j-1];
            
}
x[i][0]=t;
}
}

任务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 r[50];
  int t=0;
   while(x!=0){
       r[t]=x%n;
       x/=n;
       t++;
   }
   int i;
   for(i=t-1;i>=0;i--){
       if(r[i]>=10&&n==16){
           printf("%c",r[i]-10+'A');
      }
      else{
          printf("%d",r[i]);
    }
}
   printf("\n");
}

任务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,sum_magic=0,sum_hang=0,sum_lie=0,sum_dui1=0,sum_dui2=0;
        for(j=0;j<n;j++){
        sum_magic+=x[0][j];
        }
        for(i=1;i<n;i++){
            for(j=0;j<n;j++){
                 sum_hang+=x[i][j];
            }
                  if(sum_hang!=sum_magic){
                       return 0;
                  }
                sum_hang=0  ;
        }
        for(j=0;j<n;j++){
            for(i=0;i<n;i++){
                sum_lie+=x[i][j];
            }
            if(sum_lie!=sum_magic){
                  return 0;
            }
             sum_lie=0;
        }
        for(i=0;i<n;i++){
            sum_dui1+=x[i][i];
        }
        if(sum_dui1!=sum_magic){
              return 0;
        }

        for(i=0;i<n;i++){
            sum_dui2+=x[i][n-1-i];
        }
        if(sum_dui2!=sum_magic){
             return 0;
        }
       else{
               return 1;
       }

    }

 

posted @ 2024-11-10 22:03  陈熠萱  阅读(2)  评论(0编辑  收藏  举报