week6编程作业
1数组之和
尝试自己写的,但不对,调试没出来
#include<stdio.h>
int ArraySum (int n, int m,int a[n][m]);//函数申明
//功能函数
int ArraySum ( int n,int m,int a[n][m])
{
for( int i = 0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int sum+=a[i][j];
}
}
return sum;
}
int main()
{
int n,m,i,j;
scanf("%d%d",&n,&m);
//输入二维数组的值
for( i = 0;i<n;i++)
{
for(j=0;j<m;j++){
scanf("%d",&a[i][j]);
}
}
ArraySum();
return 0;
}
10分:
#include <stdio.h>
//int fun(int a[][],int n,int m);
int main()
{
int a[100][100],n,m,sum=0;
int i,j;
int ArraySum(int a[100][100],int n,int m);
//printf("Input the row and col number of array:");
scanf("%d%d",&n,&m);
//printf("Input the number of array:");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
sum=ArraySum(a,n,m);
}
}
printf("%d\n",sum);
}
int ArraySum(int a[100][100],int n,int m)
{
int sum=0;
int i,j;
for(i=0;i<n;i++)
{
//int sum =0;
for(j=0;j<m;j++)
sum+=a[i][j];
}
return sum;
}
注意的点:
在main函数中要将sum初始化,不然会有警告消息提示 在功能函数中,int sum的初始化要放在for循环的外面,不能放在for循环里面 函数声明可以放在mian函数的外面或者里面都行,只要放在调用的前面就可以
2.欧氏距离
使用函数计算两点间的距离:给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离(保留2位小数)。
要求定义和调用函数dist(x1,y1,x2,y2)计算两点间距离
#include <stdio.h>
#include <math.h>
//函数声明
double dist( double x1, double y1, double x2, double y2 );
//主函数
int main()
{
double x1, y1, x2, y2;
scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
printf("Distance=%.2f\n", dist(x1, y1, x2, y2));
return 0;
}
//功能函数
double dist( double x1, double y1, double x2, double y2 )
{
double d = pow( (x1-x2), 2) + pow( (y1-y2), 2);
double f = sqrt( d );
return f;
}
3.判断素数(主要是这个算法没搞明白,自己编2小时,满分)
编写一个判素数的函数,在主函数中输入一个整数,输出是否为素数的信息。主函数中循环输入整数,当输入小于3的整数结束程序。
判断素数的基本函数,运用一个数来记录下这个数除以比这个数小的数的所有能除的次数
#include <stdio.h>
int main()
{
int n;
printf("请输入一个1-100之间的整数:\n");
scanf("%d", &n);
int m = 0,i;
for (i = 2; i < n; i++ )
{
if(n % i == 0)
{
m++;
}
}
if (m == 0)
{
printf("%d是素数\n", n);
} else
{
printf("%d不是素数\n", n);
}
return 0;
}
用函数模块来写,带函数判断质数的代码
成功:有一个连续输入的要求(编了将近2小时)
#include <stdio.h>
int Prime( int n);//函数声明
int main()
{
int n;
while(1)//连续输入的一个需求
{
scanf("%d", &n);
printf("m=\n");
if ( n<3 )
{
printf("The end.\n");
break;
}
else
{
Prime(n);
}
}
return 0;
}
int Prime ( int n )
{
int m = 0,i;
for( i = 2 ; i< n ; i++)
{
if( n%i == 0)
{
m++;
}
}
//进行总的一个判断,把关
if(m == 0)
{
printf("%d is prime.\n",n);
}
else
{
printf("%d is not prime.\n",n);
}
return 0;
}
4.逆序字符串(速度很快,代码编的很快,通过了)
编写一个可以将字符串逆序的函数,在主函数中调用该函数将输入字符串逆序输出。
思路:
让字符串数组从末尾输出,即可,最后再i--
字符串的长度等于strlen(str),要加入一个头文件include<string.h>
#include <stdio.h>
#include<string.h>
void Str(char str[])
{
int i;
printf("the reverse string:");
for(i=strlen(str);i>=0;i--)
{
printf("%c",str[i]);
}
}
int main()
{
char str[100];
scanf("%s",str);
printf("the original string:%s\n",str);
Str(str);
return 0;
}
5.替换字符串中字符(速度很快,代码编的很快,通过了)
编写一个字符串替换函数,可以将所给字符串中与指定字符相同的所有字符替换成要求的字符,并在主函数中调用该函数实现字符串替换操作。(10分)
#include<stdio.h>
#include<string.h>
void replace(char str[], char c, char s)//函数块
{
int i=0;
for(i=0;i<=strlen(str);i++)
{
if(str[i]==c)
{
str[i]=s;
}
}
}
int main()
{
char str[100]="ABCDECCFGC";
replace(str, 'C', '5');
printf("%s\n", str);
}
6.函数——将字符串插入(知识点总结,数组串,指针函数)
编写一个将一个字符串插入到另一个字符串中的函数,在主函数中调用该函数实现字符串的插入操作。插入函数包含三个参数,即将str2插入到str1的pos位置。
思路:
//char * change(char s1[],char s2[],int n)
一个指针函数, 根据传入的参数`,来计算函数功能,其结果通过指针的形式返回给调用方
1.先把str1的值放到str{2个字符串的长度}末尾,str1字符串中有足够的空间存放str2字符串
2.然后将s2的值和插入的位置建立起来,s2[i]和插入值n的联系为s1[i+n]
知识点:字符串数组
char ch[N] 和char *str = (char*)malloc(N*sizeof(char))
char ch[N] :当数组中个数成为自变量的时候,不能使用这种定义方式,应该申请动态数组
char *s1 = (char*)malloc(20 * sizeof(char));///申请20个连续字节的空间,定义*ch,指向该连续空间的首地址sizeof(char)=1)
动态数组
当函数的返回值为指针的时候,倘若指针指向的是局部变量:ch[6]为存储的是局部变量,当返回指针str时,函数外,该变量生命周期结束,所以要使用动态数组
void* func(int N)
{
char *str = (char*)malloc(N*sizeof(char));
return str;
}
void* func(int N)
{
char ch[6]="hello";
char *str = ch;
return str;
}
写出来了10分
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
char *change(char s1[],char s2[],int n)
{
int len1=strlen(s1);
int len2=strlen(s2);
int i;
char N[]="error";
char *P=N;
//char *P="error";
if(n<0||n>len1)
{
return P;
}
else
{
for(i=len1;i>=n-1;i--)
{
s1[i+len2]=s1[i];
}
for(i=0;i<len2;i++)
s1[n+i]=s2[i];
return s1;
}
}
int main()
{
char *s1 = (char*)malloc(20 * sizeof(char));
char *s2 = (char*)malloc(20 * sizeof(char));
int n;
char s3[30];
char *newstr = s3;//作为函数调用方的地方
printf("Please input two strings:\n");
scanf("%s%s", s1,s2);//不需要加&,指针就是指向地址
printf("Please input the position of insert:\n");
scanf("%d", &n);
newstr = change(s1, s2, n);
printf("%s\n", newstr);
}
原因:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UKmPDq7H-1650845695467)(E:\Coding\typora\C语言编程photo\image-20220418105422727.png)]
调试过程:(6.67分)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *change(char s1[],char s2[],int n)
{
int len1=strlen(s1);
int len2=strlen(s2);
int i;
int j=0;
int k=0;
for(i=len1;i>=n-1;i--)
{
s1[i+len2]=s1[i];
}
for(i=0;i<len2;i++)
s1[n+i]=s2[i];
return s1;
}
int main()
{
char *s1 = (char*)malloc(20 * sizeof(char));
char *s2 = (char*)malloc(20 * sizeof(char));
int n;
char s3[30];
char *newstr = s3;
printf("Please input two strings:\n");
scanf("%s%s", s1,s2);
// printf("请输入第二个字符串:");
// scanf("%s", s2);
printf("Please input the position of insert:\n");
scanf("%d", &n);
newstr = change(s1, s2, n);
printf("%s\n", newstr);
}
7. 函数——多函数综合题
10分
#include<stdio.h>
//以下为全局变量
int price[5]={100,50,35,150,200};//产品报价
int item_n[100][5];//用来表示不同销售员对应产品销售数量的数组,如 item_n[1][3]表示销售员1
//销售的3号产品的数量。销售员编号从0开始
int n=0;
int maximum (int values[],int n)
{
//找出谁是销售冠军,返回为数组最大值的索引
int top_nu=0,i;
for(i=0;i<n;i++)
{
if(values[i]>values[top_nu]) top_nu=i;
}
return top_nu;
}
void total_sales(int n,int arr[][5])
{
int i,j;
int values[100]={0};
for(i=0;i<n;i++)
{
for(j=0;j<5;j++)
{
values[i] +=arr[i][j]*price[j];
}
}
for(i=0;i<n;i++)
{
printf("total sales of salesman %d is %d\n",i,values[i],values[i]*0.1);
printf("income of salesman %d is %.4lf\n",i,values[i]*0.1);
}
int max=maximum(values,n);
printf("sales-champion is salesman %d\n",max);
/*
计算每个销售人员的总销售额并输出。
销售佣金为10%,请计算每个销售员的收入并输出
调用 maximum() 输出谁是销售冠军
*/
}
int main()
{
//数据读入
int i,j;
printf("please input the number of salesman\n");
scanf("%d",&n);
printf("please input the number of items sold for each product of %d salesman\n",n);
for(i=0;i<n;i++)
{
for(j=0;j<5;j++)
scanf("%d",&item_n[i][j]);
}
total_sales(n,item_n);
}
8. 函数——递归将整数转为二进制
#include <stdio.h>
void binary(int num);
int main()
{
//实现十进制转换成二进制
int num = 0;
scanf("%d",&num);
binary(num);
return 0;
}
void binary(int num) {
int i = num % 2;
if (num > 0) {
binary(num / 2);
printf("%d", i); //递归的后序输出,实现输出的倒置
}
}
9. 实验 6 函数:整数分解为素因子乘积
#include <math.h>
#include <stdio.h>
#include <string.h>
int isPrime(int para)//函数isPrime用来判断质数
{
int result=1;
if(para%2==0||para<2){
result = 0;
}else{
int i=3;
for(i=3;i<para;i=i+2)
{
if(para%i==0)
{
result = 0;
break;
}
}
}
return result;
}
int main()
{
int input;
scanf("%d",&input);
printf("%d=",input);
int i=2;
if(isPrime(input)){
printf("%d",input);
}else{
for(i=2;i<input;i++)
{
while(input%i==0)
{
input=input/i;
if(isPrime(input)||input==2)//此处是最后一次除法
{
printf("%d*%d",i,input);
break;
}else//每找到一个质因数就输出i*
{
printf("%d*",i);
}
}
}
}
return 0;
}
10. 函数——哥德巴赫猜想之偶数分解
10分
#include <stdio.h>
#include <math.h>
int isPrime(long x){
int i;
for(i=2;i<(int)sqrt(x)+1;i++)
{
if(x%i==0)return 1;
}
return 0;
}
void getPrimePair(long m)
{
int i;
int num1;
int num2;
int count=0;
for(i=2;i<=m/2;i++)
{
num1 =i;
if(isPrime(num1)) num1=0;
num2=m-i;
if(isPrime(num2)) num2=0;
if(num1&&num2)
{
printf("%ld = %d + %d\r\n",m,num1,num2);
count++;
}
}
printf("The number %ld has %d prime number decomposition methods\n",m,count);
}
int main()
{
long number;
scanf("%ld",&number);
if(number%2!=0||number<4) printf("The end");
else getPrimePair(number);
return 0;
}
<(int)sqrt(x)+1;i++)
{
if(x%i==0)return 1;
}
return 0;
}
void getPrimePair(long m)
{
int i;
int num1;
int num2;
int count=0;
for(i=2;i<=m/2;i++)
{
num1 =i;
if(isPrime(num1)) num1=0;
num2=m-i;
if(isPrime(num2)) num2=0;
if(num1&&num2)
{
printf(“%ld = %d + %d\r\n”,m,num1,num2);
count++;
}
}
printf("The number %ld has %d prime number decomposition methods\n",m,count);
}
int main()
{
long number;
scanf(“%ld”,&number);
if(number%2!=0||number<4) printf(“The end”);
else getPrimePair(number);
return 0;
}