高级语言程序设计课程第六次个人作业

高级语言程序设计课程第六次个人作业


一、完成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;
}

思路:按题意理解即可
问题:无
解决:无


三、总结思考:

  1. 学会了通用的数组长度获取方法,请点击这里跳转
  2. 复习了地址的获取方法
  3. 复习了strlen函数的用法,学到了很多,使我的编程能力较大提升
posted @ 2024-11-10 11:54  空余晚秋  阅读(4)  评论(0编辑  收藏  举报