C++第九次作业(指针函数_函数指针_主函数参数_动态分配内存)

本文提供了多个C++编程实例,包括十进制转其他进制、求非线性方程根、计算最大公约数和最小公倍数、动态内存分配等,通过实际代码展示了C++在解决数学问题和数据处理方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录:

一:C++设计一个函数实现将十进制实型数d转换为r(r=2、8、16)进制的形式的字符串,并将此字符串作为函数的返回值

代码实现

运行结果

二:C++编制使用区间对分法求非线性方程根的函数DuiFenfa()求以下非线性方程的根

代码实现

运行结果

三:c++设程序名为gcd.exe以命令行的方式计算两个整数的最大公约数

 知识点补充:主函数参数

算法思想 

方法一:函数实现  

代码实现

运行结果

 方法二:以命令行的方式 

四:c++设程序名为sum.exe以命令行的方式计算两个整数的最小公倍数

 算法思想

代码实现

运行结果

五:c++主函数参数设程序名为sum.exe以命令行的方式求若干个实型数的加和

代码实现

方法一 

方法二 

运行结果

第一步:先写好代码在软件中编译好

第二步:查看生成可执行应用程序地址

第三步:进入到指定目录

第四步:运行应用程序并传值

六:c++动态分配内存的应用(new 和 delete的使用)用动态一维数组实现M*K矩阵和K*N矩阵的存储和乘积运算

new和delete的用法 

代码实现

运行结果


一:C++设计一个函数实现将十进制实型数d转换为r(r=2、8、16)进制的形式的字符串,并将此字符串作为函数的返回值

代码实现

#include <iostream>  
using namespace std;

char  *DecTo2816(double d , unsigned short r)
{ 
	int zhengshu;//定义整数
	double xiaoshu; //定义小数
	
	int count1 = 0;//计数1
	int count2 = 0;//计数2
 
	int a[255];//整数转化后的数组
	int b[255];//小数转化后的数组
 
	double ji;//相乘的积


	//分离整数和小数
	zhengshu = (int)d;
	//分离小数部分
	xiaoshu = d - zhengshu;
 
 
	//整数部分
	while(zhengshu!=0)
	{
		a[count1] = zhengshu % r;  //取余数 然后存入数组
		zhengshu = zhengshu / r;	 //降级
		count1++;						 //计数	
	}
	for(int i=count1-1;i>=0;i--)		//循环遍历输出
	{
		if(a[i]<10)
		{
			cout << a[i];				//小于10正常输出数
		}
		else
		{
			cout << char(a[i]+'A'-10);  //大于10就转换
		}
		 
	}
 
	cout << ".";//连接整数小数
 
	//小数部分
	while (xiaoshu!=0)
	{
		ji=xiaoshu*r;				//取积
		b[count2]=(int)ji;				//取整数部分 存入数组
		xiaoshu=ji-(int)ji;				//得到小数部分
		count2++;						//计数
 
	} 
	for(int j=0;j<count2;j++)			//循环遍历输出
	{
		if(b[j]>=10) 
			cout<<(char)(b[j]+'A'-10);	//大于10就转换
		else 
			cout<<b[j];					//小于10正常输出数
	}
	
	return " ";
}

int main()
{
	char *str;
	cout <<"最终你输入的数转化对于进制的值为:";
	str = DecTo2816(100.285,2);
	cout <<str <<endl;

	system("pause");
	return 0;
}

运行结果

二:C++编制使用区间对分法求非线性方程根的函数DuiFenfa()求以下非线性方程的根

  1. f(x)=x^3+4x^2-10=0,求根区间为[1,2];
  2. f(x)=x^3-2x-5=0,求根区间[2,3];
  3. f(x)= x^3+2x^2+10x-20,求根区间[0,2]

代码实现

#include <iostream>
#include <cmath>
using namespace std;

 
//定义最终近似实根值变量
double rusult;
 
//定义三个方程函数
double fun1(double x)
{
    return x*x*x+4*x*x-10;//方程不一定,自定义
}

double fun2(double x)
{
    return x*x*x-2*x-5;//方程不一定,自定义
}

double fun3(double x)
{
    return x*x*x+2*x*x+10*x-20;//方程不一定,自定义
}

//定义
double DuiFenfa1(double (*f )(double),double start,double end)
{
	if (f(start)*f(end)>0)
	{
		//查找算法失效
		return 0.0 ;
	}

	while (true)
	{
		//计算中间值
		double mid = (start + end)/2;
		//获取函数值的绝对值
		double jueduimid = abs(f(mid));
		double jueduicha = abs(end - start);
		//判断是否跳出循环
		if (jueduimid < 1e-7 || jueduicha < 1e-7 )
		{
 
			return mid;
		}
		//开始折半搜索查找
		if (f(mid)*f(start) < 0)
		{
			end = mid;
		}
		else
		{
			start = mid;
		}
	}
	
}	

 
int main()
{
	
	double liu1 = DuiFenfa1(fun1,1,2);
	double liu2 = DuiFenfa1(fun2,2,3);
	double liu3 = DuiFenfa1(fun3,0,2);

	cout <<"第一个函数:x*x*x+4*x*x-10"<<endl;
	cout <<"在区间[1,2]上的近似实根为:"<<liu1 <<endl;
	cout <<endl;

	cout <<"第二个函数:x*x*x-2*x-5"<<endl;
	cout <<"在区间[2,3]上的近似实根为:"<<liu2 <<endl;
	cout <<endl;

	cout <<"第三个函数:x*x*x+2*x*x+10*x-20"<<endl;
	cout <<"在区间[0,2]上的近似实根为:"<<liu3 <<endl;
	cout <<endl;

	system("pause");
	return 0;
}

