实验4
实验1
源代码
1 #include <stdio.h> 2 #define N 4 3 #define M 2 4 5 void test1() { 6 int x[N] = { 1, 9, 8, 4 }; 7 int i; 8 printf("sizeof(x) = %d\n", sizeof(x)); 9 for (i = 0; i < N; ++i) 10 printf("%p: %d\n", &x[i], x[i]); 11 printf("x = %p\n", x); 12 } 13 14 void test2() { 15 int x[M][N] = { {1, 9, 8, 4}, {2, 0, 4, 9} }; 16 int i, j; 17 printf("sizeof(x) = %d\n", sizeof(x)); 18 for (i = 0; i < M; ++i) 19 for (j = 0; j < N; ++j) 20 printf("%p: %d\n", &x[i][j], x[i][j]); 21 printf("\n"); 22 printf("x = %p\n", x); 23 printf("x[0] = %p\n", x[0]); 24 printf("x[1] = %p\n", x[1]); 25 printf("\n"); 26 } 27 int main() { 28 printf("测试1: int型一维数组\n"); 29 test1(); 30 printf("\n测试2: int型二维数组\n"); 31 test2(); 32 return 0; 33 }
运行结果

ans1:数组x在内存中连续存放,x与x[0]的值相同,因为两者的位置相同
ans2:x在其中连续存在,两者的值相同,相差16,两者表示有4个数,表示每个数站4个位置表示16个
实验2
源代码
1 #include <stdio.h> 2 #define N 100 3 void input(int x[], int n); 4 double compute(int x[], int n); 5 6 int main() { 7 int x[N]; 8 int n, i; 9 double ans; 10 11 while (printf("Enter n: "), scanf_s("%d", &n) != EOF) { 12 input(x, n); 13 ans = compute(x, n); 14 printf("ans = %.2f\n\n", ans); 15 } 16 17 return 0; 18 } 19 void input(int x[], int n) { 20 int i; 21 22 for (i = 0; i < n; ++i) 23 scanf_s("%d", &x[i]); 24 } 25 double compute(int x[], int n) { 26 int i, high, low; 27 double ans; 28 29 high = low = x[0]; 30 ans = 0; 31 32 for (i = 0; i < n; ++i) { 33 ans += x[i]; 34 35 if (x[i] > high) 36 high = x[i]; 37 else if (x[i] < low) 38 low = x[i]; 39 } 40 41 ans = (ans - high - low) / (n - 2); 42 43 return ans; 44 }

形参是int x[],而实参是int x[N];
input 用来输入数组的每一个值,compute是为了去掉最高和最低然后算平均分
实验3
源代码
1 #include <stdio.h> 2 #define N 100 3 void output(int x[][], int n); 4 void init(int x[][N], int n, int value); 5 int main() { 6 int x[N][N]; 7 int n, value; 8 while (printf("Enter n and value: "), scanf_s("%d%d", &n, &value) != EOF) { 9 init(x, n, value); 10 output(x, n); 11 printf("\n"); 12 } 13 return 0; 14 } 15 void output(int x[][], int n) { 16 int i, j; 17 for (i = 0; i < n; ++i) { 18 for (j = 0; j < n; ++j) 19 printf("%d ", x[i][j]); 20 printf("\n"); 21 } 22 } 23 void init(int x[][N], int n, int value) { 24 int i, j; 25 26 for (i = 0; i < n; ++i) 27 for (j = 0; j < n; ++j) 28 x[i][j] = value; 29 }
运行结果

形参(int x [][N] int n),实参int x[N][N];int n,value;

output是为了输出一个方阵的矩阵,而init是将每一个数组都变成value
实验4
源代码
1 #include<stdio.h> 2 #define N 100 3 void input(int x[], int n); 4 double media(int x[], int n); 5 void sort(int x[], int n); 6 int main() { 7 int x[N]; 8 int n; 9 double ans; 10 while (printf("Enter n:"), scanf_s("%d", &n) != EOF) { 11 input(x, n); 12 ans = media(x, n); 13 printf("ans=%g\n\n", ans); 14 } 15 return 0; 16 } 17 18 void input(int x[], int n) { 19 for (int i = 0; i < n; i++) 20 scanf_s("%d", &x[i]); 21 } 22 void sort(int x[], int n) { 23 for (int i = 0; i < n - 1; i++) { 24 for (int j = 0; j < n - 1 - i; j++) { 25 if (x[j] > x[j + 1]) { 26 int t = x[j]; 27 x[j] = x[j + 1]; 28 x[j + 1] = t; 29 30 } 31 } 32 } 33 34 } 35 36 37 double media(int x[], int n) { 38 sort(x,n); 39 if (n % 2 == 1) { 40 return x[n / 2 ]; 41 } 42 else { 43 double t; 44 t = (x[n / 2] + x[n / 2 -1]) / 2.0; 45 return t; 46 } 47 }

