将C++程序修改成C程序

xiangyang891006 2010-07-21 05:21:04
// hahahahahaha.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<string>
#include<iomanip>
#include<cmath>
using namespace std;
#define max 100
#define datatype int
typedef struct{
int row,col;//行,列
datatype v;//非0数值
}Node;
typedef struct{
Node data[max];//稀疏矩阵
int m,n,t;//m行,n列,t非0数个数
}Matrix;

/*求逆矩阵存储*/
typedef struct{ //存储结构
int m, n; //行、列数
double *p; //矩阵基址
}nMatrix;

void In(nMatrix a){ //求逆输入
cout<<"请将矩阵a的行、列数再次输入:";
cin >>a.m>>a.n;
int m = a.m, n = a.n;
int i, j;
double *p = a.p = new double[m * n]; //p是行指针
cout<<"请按行优先输入矩阵a的全部数值:\n";
for (i = 0; i < m; p += n, i++)
{
for (j = 0; j < n; j++)
cin>>p[j]; //即a.p[i*n+j]
}
}

void Out(nMatrix a){ //求逆输出
int m = a.m, n = a.n;
int i, j;
double *p = a.p;
for (i = 0; i < m; p += n, i++)
{
for (j = 0; j < n; j++)
cout<<p[j]<<'\t';
cout<<endl;
}
}

istream& operator >>(istream& input,Matrix &A){
int i;
cout<<"请输入行数:";
input>>A.m;
cout<<"请输入列数:";
input>>A.n;
cout<<"请输入非0值个数:";
input>>A.t;
for(i=1;i<=A.t;i++){
cout<<"请输入行数,列数,非0值:"<<"("<<i<<")\n";
input>>A.data[i].row>>A.data[i].col>>A.data[i].v;
}
return input;
}

ostream& operator <<(ostream& output,Matrix &A){
int i,j,t=1,k=0;
for(i=1;i<=A.m;i++){
for(j=1;j<=A.n;j++){
if(A.data[t].row==i&&A.data[t].col==j){
output<<A.data[t].v<<'\t';
t++;}
else
output<<k<<'\t';
}
cout<<"\n";
}
return output;
}

Matrix operator +(Matrix A,Matrix B){//加法
int i,j,k;
Matrix C;
if(A.m!=B.m||A.n!=B.n){
cout<<"这两个矩阵不能相加"<<endl;
exit(0);}
C.m=A.m;C.n=A.n;
C.t=0;
if(A.t==0&&B.t==0) exit(0);
i=j=k=1;
while(i<=A.t&&j<=B.t){
if(A.data[i].row<B.data[j].row){
C.data[k]=A.data[i];
i++;k++;
}
else{
if(A.data[i].row>B.data[j].row){
C.data[k]=B.data[j];
j++;k++;
}
else{
if(A.data[i].col<B.data[j].col){
C.data[k]=A.data[i];
i++;k++;
}
else{
if(A.data[i].col>B.data[j].col){
C.data[k]=B.data[j];
j++;k++;
}
else{
if(A.data[i].v+B.data[j].v!=0){
C.data[k].row=A.data[i].row;
C.data[k].col=A.data[i].col;
C.data[k].v=A.data[i].v+B.data[j].v;
k++;
}
i++;j++;
}
}
}
}
}
while(i<A.t){
C.data[k]=A.data[i];
i++;k++;
}
while(j<B.t){
C.data[k]=B.data[j];
j++;k++;
}
C.t=k;
return C;
}

Matrix operator -(Matrix A,Matrix B){
Matrix C;
int i,j,k;
if(A.m!=B.m||A.n!=B.n)
{
cout<<"这两个矩阵不能相减";exit(0);}
C.m=A.m;C.n=A.n;
C.t=0;
if(A.t==0&&B.t==0) exit(0);
i=j=k=1;
while(i<=A.t&&j<=B.t)
{ if(A.data[i].row<B.data[j].row)
{ C.data[k]=A.data[i];
i++;k++;
}
else
{ if(A.data[i].row>B.data[j].row)
{ C.data[k]=B.data[j];
j++;k++;
}
else
{ if(A.data[i].col<B.data[j].col)
{ C.data[k]=A.data[i];
i++;k++;
}
else
{ if(A.data[i].col>B.data[j].col)
{ C.data[k]=B.data[j];
j++;k++;
}
else
{ if(A.data[i].v-B.data[j].v!=0)
{ C.data[k].row=A.data[i].row;
C.data[k].col=A.data[i].col;
C.data[k].v=A.data[i].v-B.data[j].v;
k++;
}
i++;j++;
}
}
}
}

}
while(i<A.t)
{ C.data[k]=A.data[i];
i++;k++;
}
while(j<B.t)
{ C.data[k]=B.data[j];
j++;k++;
}
C.t=k;
return C;
}

