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

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


作业内容

  • 设计一个按值传递和按地址传递呈现不同效果的程序。
#include<stdio.h>
void change1(int a,int b); // 按值传递
void change2(int *a,int *b); //按地址传递
int main(){
  int a=1,b=0;
  change1(a,b);         
  printf("a=%d b=%d\n",a,b);  // 按值传递,a,b输出的值并没有交换
  
  a=1;b=0;
  change2(&a,&b);
  printf("a=%d b=%d",a,b);  // 按地址传递,a,b输出的值并成功交换
  return 0;
}
void change1(int a,int b){
	int x=a;
	a=b;
	b=x;
}
void change2(int *a,int *b){
	int x=*a;
	*a=*b;
	*b=x;

屏幕截图 2025-11-21 224032

  • 编写函数fun(int m, int *k, int xx[]),将小于整数m的非素数存入xx数组中,个数由k返回
#include<stdio.h>
#include<math.h>
#define MAX_LEN 1000
void fun(int m, int *k, int xx[]);  //将小于整数m的非素数存入xx数组中,个数由k返回
bool judge(int n);   //判断n是否为素数
void show(int a[],int k);     //输出xx的值和k的值
int main(){
	int m,k=0;
	int xx[MAX_LEN];
	printf("请输入整数m:\n");
	scanf("%d",&m);
	fun(m,&k,xx);
	show(xx,k);
    return 0;
}
bool judge(int n){
	if(n==1) return 0;
     for(int i=2;i<=sqrt(n);i++){          
     	if(n%i==0)return 0;
	 }	
	 return 1;
}
void fun(int m, int *k, int xx[]){
	for(int i=1;i<m;i++){
	   if(!judge(i)){
	   	xx[*k]=i;
	   	(*k)++;           
	   }	
	}
}
void show(int a[],int k){
	for(int i=0;i<k;i++)printf("%d ",a[i]);
	printf("\n总共有%d个",k);
}

屏幕截图 2025-11-23 143836

  • 编写函数,将长度为n的字符串从第m个字符开始的全部字符复制成另一个字符串
#include<stdio.h>
#include<string.h>
void copy(char* t,const char *f,int n,int m);
int main(){
  char a[100];
  char b[100];
  int n,m;
  printf("请输入字符串a,b:\n");
  scanf("%s %s",a,b) ;
  printf("请输入m:");
  scanf("%d",&m); 
  n=strlen(a);
  copy(a,b,n,m);
  printf("a=%s\n",a);
  return 0;
}

void copy(char* t,const char *f,int n,int m) {
	int j=0;
    for (int i=m-1;i<n;i++){
    	 *(t+i)=*(f+j);          
        j=(j+1)%strlen(f);   //当字符串b的长度小于n-m时用模运算循环复制b
	}     
}

屏幕截图 2025-11-23 151904

  • 编写函数用冒泡法将数组按从小到大的顺序排列。
#include<stdio.h>
void sort(int *a,int len);   //用冒泡法将数组按从小到大的顺序排列
void swap(int *a,int *b);    //交换a,b值
void show(int a[],int len);  //输出数组的值
int main(){
  int a[10]={5,25,66,27,1,0,-8,77,2563,0};
  show(a,10);
  sort(a,10);
  show(a,10);
  return 0;
}

void swap(int *a,int *b){
	int m=*a;*a=*b;*b=m;	
}
void sort(int *a,int len){
    for (int i=0;i<len;i++){
    	for(int j=0;j<len-i-1;j++){
    		if(a[j]>a[j+1])swap(&a[j],&a[j+1]);     
		}
	}
}
void show(int a[],int len){
	for(int i=0;i<len;i++)printf("%d ",a[i]);
	printf("\n");
}

屏幕截图 2025-11-22 210252

  • 将n个整数按输入顺序的逆序排列,要求应用带指针参数的函数实现。
//将n个整数按输入顺序的逆序排列,要求应用带指针参数的函数实现。
#include<stdio.h>
void sort(int *a,int len);  //将a数组按倒序排序
void swap(int *a,int *b);   //交换a,b的值
void show(int a[],int len);  //输出数组a的值
int main(){
	int n;
	int a[1000];
	printf("请输入数组长度n和数组的值:\n");
	scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    show(a,n);
    sort(a,n);
    show(a,n);
    return 0;
}

void swap(int *a,int *b){
	int m=*a;*a=*b;*b=m;	
}
void sort(int *a,int len){
    for (int i=0;i<len/2;i++)swap(&a[i],&a[len-i-1]);   //交换数组第i个数和第n-i-1个数,实现倒序,遍历(len/2)遍即可
}
void show(int a[],int len){
	for(int i=0;i<len;i++)printf("%d ",a[i]);
	printf("\n");
}

屏幕截图 2025-11-22 211133

  • 写一个函数打印arr数组的内容,不使用数组下标,使用指针。
#include<stdio.h>
void show(int *a,int len);
int main(){
	int n;
	int arr[1000];
	printf("请输入数组长度n和数组的值:\n");
	scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&arr[i]);
    show(arr,n);
    return 0;
}
void show(int *a,int len){
	for(int i=0;i<len;i++)printf("%d ",*(a+i));   //使用指针来读取数组a
	printf("\n");
}

