11.20作业
题目一:
题目:
// 数组的行列转置
代码:
// 数组的行列转置
#include <stdio.h>
int main()
{int a[2][3], i, j, b[3][2];printf("输入一个两行三列的数组a:\n");for (i = 0; i < 2; i++)for (j = 0; j < 3; j++){scanf("%d", &a[i][j]);}for (i = 0; i < 2; i++)for (j = 0; j < 3; j++){b[j][i] = a[i][j];}printf("转置后得到的一个三行两列的数组b:\n");for (i = 0; i < 3; i++){for (j = 0; j < 2; j++){printf("%d\t", b[i][j]);}printf("\n");}
}
题目二:
题目:
// 打印杨辉三角
代码:
#define N 11
#include <stdio.h>
int main()
{int i, j, a[N][N];for (i = 1; i < N; i++){a[i][i] = 1;a[i][1] = 1;}for (i = 3; i < N; i++){for (j = 2; j <= i - 1; j++){a[i][j] = a[i - 1][j - 1] + a[i - 1][j];}}for (i = 1; i < N; i++){for (j = 1; j <= i; j++){printf("%d\t", a[i][j]);}printf("\n");}printf("\n");
}
题目三:
题目:
// 数组对角线元素求和
代码:
#include <stdio.h>
#define N 3
int main()
{int a[N][N];int i, j, sum = 0;printf("输入%d行%d列的数组:\n", N, N);for (i = 0; i < N; i++){for (j = 0; j < N; j++){scanf("%d", &a[i][j]);}}for (i = 0; i < N; i++){sum = sum + a[i][i] + a[i][N - 1 - i];}if (N % 2 != 0){sum = sum - a[N / 2][N / 2];}printf("对角线元素求和为:%d",sum);
}
题目四:
题目:
//求 主对角线元素的最大值 主对角线元素的积 主对角线元素的平方和
代码:
//求 主对角线元素的最大值 主对角线元素的积 主对角线元素的平方和
#include <stdio.h>
#define N 3
int main()
{int a[N][N];int i, j, sum = 0, max, p = 1, sqSum = 0;printf("输入%d行%d列的数组:\n", N, N);for (i = 0; i < N; i++){for (j = 0; j < N; j++){scanf("%d", &a[i][j]);}}max = a[0][0];for (i = 0; i < N; i++){
//主对角线元素的最大值if (a[i][i] > max){max = a[i][i];}//主对角线元素的积p = p * a[i][i];//主对角线元素的平方和sqSum = sqSum + a[i][i] * a[i][i];}printf("主对角线元素的最大值: %d\n", max);printf("主对角线元素的积: %d\n", p);printf("主对角线元素的平方和: %d\n", sqSum);
}
题目五:
题目:
//找出5个数中的最小值
代码:
//找出5个数中的最小值
#include <stdio.h>int min(int x, int y) {return (x < y ? x : y); //condition ? expression1(true) : expression2(false);
}int main() {int a[5], i, m;printf("输入五个数:");for (i = 0; i < 5; i++) {scanf("%d", &a[i]);}m = a[0];for (i = 1; i < 5; i++) {m = min(m, a[i]);}printf("最小值为:%d\n", m);return 0;
}
题目六:
题目:
//定义了一个二维数组score,用于存储10个学生4门课程的成绩,打印出每个学生的索引和他们的成绩总和
代码:
//定义了一个二维数组score,用于存储10个学生4门课程的成绩,打印出每个学生的索引和他们的成绩总和#include <stdio.h>int sum(int x, int y, int z) {return (x + y + z);
}int main() {int score[5][4], i, j;// 输入每个学生的三门成绩printf("依次输入每个学生的三门课程成绩:\n");for(i = 0; i < 5; i++) {for(j = 1; j < 4; j++) {scanf("%d", &score[i][j]);}// 计算总分并存储在 score[i][0]score[i][0] = sum(score[i][1], score[i][2], score[i][3]);}// 输出每个学生的编号及其总分for(i = 0; i < 5; i++) {printf("Student %d: Total Score = %d\n", i + 1, score[i][0]);}return 0;
}
题目七:
题目:
//计算数组中每个元素的第 k 位数字之和
代码:
//计算数组中每个元素的第 k 位数字之和#define N 10
#include<stdio.h>
int fun(int n, int k) {int i;for (i = 1; i <= k - 1; i++) {n = n / 10;n = n % 10;}return n;
}int main() {int a[N], k, i, sum = 0;printf("输入十个数:\n");for (i = 0; i < N; i++) {scanf("%d", &a[i]);}printf("Input k:\n");scanf("%d", &k);for (i = 0; i < N; i++) {sum += fun(a[i], k);}printf("The k sum is %d\n", sum);return 0;
}
题目八:
题目:
//用冒泡排序算法对数组进行排序,并在排序前后打印数组
代码:
//用冒泡排序算法对数组进行排序,并在排序前后打印数组
#include<stdio.h>void sort(int b[], int n) {int i, j, t;for (i = 1; i < n; i++) {for (j = 0; j < n - i; j++) {if (b[j] > b[j + 1]) {t = b[j];b[j] = b[j + 1];b[j + 1] = t;}}}
}void printarr(int b[], int n) {int i;for (i = 0; i < n; i++)printf("%5d", b[i]);printf("\n");
}int main() {int a[10] = {11, 12, 63, 97, 58, 80, 48, 32, 73, 36};printf("Before sort:\n");printarr(a, 10);sort(a, 10);printf("After sort:\n");printarr(a, 10);return 0;
}
代码优化:
#include <stdio.h>void sort(int b[], int n) {int i, j, t;int swapped;for (i = 0; i < n - 1; i++) { // 外层循环控制排序的轮数swapped = 0; // 记录这一轮是否有交换for (j = 0; j < n - 1 - i; j++) { // 内层循环进行相邻元素比较if (b[j] > b[j + 1]) {t = b[j];b[j] = b[j + 1];b[j + 1] = t;swapped = 1; // 如果发生交换,则标记为 1}}if (!swapped) { // 如果这一轮没有交换,数组已经有序,提前退出break;}}
}void printarr(int b[], int n) {int i;for (i = 0; i < n; i++)printf("%5d", b[i]); // 每个数字占5个字符宽度printf("\n");
}int main() {int a[10] = {11, 12, 63, 97, 58, 80, 48, 32, 73, 36};printf("Before sort:\n");printarr(a, 10);sort(a, 10);printf("After sort:\n");printarr(a, 10);return 0;
}