Matrix operator *(Matrix A,Matrix B){
Matrix C;
int k,p,crow,brow,q,ccol;
int num[max],pos[max],ctemp[max];
if (A.n==B.m){
for(k=1;k<=B.m;k++)
num[k]=0;
for(k=1;k<=B.t;k++)
num[B.data[k].row]++;
pos[1]=1;
for(k=2;k<=B.t;k++)
pos[k]=pos[k-1]+num[k-1];
pos[1+B.t]=pos[B.t]+1;
C.m=A.m; C.n=B.n; C.t=0; p=1;
while(p<=A.t){
crow=A.data[p].row;
for(k=1;k<=C.n;k++)
ctemp[k]=0;
while (p<=A.t&&A.data[p].row==crow){
brow=A.data[p].col;
for(q=pos[brow];q<=pos[brow+1]-1;q++){
ccol=B.data[q].col;
ctemp[ccol]=ctemp[ccol]+A.data[p].v*B.data[q].v;
}
p=p+1;
}
for(ccol=1;ccol<=B.n;ccol++)
if(ctemp[ccol]!=0){
C.t=C.t+1;
C.data[C.t].row=crow;
C.data[C.t].col=ccol;
C.data[C.t].v=ctemp[ccol];
}
}
}
else
cout<<"这两个矩阵不能相乘";
return C;
}

Matrix operator ~(Matrix A){
Matrix B;
int col,i,p,q;
int num[max],position[max];
B.t=A.t;B.m=A.n; B.n=A.m;
if(B.t){
for(col=1;col<=A.n;col++)
num[col]=0;
for(i=1;i<=A.t;i++)
num[A.data[i].col]++;
position[1]=1;
for(col=2;col<=A.n;col++)
position[col]=position[col-1]+num[col-1];
for(p=1;p<=A.t;p++){
col=A.data[p].col;q=position[col];
B.data[q].row=A.data[p].col;
B.data[q].col=A.data[p].row;
B.data[q].v=A.data[p].v;
position[col]++;
}
}
return B;
}

nMatrix Trs(nMatrix a){ //求逆矩阵的先转置
nMatrix trs;
trs.m = a.n;
trs.n = a.m;
trs.p = new double[a.m * a.n];

for (int i = 0; i < a.m; i++)
{
for (int j = 0; j < a.n; j++)
{
trs.p[j * a.m + i] = a.p[i * a.n + j];
}
}
return trs;
}
nMatrix Adjunct(nMatrix a, int indexm, int indexn){ //求第indexm行indexn列元素的代数余子式
nMatrix adj;
adj.m=a.m - 1;
adj.n=a.n - 1;
adj.p = new double[(a.n - 1) * (a.n - 1)];

for (int i = 0; i < indexm; i++)
{
for (int j = 0; j < indexn; j++)
{
adj.p[i * (a.n - 1) + j] = a.p[i * a.n + j];
}
for (int k = indexn + 1; k < a.n; k++)
{
adj.p[i *(a.n - 1) + k -1] = a.p[i * a.n + k];
}
}

for (int m = indexm + 1; m < a.n; m++)
{
for (int j = 0; j < a.n - 1; j++)
{
adj.p[(m - 1) * (a.n - 1) + j] = a.p[m * a.n + j];
}
for (int k = indexn + 1; k < a.n; k++)
{
adj.p[(m - 1) * (a.n - 1) + k - 1] = a.p[m * a.n + k];
}
}
return adj;
}

double Det(nMatrix a) //递归求行列式
{
double det = 0;
if (a.m != a.n)
{
cout<<"不是方阵,没有行列式!"<<endl;
cout<<"求行列式退出"<<endl;
}
if (a.n == 1)
{
det = a.p[0];
return det;
}
else
{
for (int i = 0; i < a.n; i++)
{
if (i % 2 == 0)
det += a.p[i * a.n] * Det(Adjunct(a, i, 0));
else
det -= a.p[i * a.n] * Det(Adjunct(a, i, 0));
}
}
return det;
}