屏幕截图 2025-11-22 212031

  • 编写程序,分别找出多个n×m数组的最大值、最小值,并输出两个值的下标。
#include<stdio.h>
#include<math.h>
#define  MAX_ROWS 100
void max(int a[MAX_ROWS][MAX_ROWS],int n,int m,int* l,int *w);
void min(int a[MAX_ROWS][MAX_ROWS],int n,int m,int* l,int *w);  
int main(){
	int m,n,l,w;
	int a[MAX_ROWS][MAX_ROWS];
	printf("请输入二维数组的行数n,列数m:\n");
	scanf("%d %d",&n,&m);
	printf("请输入二维数组的值:\n");
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++)scanf("%d",&a[i][j]);
	}
	max(a,n,m,&l,&w);
	printf("数组的最大值是%d,下标为%d %d\n",a[l][w],l,w);
	min(a,n,m,&l,&w);
	printf("数组的最小值是%d,下标为%d %d\n",a[l][w],l,w);
    return 0;
}
void max(int a[MAX_ROWS][MAX_ROWS],int n,int m,int* l,int *w){
	int max=a[0][0];
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(a[i][j]>max){
				max=a[i][j];
				*l=i;
				*w=j;
			}
		}
	}
}
void min(int a[MAX_ROWS][MAX_ROWS],int n,int m,int* l,int *w){
	int min=a[0][0];
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(a[i][j]<min){
				min=a[i][j];
				*l=i;
				*w=j;
			}
		}
	}
}

屏幕截图 2025-11-23 145932

  • 判断上三角矩阵。上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
#include<stdio.h>
#define MAX_ROWS 100
bool check(int a[MAX_ROWS][MAX_ROWS],int n);
int main(){
	int n;
	int arr[MAX_ROWS][MAX_ROWS];
	printf("请输入矩阵行列数n和矩阵的值:\n");
	scanf("%d",&n);
    for(int i=0;i<n;i++){
    	for(int j=0;j<n;j++)
		 scanf("%d",&arr[i][j]);
	}
    if(check(arr,n))
	printf("该矩阵是上三角矩阵\n");
	else  
	printf("该矩阵不是上三角矩阵\n");
    return 0;
}

bool check(int a[MAX_ROWS][MAX_ROWS],int n){
	for(int i=0;i<n;i++){
		for(int j=0;j<i;j++){
			if(a[i][j])return 0;
		}	
	}
	return 1;
}

屏幕截图 2025-11-22 214422

屏幕截图 2025-11-22 214518

  • 给定一个按升序排列的二维数组,编写一个函数来判断目标值是否存在于数组中。数组是一个m x n的矩阵,可使用算法快速查询。
