高级语言程序设计第六次个人作业
作业内容
#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]()
总结&思考
- 学会运用指针和地址的方式将变量传给函数
- 掌握了一维数组,二维数组,字符串在函数中的运算