高级程序语言设计第六次作业
| 这个作业属于哪个课程 | <班级的链接> |
|---|---|
| 这个作业要求在哪里 | <作业链接> |
| 学号 | 092300303 |
| 姓名 | 池博洋 |
@
目录
- 1.设计一个按值传递和按地址传递呈现不同效果的程序
- 2.编写函数fun(int m, int *k, int xx[]),将小于整数m的非素数存入xx数组中,个数由k返回
- 3.编写函数,将长度为n的字符串从第m个字符开始的全部字符复制成另一个字符串
- 4.编写函数用冒泡法将数组按从小到大的顺序排列
- 5.将n个整数按输入顺序的逆序排列,要求应用带指针参数的函数实现
- 6.写一个函数打印arr数组的内容,不使用数组下标,使用指针
- 7.编写程序,分别找出多个n×m数组的最大值、最小值,并输出两个值的下标
- 8.判断上三角矩阵。上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵
- 9.给定一个按升序排列的二维数组,编写一个函数来判断目标值是否存在于数组中。数组是一个m x n的矩阵,可使用算法快速查询
- 10.编写一个函数,输入一个整数,将其分解为两个质数之和。提示:函数可以声明为int split(int n, int *a, int *b)。n作为传入参数,a和b作为传出参数。若无法分解返回0,可以分解则返回1
- 11.编写函数void shift(char* s, int n),请原地将字符串s循环左移n次。例如,字符串“hello”左移3次得到“lohel”
- 12.写一个程序读入一个二维整型数组并判断它是否为魔方矩阵。在魔方阵中,所有的行、列和对角线都拥有相同的和
- 13.利用指针,判断两个字符串是否相等。忽略大小写。例如,输入 “hello”和”hELlO”,认为它们是相等的。返回值:1表示相等。0表示不同)
- 14.定义一个一维数组和二维数组,按顺序打印出数组中每个元素的地址
- 15.设计一个分别使用数组名和指针引用数组元素的程序
1.设计一个按值传递和按地址传递呈现不同效果的程序
点击查看代码
#include <stdio.h>
void swap_by_value(int a, int b) {
int temp = a;
a = b;
b = temp;
}
void swap_by_address(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
printf("Before swap_by_value: x = %d, y = %d\n", x, y);
swap_by_value(x, y);
printf("After swap_by_value: x = %d, y = %d\n", x, y);
printf("Before swap_by_address: x = %d, y = %d\n", x, y);
swap_by_address(&x, &y);
printf("After swap_by_address: x = %d, y = %d\n", x, y);
return 0;
}
结果:

2.编写函数fun(int m, int *k, int xx[]),将小于整数m的非素数存入xx数组中,个数由k返回
点击查看代码
#include <stdio.h>
int isPrime(int n) {
if (n <= 1) return 0; // 1 和 0 都不是素数
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return 0;
}
return 1;
}
void fun(int m, int *k, int xx[]) {
*k = 0; // 统计个数
for (int i = 1; i < m; i++) {
if (!isPrime(i)) { // 非素数
xx[*k] = i;
(*k)++;
}
}
}
int main() {
int m, k;
int xx[100]; // 存放非素数的数组
printf("请输入一个整数 m: ");
scanf("%d", &m); // 只需要输入 m
fun(m, &k, xx);
printf("小于 %d 的非素数共有 %d 个:\n", m, k);
for (int i = 0; i < k; i++) {
printf("%d ", xx[i]);
}
return 0;
}
结果:

3.编写函数,将长度为n的字符串从第m个字符开始的全部字符复制成另一个字符串
点击查看代码
#include <stdio.h>
#include <string.h>
void copyFromM(char s[], int m, char t[]) {
int i = m - 1; // 将用户输入的“第 m 个字符”转换为数组下标
int j = 0;
while (s[i] != '\0') {
t[j] = s[i];
i++;
j++;
}
t[j] = '\0'; // 别忘记结束符
}
int main() {
char s[100], t[100];
int m;
printf("请输入一个字符串: ");
gets(s); // 为简单起见,用 gets(课堂常用)
printf("请输入要从第 m 个字符开始复制: ");
scanf("%d", &m);
copyFromM(s, m, t);
printf("新字符串为: %s\n", t);
return 0;
}
结果:

4.编写函数用冒泡法将数组按从小到大的顺序排列
点击查看代码
#include <stdio.h>
void bubbleSort(int a[], int n) {
int i, j, temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) { // 交换
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
int main() {
int n, i;
int a[100];
printf("请输入数组长度 n: ");
scanf("%d", &n);
printf("请输入 %d 个整数:\n", n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
bubbleSort(a, n);
printf("从小到大排序后的数组为:\n");
for (i = 0; i < n; i++) {
printf("%d ", a[i]);
}
return 0;
}
结果:

5.将n个整数按输入顺序的逆序排列,要求应用带指针参数的函数实现
点击查看代码
#include <stdio.h>
void reverse(int *a, int n) {
int i, temp;
int *p1 = a; // 指向开头
int *p2 = a + n - 1; // 指向结尾
while (p1 < p2) {
temp = *p1;
*p1 = *p2;
*p2 = temp;
p1++;
p2--;
}
}
int main() {
int n, i;
int a[100];
printf("请输入整数个数 n: ");
scanf("%d", &n);
printf("请输入 %d 个整数:\n", n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
reverse(a, n);
printf("逆序后的数组为:\n");
for (i = 0; i < n; i++) {
printf("%d ", a[i]);
}
return 0;
}
结果:

6.写一个函数打印arr数组的内容,不使用数组下标,使用指针
点击查看代码
#include <stdio.h>
void printArr(int *p, int n) {
for (int i = 0; i < n; i++) {
printf("%d ", *(p + i)); // 只用指针,不用下标
}
}
int main() {
int arr[100], n;
printf("请输入数组长度 n: ");
scanf("%d", &n);
printf("请输入 %d 个整数:\n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
printf("数组内容为:\n");
printArr(arr, n);
return 0;
}
结果:

7.编写程序,分别找出多个n×m数组的最大值、最小值,并输出两个值的下标
点击查看代码
#include <stdio.h>
int main() {
int t; // 数组个数
int n, m; // 行列
int a[100][100];
printf("请输入要处理的数组个数 t: ");
scanf("%d", &t);
while (t--) {
printf("\n请输入数组的行数 n 和列数 m: ");
scanf("%d %d", &n, &m);
printf("请输入这个 %d×%d 数组的元素:\n", n, m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &a[i][j]);
}
}
int max = a[0][0], min = a[0][0];
int max_r = 0, max_c = 0;
int min_r = 0, min_c = 0;
// 找最大值和最小值
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] > max) {
max = a[i][j];
max_r = i;
max_c = j;
}
if (a[i][j] < min) {
min = a[i][j];
min_r = i;
min_c = j;
}
}
}
printf("最大值:%d 位置:(%d, %d)\n", max, max_r, max_c);
printf("最小值:%d 位置:(%d, %d)\n", min, min_r, min_c);
}
return 0;
}
结果:

8.判断上三角矩阵。上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵
点击查看代码
#include <stdio.h>
int main() {
int n;
int a[100][100];
int flag = 1; // 假设是上三角矩阵
printf("请输入方阵的阶 n: ");
scanf("%d", &n);
printf("请输入这个 %d×%d 方阵的元素:\n", n, n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
// 判断主对角线以下是否全为 0
for (int i = 1; i < n; i++) { // 从第 2 行开始
for (int j = 0; j < i; j++) { // j < i 部分是对角线以下
if (a[i][j] != 0) {
flag = 0;
break;
}
}
if (!flag) break;
}
if (flag)
printf("这是上三角矩阵。\n");
else
printf("这不是上三角矩阵。\n");
return 0;
}
结果:

9.给定一个按升序排列的二维数组,编写一个函数来判断目标值是否存在于数组中。数组是一个m x n的矩阵,可使用算法快速查询
点击查看代码
#include <stdio.h>
int searchMatrix(int a[][100], int m, int n, int target) {
int r = 0; // 从右上角开始
int c = n - 1;
while (r < m && c >= 0) {
if (a[r][c] == target)
return 1;
else if (a[r][c] > target)
c--; // 太大 → 左移
else
r++; // 太小 → 下移
}
return 0; // 没找到
}
int main() {
int m, n, target;
int a[100][100];
printf("请输入矩阵的行数 m 和列数 n: ");
scanf("%d %d", &m, &n);
printf("请输入按升序排列的 %d×%d 矩阵:\n", m, n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
printf("请输入要查找的目标值: ");
scanf("%d", &target);
if (searchMatrix(a, m, n, target))
printf("找到了!目标值 %d 存在于矩阵中。\n", target);
else
printf("未找到,目标值 %d 不在矩阵中。\n", target);
return 0;
}
结果:

10.编写一个函数,输入一个整数,将其分解为两个质数之和。提示:函数可以声明为int split(int n, int *a, int *b)。n作为传入参数,a和b作为传出参数。若无法分解返回0,可以分解则返回1
点击查看代码
#include <stdio.h>
// 判断是否为质数
int isPrime(int x) {
if (x <= 1) return 0;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return 0;
}
return 1;
}
// 分解为两个质数之和
int split(int n, int *a, int *b) {
for (int i = 2; i < n; i++) {
if (isPrime(i) && isPrime(n - i)) {
*a = i;
*b = n - i;
return 1; // 成功分解
}
}
return 0; // 无法分解
}
int main() {
int n, a, b;
printf("请输入一个整数 n: ");
scanf("%d", &n);
if (split(n, &a, &b))
printf("%d = %d + %d\n", n, a, b);
else
printf("无法将 %d 分解为两个质数之和。\n", n);
return 0;
}
结果:

11.编写函数void shift(char* s, int n),请原地将字符串s循环左移n次。例如,字符串“hello”左移3次得到“lohel”
点击查看代码
#include <stdio.h>
#include <string.h>
// 交换两个字符
void swap(char *a, char *b) {
char t = *a;
*a = *b;
*b = t;
}
// 翻转字符串的某一段
void reverse(char *s, int left, int right) {
while (left < right) {
swap(&s[left], &s[right]);
left++;
right--;
}
}
// 原地循环左移 n 位
void shift(char *s, int n) {
int len = strlen(s);
if (len == 0) return;
n = n % len; // 处理 n 大于字符串长度的情况
if (n == 0) return;
// 使用“三次翻转法”进行左移
reverse(s, 0, n - 1); // 翻转前 n 个字符
reverse(s, n, len - 1); // 翻转后面的字符
reverse(s, 0, len - 1); // 整体再翻转一次
}
int main() {
char s[100];
int n;
printf("请输入字符串:");
gets(s);
printf("请输入左移次数 n: ");
scanf("%d", &n);
shift(s, n);
printf("左移后的字符串为:%s\n", s);
return 0;
}
结果:

12.写一个程序读入一个二维整型数组并判断它是否为魔方矩阵。在魔方阵中,所有的行、列和对角线都拥有相同的和
点击查看代码
#include <stdio.h>
int main() {
int n;
int a[50][50];
printf("请输入方阵的阶 n: ");
scanf("%d", &n);
printf("请输入这个 %d×%d 的矩阵元素:\n", n, n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
int magic = 1; // 假设是魔方阵
int targetSum = 0;
// 计算第一行的和,作为比较的标准
for (int j = 0; j < n; j++)
targetSum += a[0][j];
// 1. 检查每一行的和
for (int i = 1; i < n; i++) {
int rowSum = 0;
for (int j = 0; j < n; j++)
rowSum += a[i][j];
if (rowSum != targetSum) {
magic = 0;
break;
}
}
// 2. 检查每一列的和
if (magic) {
for (int j = 0; j < n; j++) {
int colSum = 0;
for (int i = 0; i < n; i++)
colSum += a[i][j];
if (colSum != targetSum) {
magic = 0;
break;
}
}
}
// 3. 主对角线
if (magic) {
int diag1 = 0;
for (int i = 0; i < n; i++)
diag1 += a[i][i];
if (diag1 != targetSum)
magic = 0;
}
// 4. 副对角线
if (magic) {
int diag2 = 0;
for (int i = 0; i < n; i++)
diag2 += a[i][n - 1 - i];
if (diag2 != targetSum)
magic = 0;
}
// 输出判断结果
if (magic)
printf("这是一个魔方矩阵。\n");
else
printf("这不是魔方矩阵。\n");
return 0;
}
结果:

13.利用指针,判断两个字符串是否相等。忽略大小写。例如,输入 “hello”和”hELlO”,认为它们是相等的。返回值:1表示相等。0表示不同)
点击查看代码
#include <stdio.h>
#include <ctype.h>
// 1 表示相等,0 表示不同
int equalIgnoreCase(char *s1, char *s2) {
while (*s1 && *s2) {
if (tolower(*s1) != tolower(*s2))
return 0;
s1++;
s2++;
}
return *s1 == '\0' && *s2 == '\0';
}
int main() {
char s1[100], s2[100];
printf("请输入第一个字符串:");
gets(s1);
printf("请输入第二个字符串:");
gets(s2);
if (equalIgnoreCase(s1, s2))
printf("两个字符串相等(忽略大小写)。\n");
else
printf("两个字符串不相等。\n");
return 0;
}
结果:

14.定义一个一维数组和二维数组,按顺序打印出数组中每个元素的地址
点击查看代码
#include <stdio.h>
int main() {
int a[5] = {1, 2, 3, 4, 5}; // 一维数组
int b[3][4] = { // 二维数组
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
printf("一维数组 a 的元素地址:\n");
for (int i = 0; i < 5; i++) {
printf("a[%d] 的地址:%p\n", i, (void*)&a[i]);
}
printf("\n二维数组 b 的元素地址:\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("b[%d][%d] 的地址:%p\n", i, j, (void*)&b[i][j]);
}
}
return 0;
}
结果:

15.设计一个分别使用数组名和指针引用数组元素的程序
点击查看代码
#include <stdio.h>
int main() {
int a[5] = {10, 20, 30, 40, 50};
int *p = a; // 指针指向数组首元素
printf("使用数组名访问数组元素:\n");
for (int i = 0; i < 5; i++) {
printf("a[%d] = %d\n", i, a[i]);
}
printf("\n使用指针访问数组元素:\n");
for (int i = 0; i < 5; i++) {
printf("*(p + %d) = %d\n", i, *(p + i));
}
return 0;
}
结果:

浙公网安备 33010602011771号