实验5
源代码
1 #include <stdio.h> 2 #define N 100 3 4 // 函数声明 5 void input(int x[][N], int n); 6 void output(int x[][N], int n); 7 // 函数rotate_to_right声明 8 // 待补足 9 void rotate_to_right(int x[][N], int n); 10 11 int main() { 12 int x[N][N]; 13 int n; 14 15 printf("输入n: "); 16 scanf_s("%d", &n); 17 input(x, n); 18 19 printf("原始矩阵:\n"); 20 output(x, n); 21 22 // 函数rotate_to_right调用 23 rotate_to_right(x, n); 24 25 printf("变换后矩阵:\n"); 26 output(x, n); 27 28 return 0; 29 } 30 31 // 函数定义 32 // 功能: 输入一个n*n的矩阵x 33 void input(int x[][N], int n) { 34 int i, j; 35 36 for (i = 0; i < n; ++i) { 37 for (j = 0; j < n; ++j) 38 scanf_s("%d", &x[i][j]); 39 } 40 } 41 42 // 函数定义 43 // 功能: 输出一个n*n的矩阵x 44 void output(int x[][N], int n) { 45 int i, j; 46 47 for (i = 0; i < n; ++i) { 48 for (j = 0; j < n; ++j) 49 printf("%4d", x[i][j]); 50 51 printf("\n"); 52 } 53 } 54 55 // 函数rotate_to_right定义 56 // 功能: 把一个n*n的矩阵x,每一列向右移, 最右边一列绕回左边 57 void rotate_to_right(int x[][N], int n) { 58 int a[N]; 59 for (int i = 0; i < n; ++i) { 60 a[i] = x[i][n - 1]; 61 } 62 for (int j = n - 1; j > 0; j--) { 63 for (int i = 0; i < n; i++) { 64 x[i][j] = x[i][j - 1]; 65 } 66 } 67 for (int i = 0; i < n; i++) { 68 x[i][0] = a[i]; 69 } 70 }

实验6
源代码
#include <stdio.h> #define N 100 #include<string.h> void dec_to_n(int x, int n); // 函数声明 int main() { int x; while (printf("输入十进制整数: "), scanf_s("%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 a[N], t = 0; int b[N], c[N]; while (x>0){ a[t] = x % n; x = x / n; t++; } for (int h = t - 1; h >= 0; h--) { if (a[h] >= 10) { printf("%c", 'A' + (a[h] - 10)); } else printf("%d", a[h]); } printf("\n"); }
运行结果

