高级语言程序设计课程第六次个人作业
高级语言程序设计课程第六次个人作业
- 这个作业属于哪个课程: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
函数的用法,学到了很多,使我的编程能力较大提升