#include<stdio.h>
#define MAX_ROWS 100
bool find(int a[MAX_ROWS][MAX_ROWS],int n,int m,int x);
int main(){
	int n,m,x;
	int arr[MAX_ROWS][MAX_ROWS];
	printf("请输入矩阵行数n,列数m和按升序排列的矩阵的值:\n");
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++){
    	for(int j=0;j<m;j++)
		 scanf("%d",&arr[i][j]);
	}
	printf("请输入要查询的值:\n");
	scanf("%d",&x); 
    while(!find(arr,n,m,x)){
    	scanf("%d",&x); 
	}
    return 0;
}
bool find(int a[MAX_ROWS][MAX_ROWS],int n,int m,int x){
	if(x<a[0][0]||x>a[n][m]){	                                 //先用x和矩阵最小值和最大值比较判断x是否在矩阵内
	printf("%d不在该矩阵中,请重新输入x的值:\n",x);
	return 0;
	}
	for(int i=0;i<n;i++){
		if(a[i][0]<=x&&a[i][m-1]>=x){                            //比较x与第i+1行第一个数字与第m个数字的值快速确定x所在行数
			if(a[i][m-1]==x){                                    //假设x=第i行最后一个数,直接比较一次可以快速确定x的位置
		  	    printf("找到了,%d在矩阵第%d行%d列",x,i+1,m);
			    return 1;
			}
			for(int j=0;j<m-1;j++){                              //确定行数后再该行遍历寻找x所在位置
			if(a[i][j]==x){
			printf("找到了,%d在矩阵第%d行%d列",x,i+1,j+1);
			return 1;
			}
		}	
		}		
	}
}

屏幕截图 2025-11-22 225311

  • 编写一个函数,输入一个整数,将其分解为两个质数之和。提示:函数可以声明为int split(int n, int *a, int *b)n作为传入参数,a和b作为传出参数。若无法分解返回0,可以分解则返回1。
#include<stdio.h>
#include<math.h>
int split(int n, int *a, int *b); 
bool judege(int n);    //判断n是否为素数
int main(){
	int n,a=1,b,f=0;
	printf("请输入分解数n:\n");
	scanf("%d",&n);
	while(split(n,&a,&b)){           //直至找不到分解数为止,输出所有分解数
		printf("%d=%d+%d\n",n,a,b);              
		f=1;                    //判断是否有分解数存在
	}
	if(f==0){printf("%d不能被分解为两个素数之和\n",n);
	}
    return 0;
}
bool judge(int n){
     for(int i=2;i<=sqrt(n);i++){          
     	if(n%i==0)return 0;
	 }	
	 return 1;
}
int split(int n, int *a, int *b){       
	for(int i=*a+1;i<=n/2;i++){           //从a+1开始遍历到i/2结束,缩短搜索时间
		if(judge(i)&&judge(n-i)){         //判断分解的两个数是否都为素数
			*a=i;
			*b=n-i;
			return 1;
		}
	}
	return 0;
}

屏幕截图 2025-11-22 232822

屏幕截图 2025-11-22 232811

  • 编写函数void shift(char* s,int n),请原地将字符串s循环左移n次。例如,字符串“hello”左移3次得到“lohel”。
#include<stdio.h>
#include<string.h>
void shift(char* s,int n); 
int main(){
	char a[10];
	int n;
	printf("请输入字符串s和左移次数n:\n");
	scanf("%s%d",a,&n);
	shift(a,n);
	printf("%s",a);
    return 0;
}

void shift(char* s,int n){
    for(int i=0;i<n;i++){
    	char x=*s;
    	int j;
    	for(j=0;j<strlen(s)-1;j++){
    		s[j]=s[j+1];
		}
		s[j]=x;
	}
}

屏幕截图 2025-11-23 123633

  • 写一个程序读入一个二维整型数组并判断它是否为魔方矩阵。在魔方阵中,所有的行、列和对角线都拥有相同的和。
#include<stdio.h>
#define MAX_ROWS 100
int check(int a[MAX_ROWS][MAX_ROWS],int n);
int main(){
	int n;
	int arr[MAX_ROWS][MAX_ROWS];
	printf("请输入矩阵行列数n和矩阵的值:\n");
	scanf("%d",&n);
    for(int i=0;i<n;i++){
    	for(int j=0;j<n;j++)
		 scanf("%d",&arr[i][j]);
	}
    if(check(arr,n))
	printf("该矩阵是魔方矩阵\n");
	else  
	printf("该矩阵不是魔方矩阵\n");
    return 0;
}