nMatrix operator !(nMatrix a) { //求矩阵的逆
nMatrix temp;
temp.m=a.n;
temp.n=a.m;
temp.p = new double[a.m * a.n];
//矩阵的逆 = 伴随矩阵 / 行列式

double det = Det(a);
if (det == 0) //如果行列式的值为0,则没有逆
{
cout<<"此矩阵没有逆!"<<endl;
cout<<"求矩阵逆退出!"<<endl;
}

for (int i = 0; i < temp.m; i++)
{
for (int j = 0; j < temp.n; j++)
{
if ((i +j) % 2 == 0)
temp.p[i * temp.m + j] = Det(Adjunct(a, i, j)) / det;
else
temp.p[i * temp.m + j] = -Det(Adjunct(a, i, j)) / det;
}
}

return Trs(temp);
}

int _tmain(int argc, _TCHAR* argv[])
{
Matrix C={0},A={0},B={0};nMatrix a={0}, b={0},temp={0};
cin>>A; cout<<"a=\n"<<A;
cin>>B; cout<<"b=\n"<<B;
C=A+B;cout<<"a+b=\n"<<C;
C=A-B;cout<<"a-b=\n"<<C;
C=A*B;cout<<"a*b=\n"<<C;
C=~A;cout<<"~a=\n"<<C;
In(a);
cout<<"矩阵的行列式为:"<<endl;
cout<<Det(a)<<endl;
cout<<"矩阵的逆为:"<<endl;
temp=!a;cout<<"!a=\n"<<Trs<<endl;
return 0;
}

...全文
192 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwfeng1988 2010-07-22
  • 打赏
  • 举报
回复
拆,把类用结构体代替,类中的成员函数换成外部函数,当然记得改一下参数表,其他就是语法上一些输入输出问题了和头文件,其他没什么
yilaozhuang 2010-07-22
  • 打赏
  • 举报
回复
好长的程序,拉到底都用了好久啊
wxwlll 2010-07-22
  • 打赏
  • 举报
回复
不会C++,只会C。你先把算法提炼出来吧!
狂龙骄子 2010-07-22
  • 打赏
  • 举报
回复
同意!要从基础抓起~~
[Quote=引用 1 楼 laowu_ 的回复:]很难想象一个会C++不会C的人(不是程序员)是什么状态[/Quote]
白头老汉 2010-07-22
  • 打赏
  • 举报
回复
结构体和函数都不是什么问题。

这里主要有多个操作符重载,要把它们都做成函数。
另外,把对象使用那些操作符的地方都改成调用对应的函数
ForestDB 2010-07-22
  • 打赏
  • 举报
回复
友情顶。
houyajin 2010-07-22
  • 打赏
  • 举报
回复
…… 回复内容 回复内容太短了!
fancanqin 2010-07-21
  • 打赏
  • 举报
回复
不懂c++
chaoliu1024 2010-07-21
  • 打赏
  • 举报
回复
1.类改成结构体
2.用C的头文件,C的函数,大概意思就是把cout换成printf()
qioushisan 2010-07-21
  • 打赏
  • 举报
回复
拆分类就行了
senr0816 2010-07-21
  • 打赏
  • 举报
回复
好大一坨啊。。。
honemay 2010-07-21
  • 打赏
  • 举报
回复
把类和函数重载拆了就行了
liutengfeigo 2010-07-21
  • 打赏
  • 举报
回复
该什么?
_JeffreyWu 2010-07-21
  • 打赏
  • 举报
