C++第六次作业(函数)

文章目录:

一:C++编程用函数实现输出1000以内自然数中的素数(除其本身以外不能被其它任意整数整除)

代码实现

运行结果

二:C++编程用函数实现输出10~10000内自然数中的回文数(例如2332、3443、1221等)

代码实现

运行结果

三:C++编程用函数实现小学生四则运算测试题并根据答题情况给出成绩

代码实现

运行结果

四:C++用函数采用对分法求非线性方程f(x)= x3+2x2+10x-20=0在区间【0,2】上的根,算法思想是利用连续函数的零点定理,即:f(a)*f(b)<0,则【a,b】区间上一定有根存在

代码实现

运行结果

五:c++用函数编写实现M*K阶矩阵A与K*N阶矩阵B的乘积矩阵C(M*N阶)的求解和输出

方法一:控制台输入 

代码实现

运行结果

方法二: 在代码直接输入

代码实现

运行结果

六:c++用函数编写函数RevMatrix(),用高斯-约当消元法求n阶方阵的逆矩阵

代码实现

运行结果


一:C++编程用函数实现输出1000以内自然数中的素数(除其本身以外不能被其它任意整数整除)

代码实现

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



//c++编程实现输出1000以内自然数中的素数(除其本身以外不能被其它任意整数整除)
//	(1)	函数IsPrime()实现判定某自然数是否为素数,函数结构如下(算法)
//bool IsPrime(unsigned n)
//{	//如果n<=1,则n不是素数
//	//如果n==2,则n是素数
//			//如果n>2,则从2开始到  取除数,一旦能整除n则n不是素数
//}
//(2)	主函数main()调用IsPrime()函数,输出1000以内自然数中的所有素数


bool IsPrime(int n)
{
	for(int j = 2;j<=sqrt(n);j++)
    {
        if (n%j==0)
        {
            return false;
        }
    }
    return true;
}


int main(){

    for (int i = 2;i<=1000;i++)
    {
        if (IsPrime(i))
        {
            cout<<i<<endl;
        }
    }
	
	system("pause");
	return 0;
}

运行结果

二:C++编程用函数实现输出10~10000内自然数中的回文数(例如2332、3443、1221等)

代码实现

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


//C++编程实现输出10~10000内自然数中的回文数(例如2332、3443、1221等)
//	(1)	函数IsPalindrome()实现判定某自然数是否为回文数,函数结构如下
//bool IsPalindrome(unsigned n)
//{
//	…………
//}
//(2)	主函数main()调用IsPalindrome()函数,输出10~10000内自然数n、n*n和n*n*n,满足n、n*n和n*n*n都是回文数。



bool IsPalindrome(int n)
{

		int sum = 0;
		int m = n; 
		while(m)
		{  
			sum = sum*10 + m %10;
			m = m /10; 
		}
		return sum==n;
}



int main(){
	int i;

	cout <<"1000以内满足条件的素数为:"<<endl;
	for (i = 10; i <= 1000; i++)
	{
		if (IsPalindrome(i) && IsPalindrome(i*i) && IsPalindrome(i*i*i))
		{
			cout<<i<< "\t"<<i*i<<"\t"<<i*i*i<< "\t"<<endl;
		}
	}
	
	system("pause");
	return 0;
}

运行结果

三:C++编程用函数实现小学生四则运算测试题并根据答题情况给出成绩

代码实现

#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <ctime>
using namespace std;
 
 
//c++编程实现小学生四则运算测试题并根据答题情况给出成绩
//	(1)	函数Examine( )--对两个整数按指定的运算符运算并返回正确与否;
//	bool Examine(int opd1 , char opt , int opd2)
//	{	int Answer , Result ;
//		//根据运算符opt决定对opd1和opd2做什么运算,结果赋值给Result
//		//输出运算式,输入答题Answer,根据结果正确与否返回1或0
//	}
//	(2)	函数Test( )--随机生成10道整数的加减乘除运算题,调用Examine( )并计成绩
//	int Test()
//	{
//		//随机生成10道四则运算题,并调用Examine(),统计并返回成绩值
//	}
//	(3)	主函数main( )简单模拟考试——输入学号,调用Test()函数,输出本学号学生的考试成绩
 
bool Examine(int opd1 , int opt , int opd2)
{	
	int Answer , Result;
	switch (opt)
	{
		case 1:		
			cout<<opd1<<"+"<<opd2<<"="<<endl;
			cin>> Answer;
			Result=opd1+opd2;	
			break;
		case 2:
			cout<<opd1<<"-"<<opd2<<"="<<endl;
			cin>> Answer;
			Result=opd1-opd2;
			break;
		case 3:
			cout<<opd1<<"*"<<opd2<<"="<<endl;
			cin>> Answer;
			Result=opd1*opd2;
			break;
		case 4:
			cout<<opd1<<"/"<<opd2<<"="<<endl;
			cin>> Answer;
			Result=opd1/opd2;
			break;
		default:
			cout<<"非合法字符"<<endl;
			break;
	}
	return Answer==Result;
}
 
 
 
