文章目录:
一: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矩阵的存储和乘积运算
一: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()求以下非线性方程的根
- f(x)=x^3+4x^2-10=0,求根区间为[1,2];
- f(x)=x^3-2x-5=0,求根区间[2,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");
}