运行结果

三:c++设程序名为gcd.exe以命令行的方式计算两个整数的最大公约数

在这之前我们先来了解一些基础知识 

 知识点补充:主函数参数

int main(int argc, char *argv)

1.从函数参数的形式上看包含:一个整型,一个指针数组

2.当一个C/C++的源程序经过编译、链接后,会生成扩展名为.EXE的可执行文件,这是可以在操作系统下直接运行的文件,换句话说,就是由系统来启动运行的


3.设命令行为:program str1 str2 str3 str4 str5
其中program为文件名,也就是一个由program.c经编译、链接后生成的可执行文件program.exe,其后各跟5个参数。
对main()函数来说,它的参数argc记录了命令行中命令与参数的个数,共6个,指针数组的大小由参数argc的值决定,即为char*argv[6]

4.C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。
  4.1 因此,main函数的函数头可写为: main (argc,argv)
      C语言还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组。
  4.2 加上形参说明后,main函数的函数头应写为: 
      int main (int argc,char *argv[]){…}或者 
      int main (int argc,char **argv){…} 
  4.3 其中第一个表示参数的个数;第二个参数中argv[0]为自身运行目录路径和程序名
      argv[1]指向第一个参数、argv[2]指向第二个参数……
  4.4 其中 argc 的全称是 argument count,即命令行的参数的数目。 
      argv 的全称是 argument value,即命令行的参数对应的值
  4.5 命令行的参数是以空格分开


5.如何执行main函数
    5.1 由于main函数不能被其它函数调用, 因此不可能在程序内部取得实际值。
    5.2 那么,在何处把实参值赋予main函数的形参呢? 
        实际上,main函数的参数值是从操作系统命令行上获得的。
        当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传                 
        送到main的形参中去
    5.3 具体操作如下:
        5.3.1 首先在C++中完成编译之后
        5.3.2 然后在dos命令窗口下切换到.exe执行文件所在的文件夹(dos下如何切换目录见DOS中切换            
              盘符及目录)
        5.3.3 再在该路径下输入带参数的命令:XXX.exe a b c …即可得到输出

算法思想 

第一步:选择两个数中的任意一个数

第二步:依次递减作为除数

第三步:分别用除数除以这两个数,如果两个数取余都为0,那么这个数就是最大公约数

方法一:函数实现  

代码实现

#include <iostream>
#include <cmath>
using namespace std;

 
unsigned gcd(unsigned m , unsigned n)
{
	for (int i = m; i > 0; i--)
	{
		if (m%i==0 && n%i==0)
		{
			return i;
			break;
		}
	}
}

 
int main()
{
	
	int a,b,ruslut;
	cout <<"请输入第一个数:"<<endl;
	cin >> a;
	cout <<"请输入第二个数:"<<endl;
	cin >> b;
	ruslut = gcd(a,b);

	cout <<"你输入的两个数的最大公约数为:"<<ruslut<<endl;
	system("pause");
	return 0;
}

运行结果

 方法二:以命令行的方式 

第一步:先写好代码在软件中编译好
第二步:查看生成可执行应用程序地址
第三步:进入到指定目录
第四步:运行应用程序并传值

 

#include <iostream>
#include <cmath>
using namespace std;

 
int main()
{
	
	if (argc!=3)
    {
		return 0;
	}	

	int m,n,r;
		m=atoi(argv[1]);
		n=atoi(argv[2]);
		r = m % n;

		while(r!=0)
        {
			m=n;
			n=r;
			r=m%n;

		}
		cout<<argv[1]<<"和"<<argv[2]<<"最大公约数为:"<<n<<endl;

	system("pause");
	return 0;
}

四:c++设程序名为sum.exe以命令行的方式计算两个整数的最小公倍数

 算法思想

第一步:选择两个数中的任意一个作为其实量

第二步:选中的这个数依次递增作为被除数

第三步:用被除数去除以这两个数,如果余数都为为0,那么就找到最小公倍数了

代码实现

#include <iostream>
#include <cmath>
using namespace std;

 
unsigned gcd(unsigned m , unsigned n)
{
	for (int i = m; ; i++)
	{
		if (i%m==0 && i%n==0)
		{
			return i;
			break;
		}
	}
}

 
int main()
{
	
	int a,b,ruslut;
	cout <<"请输入第一个数:"<<endl;
	cin >> a;
	cout <<"请输入第二个数:"<<endl;
	cin >> b;
	ruslut = gcd(a,b);

	cout <<"你输入的两个数的最小公倍数为:"<<ruslut<<endl;
	system("pause");
	return 0;
}