int Test()
{
	int i,opd1,opd2,ti=1;
	int count=0;
	int opt;
		int num,name;

		cout <<"同学,请输入你的学号:"<<endl;
		cin >>num;
		cout <<"同学,请输入你的姓名:"<<endl;	
		cin >>name;
		cout <<"温馨提示:现在开始考试,满分100分,每题10分!"<<endl;
	srand((unsigned)time(NULL));
	for (i = 0; i < 10; i++)
	{	
		opd1 = rand() % 100 + 50;
		opd2 = rand() % 50 + 1;
		opt = rand() % 4 + 1;//生成1~5随机数
	
			cout<<"请输入第"<<ti<<"题的答案:"<<endl;
			ti++;

		if (Examine(opd1 , opt , opd2)==1)
			{count+=10;}
	}

	cout <<"系统开始阅卷---------------------------------"<<endl;
	cout <<"学号"<<num<<"   "<<"姓名"<<name<<endl;
	cout <<"您的成绩为:"<< count<<"分"<<endl;
	return count ;
}
 
int main(){
	
	Test();
 
	system("pause");
	return 0;
}

运行结果

四:C++用函数采用对分法求非线性方程f(x)= x3+2x2+10x-20=0在区间【0,2】上的根,算法思想是利用连续函数的零点定理,即:f(a)*f(b)<0,则【a,b】区间上一定有根存在

代码实现

#include <iostream>
#include <cmath>
using namespace std;
 
//c++用对分法求非线性方程f(x)= x3+2x2+10x-20=0在区间【0,2】上的根,
//算法思想是利用连续函数的零点定理,即:f(a)*f(b)<0,则【a,b】区间上一定有根存在
//
//符号表示:设区间端点分别为a=0和b=2,区间中点为c,精度要求EPS=10-5
//(1)	取中点c=(a+b)/2.0,并计算f(c),if(fabs(f(c))<EPS),则c为近似根,结束
//(2)	While(fabs(f(c))>EPS)
//{		如果f(a)*f(c)>0,则a更新为c(说明根在区间的右半边)
//		否则,b更新为c(说明根在区间的左半边)
//			再取中点:c=(a+b)/2.0
//		}
//(3)	输出或返回近似根c
//编程要求:
//(1)	设计函数double f(double x)
//(2)	设计函数double Duifenfa(double a , double b),求根并返回近似根值
//(3)	主函数main()调用以上函数并输出结果



 
//定义最终近似实根值变量
double rusult;
 
//定义方程函数
double f(double x)
{
    return x*x*x+2*x*x+10*x-20;//方程不一定,自定义
}
 
//定义
void Duifenfa(double a,double b)
{
	//求出中间值
    double mid = (a+b)/2.0;
	//存放值键函数值
    double temp = f(mid);
	//确定进度范围
	//如果不在范围
    if(fabs(temp) <= 1e-5) {
		//直接输出结果
        rusult = mid;
        return ;
    }
	//切换起始值	
    if(temp > 0) 
		Duifenfa(a,mid);
    else 
		Duifenfa(mid,b);
}
 
int main()
{
	Duifenfa(0,2);//自定义范围
	cout <<"在区间[0,2]上的近似实根为:"<<rusult <<endl;
	system("pause");
	return 0;
}

运行结果

五:c++用函数编写实现M*K阶矩阵A与K*N阶矩阵B的乘积矩阵C(M*N阶)的求解和输出

方法一:控制台输入 

代码实现

#include <iostream>
#include <cmath>
using namespace std;
#define N 100
 
//c++编制函数实现M*K阶矩阵A与K*N阶矩阵B的乘积矩阵C(M*N阶)的求解和输出
//设A为m*k阶,B为k*n阶,则C为m*n阶,Cij=Ai0*B0j+……+ Ai,k-1*Bk-1,j
//(1)	#define N 10
//void mulmatrix01(double a[N][N],double b[N][N],double c[N][N],int m,int k,int n)
//{	……	}//有什么缺点
//或者
//#define M 4
//#define K 3
//#define N 4
//void mulmatrix02(double a[M][K],double b[K][N],double c[M][N])
//{	……	}
//(2)	void mulmatrix03(double a[],double b[],double c[],int m,int k,int n)
//	{	……	}


//定义两个矩阵;再定义一个矩阵去接收
//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[N],B[N],C[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;
	system("pause");
}

运行结果

 

方法二: 在代码直接输入

代码实现

#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
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++)
    {
        for(j=0;j<k;j++)
        {
            temp=i*k+j;
            C[temp]=0.0;
            for(z=0;z<n;z++)
            {
                C[temp] +=A[i*n+z]*B[z*k+j];
            }
        }
    }
}