实验7
源代码
1 #include <stdio.h> 2 #define N 100 3 int t[]; 4 // 函数声明 5 void input(int x[][N], int n); 6 void output(int x[][N], int n); 7 // 待补足函数is_magic声明 8 int is_magic(int x[][N], int n); 9 10 int main() { 11 int x[N][N]; 12 int n; 13 14 while (printf("输入n: "), scanf_s("%d", &n) != EOF) { 15 printf("输入方阵:\n"); 16 input(x, n); 17 18 printf("输出方阵:\n"); 19 output(x, n); 20 21 if (is_magic(x, n)) 22 printf("是魔方矩阵\n\n"); 23 else 24 printf("不是魔方矩阵\n\n"); 25 } 26 27 return 0; 28 } 29 30 // 函数定义 31 // 功能: 输入一个n*n的矩阵x 32 void input(int x[][N], int n) { 33 int i, j; 34 35 for (i = 0; i < n; ++i) { 36 for (j = 0; j < n; ++j) 37 scanf_s("%d", &x[i][j]); 38 } 39 } 40 41 // 功能: 输出一个n*n的矩阵x 42 void output(int x[][N], int n) { 43 int i, j; 44 45 for (i = 0; i < n; ++i) { 46 for (j = 0; j < n; ++j) 47 printf("%4d", x[i][j]); 48 49 printf("\n"); 50 } 51 } 52 53 54 // 功能: 判断一个n阶方阵是否为魔方矩阵,如果是,返回1,否则,返回0 55 // 待补足函数is_magic定义 56 int is_magic(int x[][N], int n) { 57 int total = n * (n*n+ 1) / 2; 58 int exit[N * N + 1] = { 0 }; 59 for (int i = 0; i < n; i++) { 60 for (int j = 0; j < n; j++) { 61 int ans = x[i][j]; 62 if (ans<1 || ans>n * n || exit[ans]) { 63 return 0; 64 } 65 exit[ans] = 1; 66 } 67 } 68 for (int i = 0; i < n; i++) { 69 int add = 0; 70 for (int j = 0; j < n; j++) { 71 add += x[i][j]; 72 } 73 if (add != total) { 74 return 0; 75 }//计算行; 76 } 77 for (int i = 0; i < n; i++) { 78 int add = 0; 79 for (int j = 0; j < n; j++) { 80 add += x[j][i]; 81 } 82 if (add != total) 83 return 0; 84 //计算列; 85 int a = 0; 86 for (int i = 0; i < n; i++) { 87 a += x[i][i]; 88 } 89 if (a != total) { 90 return 0; 91 } 92 }//计算主对角线; 93 int b=0; 94 for (int i = 0; i < n; i++) { 95 b += x[i][n - i-1]; 96 97 } 98 99 if (b!= total) { 100 return 0; 101 }//计算fu对角线; 102 return 1; 103 } 104
运行结果


实验8
1 #include <stdio.h> 2 #define _CRT_SECURE_NO_WARNINGS 3 int extractDigits(long long num, int digits[]) { 4 int digitCount = 0; 5 // 处理数字为0的特殊情况(本题中平方/立方不会为0,仅做兼容) 6 if (num == 0) { 7 digits[digitCount++] = 0; 8 return digitCount; 9 } 10 11 // 逐位提取数字(从个位开始) 12 while (num > 0) { 13 digits[digitCount++] = num % 10; // 取当前个位数字 14 num = num / 10; // 去掉已提取的个位 15 } 16 return digitCount; 17 } 18 19 // 函数功能:检查数字数组是否包含0-9且每个数字仅出现一次 20 // 参数:digits-数字数组;totalLen-数组中数字的总个数 21 int isAllUniqueAndComplete(int digits[], int totalLen) { 22 // 第一步:必须刚好包含10个数字(0-9共10个) 23 if (totalLen != 10) { 24 return 0; 25 } 26 27 // 第二步:标记0-9是否出现过(初始全为0:未出现) 28 int exist[10] = { 0 }; // exist[0]对应数字0,exist[9]对应数字9 29 for (int i = 0; i < totalLen; i++) { 30 int currentDigit = digits[i]; 31 // 若当前数字已出现过,直接返回“不满足” 32 if (exist[currentDigit] == 1) { 33 return 0; 34 } 35 exist[currentDigit] = 1; // 标记为“已出现” 36 } 37 38 // 第三步:检查0-9是否全部出现(不能有遗漏) 39 for (int i = 0; i < 10; i++) { 40 if (exist[i] == 0) { // 存在未出现的数字 41 return 0; 42 } 43 } 44 45 // 所有条件都满足 46 return 1; 47 } 48 49 int main() { 50 int targetNum = 1; // 待验证的数字,从1开始遍历 51 int digitBuffer[20] = { 0 }; // 存储“平方+立方”的所有数字(足够容纳) 52 53 54 55 while (1) { 56 // 计算当前数字的平方和立方(用long long防止整数溢出) 57 long long square = (long long)targetNum * targetNum; 58 long long cube = square * targetNum; 59 60 // 1. 提取平方的所有数字,存入digitBuffer 61 int squareDigitLen = extractDigits(square, digitBuffer); 62 // 2. 提取立方的所有数字,接在平方数字的后面 63 int cubeDigitLen = extractDigits(cube, digitBuffer + squareDigitLen); 64 65 // 3. 检查所有数字是否满足“0-9不重复且全覆盖” 66 if (isAllUniqueAndComplete(digitBuffer, squareDigitLen + cubeDigitLen)) { 67 // 找到目标,打印结果并终止程序 68 printf("%d\n", targetNum); 69 70 break; 71 } 72 73 targetNum++; // 验证下一个数字 74 } 75 76 return 0; 77 }这道题不太会故参考了ai,现在易理解


浙公网安备 33010602011771号