高级语言程序设计第六次作业
作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C/
作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13303
学号:102300107
姓名:陈沁怡
(1)编写函数fun(int m, int *k, int xx[]),将小于整数m的非素数存入xx数组中,个数由k返回。
#include <stdio.h> int is_prime(int n) { if (n <= 1) return 0; // 1 不是素数 for (int i = 2; i * i <= n; i++) { if (n % i == 0) { return 0; // 不是素数 } } return 1; // 是素数 } int fun(int m, int *k, int xx[]) { int count = 0; for (int i = 0; i < m; i++) { if (!is_prime(i)) { // 如果不是素数 xx[count++] = i; // 存入非素数数组 } } *k = count; // 返回非素数的个数 return 0; } int main() { int m = 0; // 设定 m 的值 printf("请输入一个数:"); scanf("%d",&m); int k; int xx[100]; // 用来存储非素数的数组 fun(m, &k, xx); // 调用函数 printf("非素数个数:%d\n", k); printf("非素数为:"); for (int i = 0; i < k; i++) { printf("%d ", xx[i]); } printf("\n"); return 0; }
(2)编写函数,将长度为n的字符串从第m个字符开始的全部字符复制成另一个字符串。
3)编写函数用冒泡法将数组按从小到大的顺序排列。
#include <stdio.h> // 冒泡排序函数 void bubbleSort(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; } } } } void printArray(int arr[], int n) { for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int n; printf("请输入数组的长度: "); scanf("%d", &n); int arr[n]; printf("请输入数组元素:\n"); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } printf("原数组:\n"); printArray(arr, n); bubbleSort(arr, n); printf("排序后的数组:\n"); printArray(arr, n); return 0; }
(4)将n个整数按输入顺序的逆序排列,要求应用带指针参数的函数实现。
#include <stdio.h> // 逆序排列函数,带指针参数 void reverseArray(int *arr, int n) { int temp; for (int i = 0; i < n / 2; i++) { // 交换 arr[i] 和 arr[n - i - 1] temp = arr[i]; arr[i] = arr[n - i - 1]; arr[n - 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; printf("请输入数组的长度: "); scanf("%d", &n); int arr[n]; printf("请输入数组元素:\n"); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } printf("原数组:\n"); printArray(arr, n); reverseArray(arr, n); // 打印逆序后的数组 printf("逆序后的数组:\n"); printArray(arr, n); return 0; }
(5)写一个函数打印arr数组的内容,不使用数组下标,使用指针。
6)编写程序,分别找出多个n×m数组的最大值、最小值,并输出两个值的下标。
`#include <stdio.h>
define MAX_N 100
define MAX_M 100
void findMaxMin(int arr[MAX_N][MAX_M], int n, int m) {
int max = arr[0][0], min = arr[0][0];
int maxRow = 0, maxCol = 0;
int minRow = 0, minCol = 0;
// 查找最大值和最小值
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
maxRow = i;
maxCol = j;
}
if (arr[i][j] < min) {
min = arr[i][j];
minRow = i;
minCol = j;
}
}
}
printf("最大值: %d, 下标: (%d, %d)\n", max, maxRow, maxCol);
printf("最小值: %d, 下标: (%d, %d)\n", min, minRow, minCol);
}
int main() {
int n, m;
printf("请输入行数和列数: ");
scanf("%d %d", &n, &m);
int arr[MAX_N][MAX_M];
printf("请输入数组元素:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &arr[i][j]);
}
}
findMaxMin(arr, n, m);
return 0;
}
![](https://img2024.cnblogs.com/blog/3531629/202411/3531629-20241109150301196-34957224.png) (7)判断上三角矩阵。上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵。 ![](https://img2024.cnblogs.com/blog/3531629/202411/3531629-20241109150800619-138331373.png) ![](https://img2024.cnblogs.com/blog/3531629/202411/3531629-20241109150836660-2121589247.png) (8)给定一个按升序排列的二维数组,编写一个函数来判断目标值是否存在于数组中。数组是一个m x n的矩阵,可使用算法快速查询。
#include <stdio.h>
include <stdbool.h>
bool searchMatrix(int matrix[][3], int m, int n, int target) {
int row = 0, col = n - 1;
while (row < m && col >= 0) {
if (matrix[row][col] == target) {
return true; // 找到目标值,返回true
} else if (matrix[row][col] > target) {
col--; // 当前值大于目标值,向左移动
} else {
row++; // 当前值小于目标值,向下移动
}
}
return false; // 如果循环结束仍然没有找到目标值,返回false
}
int main() {
// 示例矩阵,按升序排列
int matrix[3][3] = {
{1, 4, 7},
{2, 5, 8},
{3, 6, 9}
};
int m = 3, n = 3; // 矩阵的行数和列数
int target = 5; // 目标值
if (searchMatrix(matrix, m, n, target)) {
printf("目标值 %d 存在于矩阵中。\n", target);
} else {
printf("目标值 %d 不存在于矩阵中。\n", target);
}
return 0;
}![](https://img2024.cnblogs.com/blog/3531629/202411/3531629-20241109212649064-1255056215.png) 9)编写一个函数,输入一个整数,将其分解为两个质数之和。提示:函数可以声明为int split(int n, int *a, int *b)。n作为传入参数,a和b作为传出参数。若无法分解返回0,可以分解则返回1。
#include <stdio.h>
include <stdbool.h>
// 判断一个数是否为质数
bool isPrime(int x) {
if (x <= 1) return false;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}
// 分解为两个质数之和
int split(int n, int *a, int *b) {
// 遍历所有小于 n 的数,查找质数对
for (int i = 2; i <= n / 2; i++) {
if (isPrime(i) && isPrime(n - i)) {
*a = i;
*b = n - i;
return 1; // 找到质数对,返回 1
}
}
return 0; // 无法分解为两个质数之和,返回 0
}
int main() {
int n;
int a, b;
printf("请输入一个整数:");
scanf("%d", &n);
if (split(n, &a, &b)) {
printf("%d 可以分解为两个质数之和:%d 和 %d\n", n, a, b);
} else {
printf("%d 无法分解为两个质数之和\n", n);
}
return 0;
}![](https://img2024.cnblogs.com/blog/3531629/202411/3531629-20241109230225149-778789041.png) (10) 编写函数void shift(char* s, int n),请原地将字符串s循环左移n次。例如,字符串“hello”左移3次得到“lohel”。
#include <stdio.h>
include <string.h>
void shift(char* s, int n) {
int len = strlen(s);
if (len == 0) return;
n = n % len;
if (n == 0) return; // 移动次数为 0 时,无需操作
for (int i = 0; i < n / 2; i++) {
char temp = s[i];
s[i] = s[n - i - 1];
s[n - i - 1] = temp;
}
for (int i = n; i < (len + n) / 2; i++) {
char temp = s[i];
s[i] = s[len + n - i - 1];
s[len + n - i - 1] = temp;
}
for (int i = 0; i < len / 2; i++) {
char temp = s[i];
s[i] = s[len - i - 1];
s[len - i - 1] = temp;
}
}
int main() {
char s[100];
int n;
printf("请输入字符串:");
fgets(s, sizeof(s), stdin);
s[strcspn(s, "\n")] = '\0'; // 去掉输入字符串末尾的换行符
printf("请输入左移次数:");
scanf("%d", &n);
shift(s, n);
printf("左移 %d 次后的字符串:%s\n", n, s);
return 0;
}
![](https://img2024.cnblogs.com/blog/3531629/202411/3531629-20241110141537203-53409475.png) (11)写一个程序读入一个二维整型数组并判断它是否为魔方矩阵。在魔方阵中,所有的行、列和对角线都拥有相同的和。
include <stdio.h>
define MAX_SIZE 10
// 判断是否为魔方矩阵
int isMagicSquare(int matrix[MAX_SIZE][MAX_SIZE], int n) {
int sum = 0;
// 计算第一行的和,作为标准和
for (int i = 0; i < n; i++) {
sum += matrix[0][i];
}
// 检查每一行的和
for (int i = 1; i < n; i++) {
int rowSum = 0;
for (int j = 0; j < n; j++) {
rowSum += matrix[i][j];
}
if (rowSum != sum) {
return 0;
}
}
// 检查每一列的和
for (int j = 0; j < n; j++) {
int colSum = 0;
for (int i = 0; i < n; i++) {
colSum += matrix[i][j];
}
if (colSum != sum) {
return 0;
}
}
// 检查主对角线的和
int mainDiagonalSum = 0;
for (int i = 0; i < n; i++) {
mainDiagonalSum += matrix[i][i];
}
if (mainDiagonalSum != sum) {
return 0;
}
// 检查副对角线的和
int secondaryDiagonalSum = 0;
for (int i = 0; i < n; i++) {
secondaryDiagonalSum += matrix[i][n - 1 - i];
}
if (secondaryDiagonalSum != sum) {
return 0; // 如果副对角线的和不等于标准和,返回 false
}
return 1;
}
int main() {
int matrix[MAX_SIZE][MAX_SIZE];
int n;
printf("请输入矩阵的大小 (n x n): ");
scanf("%d", &n);
printf("请输入矩阵元素:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
if (isMagicSquare(matrix, n)) {
printf("该矩阵是一个魔方矩阵。\n");
} else {
printf("该矩阵不是魔方矩阵。\n");
}
return 0;
}
![](https://img2024.cnblogs.com/blog/3531629/202411/3531629-20241110142729215-918938748.png) (12)利用指针,判断两个字符串是否相等。忽略大小写。例如,输入 “hello”和”hELlO”,认为它们是相等的。返回值:1表示相等。0表示不同)。
#include <stdio.h>
include <ctype.h>
// 判断两个字符串是否相等(忽略大小写)
int areStringsEqualIgnoreCase(const char str1, const char str2) {
while (str1 && str2) {
if (tolower(str1) != tolower(str2)) {
return 0;
}
str1++;
str2++;
}
return *str1 == *str2;
}
int main() {
char str1[100], str2[100];
printf("请输入第一个字符串: ");
fgets(str1, sizeof(str1), stdin);
printf("请输入第二个字符串: ");
fgets(str2, sizeof(str2), stdin);
str1[strcspn(str1, "\n")] = '\0';
str2[strcspn(str2, "\n")] = '\0';
if (areStringsEqualIgnoreCase(str1, str2)) {
printf("两个字符串相等(忽略大小写)\n");
} else {
printf("两个字符串不相等(忽略大小写)\n");
}
return 0;
}
`
反思:多练习,掌握函数运用