int main()
{
    double A[2][2]={{2.0,2.0},
                    {2.0,2.0}
				   };

    double B[2][2]={{2.0,2.0},
                    {2.0,2.0}
				   };
    double C[2][2];

    int m,n,k,i,j;
    m=2;
    n=2;
    k=2;


    cout<<"乘积矩阵C的结果为:"<<endl;
	cout <<"----------------------"<<endl;
    mulmatrix(*A,*B,*C,m,n,k);
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            cout<<C[i][j]<<"\t"; 
        }
     } 
	cout <<endl;
	cout <<"----------------------"<<endl;
	system("pause");
    return 0;
 }

运行结果

六:c++用函数编写函数RevMatrix(),用高斯-约当消元法求n阶方阵的逆矩阵

代码实现

#include <cmath>
#include <malloc.h>
#include <iostream> 
#include <iomanip>
using namespace std; 
#define  N  10                //定义方阵的最大阶数为10
 
 
//c++编写函数RevMatrix(),用高斯-约当消元法求n阶方阵的逆矩阵
//	函数RevMatrix()结构如下:
//	void RevMatrix(double A[N][N] , double A_1[N][N])
//	{	double A_Copy[N][N];	//不要改变原矩阵A,将A复制到A_Copy
//		//1.经N-1步消元,将A变成上三角形矩阵(同时作用于A_1)
//		//2.再经N-1步消元,将A变成对角线矩阵(同时作用于A_1)
//		//3.最后将A变成单位矩阵(同时作用于A_1)
 
 
 
bool RevMatrix(double A[][N], double B[][N], int n);    //采用部分主元的高斯消去法求方阵A的逆矩阵B

bool RevMatrix(double A[][N], double B[][N], int n)
{
	cout <<"通过高斯消去法求逆矩阵" <<endl;
    int i, j, k;
    float max, temp;
    float t[N][N];                //临时矩阵
    //将A矩阵存放在临时矩阵t[n][n]中
    for (i = 0; i < n; i++)        
    {
        for (j = 0; j < n; j++)
        {
            t[i][j] = A[i][j];
        }
    }
    //初始化B矩阵为单位阵
    for (i = 0; i < n; i++)        
    {
        for (j = 0; j < n; j++)
        {
            B[i][j] = (i == j) ? (double)1 : 0;
        }
    }
    for (i = 0; i < n; i++)
    {
        //寻找主元
        max = t[i][i];
        k = i;
        for (j = i+1; j < n; j++)
        {
            if (fabs(t[j][i]) > fabs(max))
            {
                max = t[j][i];
                k = j;
            }
        }
        //如果主元所在行不是第i行,进行行交换
        if (k != i)
        {
            for (j = 0; j < n; j++)
            {
                temp = t[i][j];
                t[i][j] = t[k][j];
                t[k][j] = temp;
                //B伴随交换
                temp = B[i][j];
                B[i][j] = B[k][j];
                B[k][j] = temp; 
            }
        }
        //判断主元是否为0, 若是, 则矩阵A不是满秩矩阵,不存在逆矩阵
        if (t[i][i] == 0)
        {
            cout << "这里没有逆矩阵!";
            return false;
        }
        //消去A的第i列除去i行以外的各行元素
        temp = t[i][i];
        for (j = 0; j < n; j++)
        {
            t[i][j] = t[i][j] / temp;        //主对角线上的元素变为1
            B[i][j] = B[i][j] / temp;        //伴随计算
        }
        for (j = 0; j < n; j++)        //第0行->第n行
        {
            if (j != i)                //不是第i行
            {
                temp = t[j][i];
                for (k = 0; k < n; k++)        //第j行元素 - i行元素*j列i行元素
                {
                    t[j][k] = t[j][k] - t[i][k]*temp;
                    B[j][k] = B[j][k] - B[i][k]*temp;
                }
            }
        }
    }
    return true;
}
 
int main()
{
    int i, j;
    double a[N][N], b[N][N];
    int n;
 
    cout << "采用部分主元的高斯消去法求方阵的逆矩阵!\n";
    cout << "请输入方阵的阶数: ";
    cin >> n;
    cout << "请输入" << n << "阶方阵: \n";
    //输入一个n阶方阵
    for (i = 0; i < n; i++)
    {
		cout << "请输入验证矩阵的第" << i+1 << " 行: "<<endl;
        for (j = 0; j < n; j++)
        {
            cin >> a[i][j];
        }
    }
	cout<<"----------------------------------"<<endl;
	cout << "你输入的矩阵为 : \n";
     for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            cout << a[i][j]<<"  ";
        }
		cout <<endl;
    }
	cout<<"----------------------------------"<<endl;
    //运用高斯消去法求该矩阵的逆矩阵并输出
    if (RevMatrix(a, b, n))
    {   
 
        cout << "该方阵的逆矩阵为: \n";
		cout<<"----------------------------------"<<endl;
        for (i = 0; i < n; i++)
        {
            cout << setw(4);
            for (j = 0; j < n; j++)
            {	
                cout << b[i][j] << setw(10);//字段宽度
            }
            cout << endl;
        }
		cout<<"----------------------------------"<<endl;
    }    
    //getchar();
 
	system("pause");
    return 0;
}
 
 

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘鑫磊up

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

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

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

打赏作者

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

抵扣说明:

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

余额充值