int check(int a[MAX_ROWS][MAX_ROWS],int n){
	int sum;         //定义一个标准值进行后续比较
	int sum1;        //横向的sum
	int sum2[MAX_ROWS]={0};     //纵向第i列的sum
	int sum3[2]={0};            //两对角线的sum
	for(int i=0;i<n;i++){
		sum1=0;
		for(int j=0;j<n;j++){
			sum1+=a[i][j];        //第i行个数相加
			sum2[j]+=a[i][j];        //第j列个数相加
			if(i==j)sum3[0]+=a[i][j];    //计算斜对角线\的值
			if(i==n-j-1)sum3[1]+=a[i][j];     //计算斜对角线/的值(tips:用if语句,而不是else if防止漏算了最中心的值)
			if(i==n-1&&sum!=sum2[j])return 0;    //遍历到最后一行时,比较第j列的sum与标准值是否相同
		}	
		if(i==0)sum=sum1;        //以第一行的总和作为标准sum
		if(sum!=sum1){printf("2");return 0;        //比较第i行sum与标准值是否相同
		}
		if(i==n-1&&(sum!=sum3[0]||sum!=sum3[1]))return 0;     //比较两对角线sum与标准值是否相同
	}
	return 1;
}

屏幕截图 2025-11-23 132743

屏幕截图 2025-11-23 132656

  • 利用指针,判断两个字符串是否相等。忽略大小写。例如,输入 “hello”和”hELlO”,认为它们是相等的。返回值:1表示相等。0表示不同)。
#include<stdio.h>
#include<string.h>
#define MAX_LEN 1000
int judge(char *a,char *b);
int main(){
	char a[MAX_LEN];
	char b[MAX_LEN];
	printf("请输入两个比较的字符串:\n");
	scanf("%s%s",a,b);
    if(judge(a,b))
	printf("两个字符串相等\n");
	else  
	printf("两个字符串不相等\n");
    return 0;
}
int judge(char *a,char *b){
    if(strlen(a)!=strlen(b))return 0;    //比较两字符串的长度,若长度不等直接返回0
    for(int i=0;i<strlen(a);i++){  
    	if(*(a+i)!=*(b+i)&&*(a+i)-*(b+i)!=32&&*(b+i)-*(a+i)!=32)return 0;      //比较各个字符,忽略大小写
	}
	return 1;
}

屏幕截图 2025-11-23 134944

  • 定义一个一维数组和二维数组,按顺序打印出数组中每个元素的地址。
#include<stdio.h>
#include<string.h>
#define ROWS 3      
int main(){
	int a[ROWS]={0,1,2};
	int b[ROWS][ROWS]={{0,1,2},{0,1,2},{0,1,2}};
	for(int i=0;i<ROWS;i++)printf("a[%d]=%d 地址:%d  ",i,a[i],&a[i]);      //&a[i]输出地址
	printf("\n");
	for(int i=0;i<ROWS;i++){
		for(int j=0;j<ROWS;j++)printf("b[%d][%d]=%d 地址:%d   ",i,j,b[i][j],&b[i][j]);   //&b[i][j]输出地址
	    printf("\n");	
	}
    return 0;
}

屏幕截图 2025-11-23 140002

  • 设计一个分别使用数组名和指针引用数组元素的程序。
#include<stdio.h>
#include<string.h>
#define LEN 3
void sort1(int *a);  //指针引用数组元素,将a数组按倒序排序
void sort2(int a[]);   //使用数组名引用数组元素,将a数组按倒序排序
void swap(int *a,int *b);   //交换a,b的值
void show(int a[]);  //输出a
int main(){
	int a[LEN]={0,1,2};
	sort1(a);
	show(a);
	
	for(int i=0;i<LEN;i++)a[i]=i;  //重新给a赋值
	sort2(a);
	show(a);
    return 0;
}
void swap(int *a,int *b){
	int m=*a;*a=*b;*b=m;	
}
void sort1(int *a){
    for (int i=0;i<LEN/2;i++)swap(a+i,a+LEN-i-1);  
}
void sort2(int a[]){
    for (int i=0;i<LEN/2;i++)swap(&a[i],&a[LEN-i-1]);  
}
void show(int a[]){
	for(int i=0;i<LEN;i++)printf("%d ",a[i]);
	printf("\n");
}

屏幕截图 2025-11-23 141625


总结&思考

  • 学会运用指针和地址的方式将变量传给函数
  • 掌握了一维数组,二维数组,字符串在函数中的运算
posted @ 2025-11-23 15:25  叶银珍  阅读(6)  评论(0)    收藏  举报