高级语言程序设计课程第六次个人作业
高级语言程序设计课程第六次个人作业
- 这个作业属于哪个课程:2024高级语言程序设计
- 这个作业要求在哪里:高级语言程序设计课程第六次个人作业
- 学号:032201218
- 姓名:陈彦哲
一、完成1-12题
1.1
题目:
编写函数fun(int m, int *k, int xx[]),将小于整数m的非素数存入xx数组中,个数由k返回。
#include <stdio.h> #include <string.h> #include <math.h> int IsPrime(int x){ if(x==1){ return 0; } if(x==2){ return 1; } for(int i=2;i<=pow(x,0.5);i++){ if(x%i==0){ return 0; } } return 1; } int fun(int m, int *k, int xx[]){ int p=0; for(int i=1;i<m;i++){ if(IsPrime(i)){ xx[p]=i; p++; } } k=&p; return *k; } int main() { int m=50; int k=0; int xx[50]; printf("m=%d,xx[]的长度为%d",m,fun(m, &k, xx)); return 0; }
思路:
根据题意理解即可。
问题:把读取地址的符号记成了*
解决:后来想起来,初始化指针才是用*
,读取地址是用&
1.2
题目:
编写函数,将长度为n的字符串从第m个字符开始的全部字符复制成另一个字符串
#include <stdio.h> #include <string.h> #include <math.h> void CopyString(char *c,char *copy,int m){ char *p=c+m; while(*p!='\0'){ *copy=*p; copy++; p++; } *copy='\0'; } int main() { char c[1000]="I am Chen Yanzhe, I come from China,I love Coding."; int m=10; char copy[1000]; CopyString(c,copy,m); printf("%s\n%s",c,copy); return 0; }
思路:按题意理解即可
问题:不知道C语言怎么获取字符串长度
解决:最常见的方法是这个,这样计算不包括'\0'
,注意这个函数要包含string.h
这个头文件
char strArray[] = "Hello, World!"; int length = strlen(strArray);
用下面的方法就可以获取所有类型的字符串的长度
int arr[] = {1, 2, 3, 4, 5}; int length = sizeof(arr) / sizeof(arr[0]);
11.3
题目:编写函数用冒泡法将数组按从小到大的顺序排列。
#include <stdio.h> #include <string.h> #include <math.h> void BubbleSort(int *n,int len){ int i,j,temp; for(i=0;i<len-1;i++){ for(j=0;j<len-i;j++){ if(n[j]>n[j+1]){ temp=n[j]; n[j]=n[j+1]; n[j+1]=temp; } } } } int main() { int a[10]={12,59,48,3,7,6,15,117,87,1}; for(int i=0;i<10;i++){ printf("%d ",a[i]); } printf("\n"); BubbleSort(a,10); for(int i=0;i<10;i++){ printf("%d ",a[i]); } printf("\n"); return 0; }
思路:按题意理解即可
问题:答案有误
解决:
查阅资料得知:
sizeof(n)/sizeof(n[0])
这行代码,当 n
作为函数参数传递时,它被视为一个指向数组第一个元素的指针,而不是整个数组。因此,sizeof(n)
将返回指针的大小,通常是 4 或 8 字节,取决于系统是 32 位还是 64 位,而不是数组的实际大小。
表达式 int len = sizeof(n) / sizeof(n[0]);
用于计算数组 n
的长度时,只能在数组定义的作用域内直接使用。
当数组通过指针传递给函数时,函数内部无法直接知道原始数组的大小。在函数内部,指针只表示数组首元素的地址,而不包含数组的长度信息。
void someFunction(int *arr) { // int len = sizeof(arr) / sizeof(arr[0]); // 错误,len 将不是数组的实际长度 // 因为 sizeof(arr) 在这里会返回指针的大小,而不是数组的大小 }
1.4
题目:将n个整数按输入顺序的逆序排列,要求应用带指针参数的函数实现。
#include <stdio.h> #include <string.h> #include <math.h> void MyReverse(int *n,int len){ int i,temp; for(int i=0;i<len/2;i++){ temp=n[len-i-1]; n[len-i-1]=n[i]; n[i]=temp; } } int main() { int a[10]={12,59,48,3,7,6,15,117,87,1}; for(int i=0;i<10;i++){ printf("%d ",a[i]); } printf("\n"); MyReverse(a,10); for(int i=0;i<10;i++){ printf("%d ",a[i]); } printf("\n"); return 0; }
思路:按题意理解即可
问题:无
解决:无
1.5
题目:写一个函数打印arr数组的内容,不使用数组下标,使用指针。
#include <stdio.h> #include <string.h> #include <math.h> void MyPrint(int *n,int len){ for(int i=0;i<len;i++){ printf("%d ",*(n+i)); } printf("\n"); } int main() { int a[10]={12,59,48,3,7,6,15,117,87,1}; MyPrint(a,10); return 0; }
思路:按题意理解即可
问题:无
解决:无
1.6
题目:编写程序,分别找出多个n×m数组的最大值、最小值,并输出两个值的下标。
#include <stdio.h> void findMaxMin(int arr[][100], int n, int m, int *maxRow, int *maxCol, int *minRow, int *minCol) { int max = arr[0][0]; int min = arr[0][0]; *maxRow = *maxCol = *minRow = *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; } } } } int main() { int t, n, m; int arr[100][100]; scanf("%d", &t); for (int k = 0; k < t; k++) { scanf("%d %d", &n, &m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &arr[i][j]); } } int maxRow, maxCol, minRow, minCol; findMaxMin(arr, n, m, &maxRow, &maxCol, &minRow, &minCol); printf("组数%d:\n", k + 1); printf("最大值的位置: (%d, %d)\n", maxRow, maxCol); printf("最小值的位置: (%d, %d)\n", minRow, minCol); } return 0; }
思路:按题意理解即可
问题:无
解决:无
1.7
题目:判断上三角矩阵。上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
#include <stdio.h> int isUpperTriangular(int matrix[][100], int n) { for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { if (matrix[i][j] != 0) { return 0; } } } return 1; } int main() { int n, matrix[100][100]; scanf("%d", &n); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &matrix[i][j]); } } if (isUpperTriangular(matrix, n)) { printf("Yes\n"); } else { printf("No\n"); } return 0; }
思路:按题意理解即可
问题:无
解决:无
1.8
题目:
给定一个按升序排列的二维数组,编写一个函数来判断目标值是否存在于数组中。数组是一个m x n的矩阵,可使用算法快速查询。
#include <stdio.h> int searchMatrix(int matrix[][100], int m, int n, int target) { int left = 0, right = m * n - 1; while (left <= right) { int mid = (left + right) / 2; int midValue = matrix[mid / n][mid % n]; if (midValue == target) { return 1; } else if (midValue < target) { left = mid + 1; } else { right = mid - 1; } } return 0; } int main() { int m, n, target; int matrix[100][100]; scanf("%d %d", &m, &n); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { scanf("%d", &matrix[i][j]); } } scanf("%d", &target); if (searchMatrix(matrix, m, n, target)) { printf("Yes\n"); } else { printf("No\n"); } return 0; }
思路:按题意理解即可
问题:无
解决:无
1.9
题目:编写一个函数,输入一个整数,将其分解为两个质数之和。提示:函数可以声明为int split(int n, int *a, int *b)。n作为传入参数,a和b作为传出参数。若无法分解返回0,可以分解则返回1。
#include <stdio.h> int isPrime(int num) { if (num <= 1) return 0; for (int i = 2; i * i <= num; i++) { if (num % i == 0) return 0; } return 1; } int split(int n, int *a, int *b) { for (int i = 2; i <= n / 2; i++) { if (isPrime(i) && isPrime(n - i)) { *a = i; *b = n - i; return 1; } } return 0; } int main() { int n, a, b; scanf("%d", &n); if (split(n, &a, &b)) { printf("Yes\n"); printf("%d = %d + %d\n", n, a, b); } else { printf("No\n"); } return 0; }
思路:按题意理解即可
问题:无
解决办法:无
1.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); n=n%len; char temp[100]; for(int i=0;i<len;i++){ temp[i]=s[(i+n)%len]; } for(int i=0;i<len;i++){ s[i]=temp[i]; } } int main(){ char s[100]; int n; scanf("%s%d",s,&n); shift(s,n); printf("%s\n",s); return 0; }
思路:按题意理解即可
问题:无
解决:无
1.11
题目:
写一个程序读入一个二维整型数组并判断它是否为魔方矩阵。在魔方阵中,所有的行、列和对角线都拥有相同的和。
#include <stdio.h> int isMagicSquare(int matrix[100][100], 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 diag1Sum = 0; for(int i=0;i<n;i++) diag1Sum += matrix[i][i]; if(diag1Sum != sum) return 0; int diag2Sum = 0; for(int i=0;i<n;i++) diag2Sum += matrix[i][n-i-1]; if(diag2Sum != sum) return 0; return 1; } int main() { int n, matrix[100][100]; scanf("%d", &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("Yes\n"); } else { printf("No\n"); } return 0; }
思路:按题意理解即可
问题:无
解决:无
1.12
题目:利用指针,判断两个字符串是否相等。忽略大小写。例如,输入 “hello”和”hELlO”,认为它们是相等的。返回值:1表示相等。0表示不同)。
#include <stdio.h> int compareStrings(char* s1,char* s2){ while(*s1 && *s2){ if(*s1 != *s2 && (*s1^32) != *s2) return 0; s1++; s2++; } return *s1 == *s2; } int main(){ char s1[100],s2[100]; scanf("%s%s",s1,s2); printf("%d\n",compareStrings(s1,s2)); return 0; }
思路:按题意理解即可
问题:无
解决:无
三、总结思考:
- 学会了通用的数组长度获取方法,请点击这里跳转
- 复习了地址的获取方法
- 复习了
strlen
函数的用法,学到了很多,使我的编程能力较大提升
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」