头歌实践教学平台—C语言程序设计(数组)
C语言程序设计
第四章节4-15~4-23
4-15编程实现交换数组a和数组b中的对应元素
#include <stdio.h>
void swap_elements(int *a, int size_a, int *b, int size_b) {
int i;
for (i = 0; i < size_b && i < size_a; i++) {
int temp = a[i];
a[i] = b[i];
b[i] = temp;
}
}
int main() {
int size_a, size_b, i;
// 读取数组a的大小和元素
printf("Enter the size of array a: ");
scanf("%d", &size_a);
int a[size_a];
printf("Enter the elements of array a: ");
for (i = 0; i < size_a; i++) {
scanf("%d", &a[i]);
}
// 读取数组b的大小和元素
printf("Enter the size of array b: ");
scanf("%d", &size_b);
int b[size_b];
printf("Enter the elements of array b: ");
for (i = 0; i < size_b; i++) {
scanf("%d", &b[i]);
}
// 交换对应元素
swap_elements(a, size_a, b, size_b);
// 打印交换后的数组a和数组b
printf("\nArray a after swapping:\n");
for (i = 0; i < size_a; i++) {
printf("%d ", a[i]);
}
printf("\nArray b after swapping:\n");
for (i = 0; i < size_b; i++) {
printf("%d ", b[i]);
}
return 0;
}
4-16冒泡排序(一)
第1关:比较相邻两个元素求最大值
#include <stdio.h>
void bubbleOnePass(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
if (arr[i] > arr[i + 1]) {
// 交换 arr[i] 和 arr[i + 1]
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int n;
scanf("%d", &n);
int arr[n];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
bubbleOnePass(arr, n);
printArray(arr, n);
return 0;
}
4-16冒泡排序(二)
第2关:冒泡排序
#include <stdio.h>
void bubbleSort(int arr[], int n) {
int i, j, temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换相邻的两个元素
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
for (int k = 0; k < n; k++) {
printf("%d ", arr[k]);
}
printf("\n");
}
}
int main() {
int n, i;
scanf("%d", &n);
int arr[n];
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
bubbleSort(arr, n);
return 0;
}
4-17选择排序(一)
#include<stdio.h>
#define N 100
int main()
{
int i,j,k,n;
int a[N];
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
i = 0;
k = i;//指向最小数
for(j=i+1; j<n; j++)
{
if(a[j]<a[k])
{
k = j;
}
//交换a[k]和a[k]
}
if(k!=i)
{
int temp = a[k];
a[k] = a[i];
a[i] = temp;
}
for(i=0; i<n; i++)
{
printf("%d ", a[i]);
}
return 0;
}
4-17选择排序(二)
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void selectionSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 在第i趟排序中交换找到的最小值和第i个元素
swap(&arr[i], &arr[minIndex]);
// 打印当前数组状态
printArray(arr, n);
}
}
int main() {
int n;
scanf("%d", &n);
int arr[n];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
} printArray(arr, n-n);
selectionSort(arr, n);
return 0;
}
4-18插入排序(一)
#include<stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);
int a[n+1];
for(i=0;i<=n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++) if(a[i]>a[n])
{a[i]=a[i]+a[n];a[n]=a[i]-a[n];a[i]=a[i]-a[n];}//交换
for(i=0;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
4-18插入排序(二)
#include <stdio.h>
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void insertionSort(int arr[], int n) {
int i, key, j;
for (i = 2; i < n; i++) {
key = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
printArray(arr, n);
}
}
int main() {
int n;
scanf("%d", &n);
int arr[n];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
printArray(arr, n);
insertionSort(arr, n);
printArray(arr, 0);
return 0;
}
4-19有一个3行4列的矩阵,编程求出其中最大的那个元素的值,以及它所在的行号与列号
#include <stdio.h>
int main() {
int matrix[3][4];
int i, j;
int max = matrix[0][0];
int maxRow = 0;
int maxCol = 0;
// 假设输入是手动输入的,实际应用中可能是从文件或用户输入中读取
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
scanf("%d", &matrix[i][j]);
// 如果当前元素大于已知的最大值,则更新最大值及其位置
if (matrix[i][j] > max) {
max = matrix[i][j];
maxRow = i;
maxCol = j;
}
}
}
// 打印矩阵内容
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
printf("%d\t", matrix[i][j]);
}
printf("\n");
}
// 输出最大值及其位置
printf("max:%d\n", max);
printf("row:%d\n", maxRow + 1); // 行号从1开始计数,而非0
printf("colum:%d\n", maxCol + 1); // 列号从1开始计数,而非0
return 0;
}
4-20输入5个学生的成绩,计算并输出每一门课程的平均成绩和每一位学生的平均成绩
#include <stdio.h>
#define STUDENTS 5
#define SUBJECTS 3
int main() {
int scores[STUDENTS][SUBJECTS];
double subjectAverages[SUBJECTS] = {0};
double studentAverages[STUDENTS] = {0};
// 读取学生的成绩
for (int i = 0; i < STUDENTS; i++) {
for (int j = 0; j < SUBJECTS; j++) {
scanf("%d", &scores[i][j]);
subjectAverages[j] += scores[i][j];
studentAverages[i] += scores[i][j];
}
}
// 计算每门课程的平均分
for (int j = 0; j < SUBJECTS; j++) {
subjectAverages[j] /= STUDENTS;
}
// 计算每个学生的平均分
for (int i = 0; i < STUDENTS; i++) {
studentAverages[i] /= SUBJECTS;
}
// 输出每个学生的平均分
printf("每个学生的平均分:\n");
for (int i = 0; i < STUDENTS; i++) {
for (int j = 0; j < SUBJECTS; j++) {
printf("%d\t", scores[i][j]);
}
printf("%.1f\n", studentAverages[i]);
}
// 输出每门课程的平均分
printf("每门课的平均分:\n");
for (int j = 0; j < SUBJECTS; j++) {
printf("%.1f\t", subjectAverages[j]);
}
printf("\n");
return 0;
}
4-21输入M行N列的矩阵A和B,编程计算并输出矩阵A与B之和
#include <stdio.h>
#define MAX_SIZE 100 // 假设矩阵的最大尺寸为100x100
int main() {
int m, n;
int A[MAX_SIZE][MAX_SIZE], B[MAX_SIZE][MAX_SIZE];
// 输入矩阵的行数和列数
scanf("%d %d", &m, &n);
// 输入矩阵A
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
scanf("%d", &A[i][j]);
}
}
// 输入矩阵B
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
scanf("%d", &B[i][j]);
}
}
// 输出矩阵A+B
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
printf("%d ", A[i][j] + B[i][j]);
}
printf("\n"); // 换行
}
return 0;
}
4-22编程计算m×s阶矩阵A和s×n阶矩阵B之积
#include <stdio.h>
#include <stdlib.h>
int main() {
int m, s, n;
scanf("%d %d %d", &m, &s, &n);
// 分配矩阵内存
int **A = (int **)malloc(m * sizeof(int *));
int **B = (int **)malloc(s * sizeof(int *));
int **C = (int **)malloc(m * sizeof(int *));
for (int i = 0; i < m; i++) {
A[i] = (int *)malloc(s * sizeof(int));
}
for (int i = 0; i < s; i++) {
B[i] = (int *)malloc(n * sizeof(int));
}
for (int i = 0; i < m; i++) {
C[i] = (int *)malloc(n * sizeof(int));
}
// 读取矩阵A和B的元素
for (int i = 0; i < m; i++) {
for (int j = 0; j < s; j++) {
scanf("%d", &A[i][j]);
}
}
for (int i = 0; i < s; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &B[i][j]);
}
}
// 计算矩阵A和B的乘积C
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
C[i][j] = 0;
for (int k = 0; k < s; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
// 输出矩阵C
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d\t", C[i][j]);
}
printf("\n");
}
// 释放内存
for (int i = 0; i < m; i++) {
free(A[i]);
free(C[i]);
}
for (int i = 0; i < s; i++) {
free(B[i]);
}
free(A);
free(B);
free(C);
return 0;
}
4-23打印杨辉三角形
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int triangle[n][n];
// 初始化第一列和对角线元素为1
for (int i = 0; i < n; i++) {
triangle[i][0] = 1;
triangle[i][i] = 1;
}
// 根据杨辉三角形的性质,计算其他元素
for (int i = 2; i < n; i++) {
for (int j = 1; j < i; j++) {
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
}
}
// 打印杨辉三角形
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
printf("%d\t", triangle[i][j]);
}
printf("\n");
}
return 0;
}

浙公网安备 33010602011771号