回复
很难想象一个会C++不会C的人(不是程序员)是什么状态
软件简介: 原名《Turbo C/C++ for Windows 集实验与学习环境》,现在已支持最新操作系统WINDOWS 7,它是从事一线教学的大学教师根据多媒体教学演示和C语言初学者的特点,量身打造的一个简单易用的C/C++程序设计教学演示、学习与实验软件(支持TC2/TC3、VC6三种编译器,没有使用日期限制)。与软件配套的《 C/C++程序设计教程(配有同步实验、流程控制语句动画演示、提供教程中所有程序实例、实验、作业中的源代码(全部用VC6编译器调试通过))》融入了作者多年的教学和学习经验、编程建议、编程感悟,新增读书笔记功能有利用户 记录教程中的重点、难点、学习心得体会,针对用户学习教程中遇到的问题开通了疑难问题解答论坛等,同时,为了便于C语言学习,加入C语言学习指导、入门程序实例、典型源程序、典型的函数算法,课程设计指导、课程设计源程序、 Visual C++6.0中英文编译错误信息同步显示功能(并配有60多种同步的语法错误程序实例、修改方法等)、 Turbo C2.0 中英文编译错误信息同步显示功能、Turbo C++3.0常见编译错误信息、C语言专业词汇的中英文对照、2004年到2011年15套全国计算机等级考试二级 C 语言的真题笔试试卷及答案和10套上机模拟试题和详尽的答案与分析等大量的学习资源。另外 “编程日记” 功能可以让你记录你的 C 语言学习历程, “资料管理” 功能让你大量的下载资料不再难找 安装注意事项:为了保证软件的正常运行,请不要安装在中文文件夹中,采用默认安装路径即可。
个人感觉这个软件相当好用,不想vc那样专业而繁冗,很适合学习 原名《Turbo C/C++ for Windows 集实验与学习环境》,现在已支持最新操作系统WINDOWS 7,它是从事一线教学的大学教师根据多媒体教学演示和C语言初学者的特点,量身打造的一个简单易用的C/C++程序设计教学演示、学习与实验软件(支持TC2/TC3、VC6三种编译器,没有使用日期限制)。与软件配套的《 C/C++程序设计教程(配有同步实验、流程控制语句动画演示、提供教程中所有程序实例、实验、作业中的源代码(全部用VC6编译器调试通过))》融入了作者多年的教学和学习经验、编程建议、编程感悟,新增读书笔记功能有利用户 记录教程中的重点、难点、学习心得体会,针对用户学习教程中遇到的问题开通了疑难问题解答论坛等,同时,为了便于C语言学习,加入C语言学习指导、入门程序实例、典型源程序、典型的函数算法,课程设计指导、课程设计源程序、 Visual C++6.0中英文编译错误信息同步显示功能(并配有60多种同步的语法错误程序实例、修改方法等)、 Turbo C2.0 中英文编译错误信息同步显示功能、Turbo C++3.0常见编译错误信息、C语言专业词汇的中英文对照、2004年到2009年全部二级 C 语言的真题笔试试卷及答案与分析和上机模拟试题和详尽的答案与分析等大量的学习资源。另外 “编程日记” 功能可以让你记录你的 C 语言学习历程, “资料管理” 功能让你大量的下载资料不再难找 安装注意事项:为了保证软件的正常运行,请不要安装在中文文件夹中,采用默认安装路径即可。
*1.1 从C到C++ 计算机诞生初期,人们要使用计算机必须用机器语言或汇编语言编写程序. 世界上第一种计算机高级语言诞生于1954年,它是FORTRAN语言.先后出现了 多种计算机高级语言.其中使用最广泛.影响最大的当推BASIC语言和C语言 . BASIC语言是1964年在FORTRAN语言的基础上简化而的,它是为初学 者设计的小型高级语言. C语言是1972年由美国贝尔实验室的D.M.Ritchie研制功的.它不是为 初学者设计的,而是为计算机专业人员设计的.大多数系统软件和许多应用软件 都是用C语言编写的. 但是随着软件规模的增大,用C语言编写程序渐渐显得有些吃力了. C++是由AT&T Bell(贝尔)实验室的Bjarne Stroustrup博士及其同事于20世 纪80年代初在C语言的基础上开发功的.C++保留了C语言原有的所有优点, 增加了面向对象的机制. C++是由C发展而来的,与C兼容.用C语言写的程序基本上可以不加修改 地用于C++.从C++的名字可以看出它是C的超集.C++既可用于面向过程的结 构化程序设计,又可用于面向对象的程序设计,是一种功能强大的混合型的程序设 计语言. C++对C的―增强‖,表现在两个方面: (1) 在原来面向过程的机制基础上,对C语言的功能做了不少扩充. (2) 增加了面向对象的机制. 面向对象程序设计,是针对开发较大规模的程序而提出来的,目的是提高软 件开发的效率. 不要把面向对象和面向过程对立起来,面向对象和面向过程不是矛盾的,而 是各有用途.互为补充的. 学习C++,既要会利用C++进行面向过程的结构化程序设计,也要会利用C++ 进行面向对象的程序设计.本书既介绍C++在面向过程程序设计中的应用,也介 绍C++在面向对象程序设计中的应用. *1.2 最简单的C++程序 例1.1 输出一行字符: ―This is a C++ program.‖. 程序如下: #include //包含头文件iostream using namespace std; //使用命名空间std int main( ) { cout<<″This is a C++ program.″; return 0; } 在运行时会在屏幕上输出以下一行信息: This is a C++ program. 用main代表―主函数‖的名字.每一个C++程序都必须有一个 main 函数 .main前面的int的作用是声明函数的类型为整型.程序第6行的作用是向操作 系统返回一个零值.如果程序不能正常执行,则会自动向操作系统返回一个非零 值,一般为-1.

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