运行结果

五:c++主函数参数设程序名为sum.exe以命令行的方式求若干个实型数的加和

代码实现

方法一 

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
	int sum=0;

	for (int i = 0; i < argc; i++)
	{
		sum+=atoi(argv[i]);
	}

	cout <<sum<<endl;
	system("pause");
    return 0;
}

方法二 

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
	int sum=0;
	while(--argc)
	{
		if (argc!=0)
		{
			sum+=atoi(argv[argc]);
		}
	}
	cout <<sum<<endl;
	system("pause");
    return 0;
}

运行结果

第一步:先写好代码在软件中编译好

第二步:查看生成可执行应用程序地址

第三步:进入到指定目录

第四步:运行应用程序并传值

六:c++动态分配内存的应用(new 和 delete的使用)用动态一维数组实现M*K矩阵和K*N矩阵的存储和乘积运算

new和delete的用法 

C++ new和delete(C++动态分配和释放内存)
 
new和delete基本用法:
new的用法
-------------------------------------
int* p;
p = new int;
*p = 5;
------------------
int* pn;
int i = 5 ;
pn = new int[i*20];
pn[0] = 20 ;
pn[100] = 30;——报错
------------------
开辟数组空间
    一维: int *a = new int[100];开辟一个大小为100的整型数组空间
    二维: int **a = new int[5][6]
-------------------------------------



delete的用法
-------------------------------------
int* p = new int;
*p = 5;
delete p;
delete p;  //本句会导致程序出错
------------------
int* p = new int[20];
p[0] = 1;
delete[] p;
-------------------------------------
如果动态分配了一个数组,但是却用delete p的方式释放,没有用[],则编译时没有问题,运行时也一般不会发生错误,但实际上会导致动态分配的数组没有被完全释放

代码实现

#include <iostream>
#include <cmath>
using namespace std;
#define N 100
 
 
//定义两个矩阵;再定义一个矩阵去接收
//m:矩阵A的行数
//n:矩阵A的列数\B的行数
//k:矩阵B的列数
void mulmatrix(double a[],double b[],double c[],int m,int n,int k)
{
	int i,j,z,temp;

	for(i=0;i<=m;i++)			//m-第一个矩阵的行大小
	{
		for(j=0;j<k;j++)		//k-第二个矩阵的列大小
		{
				//用一维数组存储时,假设为二维的
				//a[i][j]在这个一维数组中的位置为array[k*i+j]
 
				temp=i*k+j;
				c[temp]=0.0;
			for(z=0;z<n;z++)	//n-第一个矩阵的列大小——第二个矩阵的行大小
			{	
				
 
				c[temp]+=a[i*n+z]*b[z*k+j];//A数组中第i行第j列的值   *B   数组第y行第j列的值   =   C数组第i行第j列的值
				//arry[i][z]——n	第1个矩阵 ------------------  n*i+z
				//arry[z][j]——k	第2个矩阵 ------------------  k*z+j
 
			}
		}
	}
}
 
void main()
{
	int i,j,m,n,k;

	double *A= new double[N];
	double *B= new double[N];
	double *C= new double[N];

	for(i=0;i<N;i++)
	{
		C[i]=1.0;
	}
 
 
	cout <<"请输入矩阵A的行数m:"<<endl;
	cin >>m;
 
	cout <<"请输入矩阵A的列数和B的行数n:"<<endl;
	cin >>n;
 
	cout <<"请输入矩阵B的列数k:"<<endl;
	cin >>k;
 
 
 
 
	cout <<"请输入矩阵A的元素:"<<endl;
	cout <<"----------------------"<<endl;
	for(i=0;i<n*m;i++)
	{
		cout << "请输入矩阵A的第"<<i+1<<"个元素"<<endl;
		cin >>A[i];
 
	}
	cout <<"----------------------"<<endl;
	
	cout <<"请输入矩阵B的元素:"<<endl;
	cout <<"----------------------"<<endl;
	for(i=0;i<n*k;i++)
	{
		cout << "请输入矩阵B的第"<<i+1<<"个元素"<<endl;
		cin >>B[i];
	}
	cout <<"----------------------"<<endl;
 
 
	mulmatrix(A,B,C,m,n,k);
	cout <<"乘积矩阵C为:"<<endl;
	cout<<"这里自己去分行列"<<endl;
	cout <<"----------------------"<<endl;
	for(i=0;i<m;i++)
	{
		for(j=0;j<k;j++)
		{
			int count=0;
			//如果不好看可以控制输出几个,然后换行
			cout <<C[i*k+j] << "\t";		
		}	
	}
	cout <<"\n----------------------"<<endl;

	delete []A;
	delete []B;
	delete []C;
	system("pause");
}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘鑫磊up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值