| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2939 人关注过本帖
标题:矩阵转化成三元组表
只看楼主 加入收藏
我系Dinosaur
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-1-5
结帖率:0
收藏
已结贴  问题点数:10 回复次数:2 
矩阵转化成三元组表
这是一个把矩阵转化成三元组表然后相加的一个课程设计
如题,我在运行的时候始终显示文件A.txt不能打开!
这是以下的全部代码
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct
{
int i;
int j;
int d;
}DataType;
typedef struct
{
int rn;
int cn;
int tn;
DataType Data[MAX_SIZE];
}TriType;

void pp(FILE *fp, TriType *A)      //文件中矩阵转化为三元组表
{   
   char ch;
   char a[10];
    int i=1,j=1,k=0,t=0,n=0;
     while((ch=fgetc(fp))!=EOF)      
     {
         if((ch!='\n')&&(ch!=','))
         {
             a[k]=ch;
             k++;
         }
         else
         {
             a[k]='\0';
             k=0;
             if((t=atoi(a))!=0)   //t=atoi(a)把字符串a转换成整型数并赋值给t
             {
                 A->Data[n].d=t;
                 A->Data[n].i=i;
                 A->Data[n].j=j;
                 n++;
             }
             if(ch==',') j++;
             else if(ch=='\n')
             {
                 i++;
                 A->rn=j;
                 j=1;
             }
         }
     }
    A->cn=i-1;
    A->tn=n;
}
void AddMatrix(TriType a,TriType b,TriType *c)        //实现a,b相加
{
 int i=0,j=0,k=0;                                 //下标置初始值
 while(i<a.tn&&j<b.tn)              //a,b均未超出有效数!
 {
     if(a.Data[i].i==b.Data[j].i)            //a的行号等于b的行号
     {
          if(a.Data[i].j==b.Data[j].j)         //a的列号等于b的列号
         {
             c->Data[k].i=a.Data[i].i;
             c->Data[k].j=a.Data[i].j;
             c->Data[k].d=a.Data[i].d+b.Data[j].d;  //此时将他们的数据直接相加
             i++;
             j++;
             k++;     
         }
         else if(a.Data[i].j<b.Data[j].j)   //a的列号小于b的列号
         {
             c->Data[k].i=a.Data[i].i;
             c->Data[k].j=a.Data[i].j;
             c->Data[k].d=a.Data[i].d; //如果行号相等,则相加后的值等于列号更小的矩阵
//中对应元素的值
             i++;
             k++;
         }
         else if(a.Data[i].j>b.Data[j].j)   //a的列号大于b的列号
         {
             c->Data[k].i=b.Data[j].i;
             c->Data[k].j=b.Data[j].j;
             c->Data[k].d=b.Data[j].d;   //如果行号相等,则相加后的值等于列号更小的矩//阵中对应元素的值
             j++;
             k++;
         }
     }
     else if(a.Data[i].i<b.Data[j].i)    //a的行号小于b的行号
     {
         c->Data[k].i=a.Data[i].i;
         c->Data[k].j=a.Data[i].j;
         c->Data[k].d=a.Data[i].d;     //如果列号相等,则相加后的值等于行号更小的矩阵//中对应元素的值
         i++;
         k++;
     }
     else if(a.Data[i].i>b.Data[j].i)    //a的行号大于b的行号
     {
         c->Data[k].i=b.Data[j].i;
         c->Data[k].j=b.Data[j].j;
         c->Data[k].d=b.Data[j].d;       //如果列号相等,则相加后的值等于行号更小的矩//阵中对应元素的值
         j++;
         k++;
     }
   
 }
 while(i>=a.tn&&j<=b.tn)//a超出a的有效数个数,而b未超出,直接把b中超出部分复制到c
         {
             c->Data[k].i=b.Data[j].i;
             c->Data[k].j=b.Data[j].j;
             c->Data[k].d=b.Data[j].d;     
             j++;
             k++;
         }
 while(j>=b.tn&&i<=a.tn) //超出b的有效数个数,而a未超出,直接把a中超出部分复制给c
        {
          c->Data[k].i=a.Data[i].i;
          c->Data[k].j=a.Data[i].j;
          c->Data[k].d=a.Data[i].d;   
          i++;
           k++;
        }
 c->rn=a.rn;
 c->cn=
 c->tn=k;
}

void pull(FILE *fp,TriType &C)            //将C存入fp所指向的文件
{
    int ch1=0;
    char ch2=',' ,ch3='\n';
    int i=1,j=1,k=0;

    for(i=1;i<=)      
    for(j=1;j<=C.rn;j++)
    {
   
        if(j==C.Data[k].j&&i==C.Data[k].i)  //如果i,j分别等于C中元素的行和列!写入C
//中的第k个元素!否则写入'0,'
        {
            fprintf(fp,"%4d",C.Data[k].d);
            if(j!=C.rn)fputc(ch2,fp);
            k++;
        }
        else
        {
            fprintf(fp,"%4d",ch1);
            if(j!=C.rn)fputc(ch2,fp);
        }
            if(j==C.rn) fputc(ch3,fp);
    }
    fclose(fp);
}



void  main()
{
    TriType A;
    TriType B;
    TriType C;
    FILE *fp1;
       if((fp1=fopen("A.txt","r"))==NULL)          //只读方式打开A.txt
    {
        printf("文件A.txt不能打开!\n");
        return;
    }
    FILE *fp2;
       if((fp2=fopen("B.txt","r"))==NULL)           //只读方式打开B.txt
    {
        printf("文件B.txt不能打开!\n");
        return;
    }
    FILE *fp3;
    if((fp3=fopen("C.txt","w+"))==NULL)           //读写方式打开C.txt
    {
        printf("文件C.txt不能打开!\n");
        return;
    }
    pp(fp1, &A);                           //文件A.txt中矩阵转化为三元组表A
    pp(fp2, &B);                          //文件B.txt中矩阵转化为三元组表B
    if()                //判断A,B是否是相同类型的矩阵
    {
        AddMatrix(A,B,&C);                 //矩阵相加后存入C
        pull(fp3,C);                        //C存入到文件C.txt
        printf("矩阵相加后结果如下:\n");
        char ch;
        if((fp3=fopen("C.txt","r"))==NULL)         //只读方式打开C.txt
        {
            printf("文件C.txt不能打开!\n");
            return;
        }
        ch=fgetc(fp3);        //从文件C.txt中输出矩阵C
        while(ch!=EOF)
        {
            putchar(ch);
            ch=fgetc(fp3);
        }
        fclose(fp3);
        printf("有效数字共:%d\n行数:%d\n列数:%d\n",C.tn,,C.rn);
    }
    else  printf("A,B不是同种类型矩阵,即矩阵行数或列数不相等!!\n");
}
补充下,A.txt和B.txt如下图
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: include 三元 课程 
2017-01-05 12:09
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:5 
文件路径不对呗,你写全路径试试


[fly]存在即是合理[/fly]
2017-01-05 14:28
LG隐
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:67
专家分:198
注 册:2016-4-20
收藏
得分:5 
我有一次竟然是因为电脑设置的是不显示 文件后缀
2017-01-05 15:18
快速回复:矩阵转化成三元组表
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021256 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved