| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 833 人关注过本帖
标题:C。。。头疼死了。。求思路!!!求指导!!
只看楼主 加入收藏
zuifei07
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2014-2-5
结帖率:77.78%
收藏
已结贴  问题点数:10 回复次数:9 
C。。。头疼死了。。求思路!!!求指导!!
/*
程序 代号:0001

  功能:将文件1.txt中的数据按照重复次数降序去重整理


  步骤:


  版本 0.4
  {
  用二维数组~~
  大体恢复版本0.2思路
  }

  版本0.3
  {
  struck str
  {
  int namber;
  char str
  }
  1.不采用数组。。采用结构体。。这样没有了行数的限制
  缺陷:定义多个结构体变量。。占用大量空间。。况且还不能自动定义变量。。
  }




  版本 0.2
  {
     1.将数据排序(按ascill码排序)。。得数组一
     2.从数组一挨个读取字符串。如果和数组一下一个字符串相同,该字符串的数量就加一。。不同。就将该字符串赋值给数组二
  }


  版本 0.1
  {
   1.将每个字符串复制两份
   2.将第一组数据去重整理
   3.将第一组的第一个字符与第二组每个字符想比较。记下重复的次数
   4.按照重复的次数将第一组数据降序排序。。
   5.输出
  }

备注:

1.要用到结构体

2.文件打开读取的练习

3.字符串比较的练习

http://blog.代码有参考价值。。【while的结束字符判断】
*/



#include<stdio.h>
#include<process.h>


#define false -1
#define true 1


int main(void)
{
//功能变量区
    FILE *file;  //文件指针
    int fileh;   //文件行数
    char CO[100000000000000][100];//100000000000000可以编译通过。。不过提示。占用的内存超过256MB。。可能无法运行。。



//临时变量区
char a;
int i,j;
   
//打开文件
restart:
    system("cls");
    printf("       本程序将从1.txt文件中读取数据,并进行处理。\n    文件最多:100000000000000行\n单行字符个数最大为:100\n   ");
    getchar();

    file=fopen("1.txt","r");
    if(file==NULL)
    {
        printf("文件1.txt打开失败!请确定文件是否存在。");
        getchar();
        goto restart;
    } else{
        printf("文件1.txt成功打开。\n");
        getchar();
    }





//得出文件行数,判断是否能处理
    fileh=0;
    while((a=fgetc(file))!=EOF)
    {
        if(a=='\n')
        {
            fileh++;
        } else{
        a=fgetc(file);
        if(a==EOF)
        {
            fileh++;
            break;
        }
        }
    }



//开始录入数据《《《就是这一段。。求指导~~!!》》》
    for (i=0;i<(fileh+1);i++)
    {

        fgets(CO[i],100,file);
        printf("刚刚读取的是第%d行数据,内容为%s\n",i,CO[i]);
        getchar();
    }



}



求指导!!求思路!!

     QQ1041501142

欢迎加好友。。。另外。。自己新建了一个QQ群。。喜欢研究语言的可以加入。。为了避免发广告的嫌疑。。就步伐群号了。。
搜索更多相关主题的帖子: 结构体 字符串 空间 
2014-02-05 23:34
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:3 
按照重复次数降序去重整理?? shen me yi si ?

想抽苏烟了。
2014-02-05 23:45
zuifei07
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2014-2-5
收藏
得分:0 
就是对数据进行排序。。排序的规则是按照重复的次数降序排列。。。然后把重复的部分去除。。。

例:
原来:
1
23
45
XCA
23
23
45
23
XCA
XCA
整理后:
23
XCA
45
1
2014-02-05 23:49
MusicSky
Rank: 2
等 级:论坛游民
帖 子:10
专家分:19
注 册:2013-7-16
收藏
得分:3 
以下是引用zuifei07在2014-2-5 23:49:05的发言:

就是对数据进行排序。。排序的规则是按照重复的次数降序排列。。。然后把重复的部分去除。。。

例:
原来:
1
23
45
XCA
23
23
45
23
XCA
XCA
整理后:
23
XCA
45
1



如果只是这样,我觉得并没有你想的那么复杂啊
 把每行假象为1个单词
动态链表
 char a[20];  //用来存每个单词,大小自己定
 int num;    //用来存放该单词存在的数量   
读取一个单词(一行)后,判断是否存在链表,若存在,则num++; 不存在则新建链表,添加一个
最后排序,这个最简单,不用教了吧?
2014-02-06 04:47
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:3 
如果我没数错行数上限的那个数后面挂了14个零是吧。假设每行的字符平均为10个,那么需要的存储空间就是1P。先不说怎么统计,我更好奇的是你怎么存这么多的数据。

现在说说统计的事。如果你的计算机每秒钟能统计1亿行字符串(这个速度不算慢了吧?),那么完成这14个零的量需要277.78个小时,11天多(实际这是个不可完成的任务,对个人来说)。

以上针对那14个零吐了一下槽。除了这个数有点离谱之外(对个人比较离谱,但对于商业或更高层面可能会有这么大的规模),这个问题还是很有应用价值的(比如搜索引擎)。我记得以前在这里探讨过三叉树,很适合处理这个问题。

重剑无锋,大巧不工
2014-02-06 09:43
zuifei07
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2014-2-5
收藏
得分:0 
回复 3楼 zuifei07
如果先建立链表。。然后那单词去表里一个一个的对照的话。。岂不是要做很多次的比较。。中间还要穿插赋值啥的。。。
这样效率是不是就小很多了。。

这样怎么样?
先把数据排序。。然后再统计每个字符串出现的次数。。然后按照次数排序?
FILE *file;
char cc[10000][100];
int fileh;
int i;
struct zf
{
char str[30];
int namber;
};


file=fopen("1.txt","r+");
if (file!=NULL){
printf("Can not open file~\n");
} else{
//得出文件行数,判断是否能处理
    fileh=0;
    while((a=fgetc(file))!=EOF)
    {
        if(a=='\n')
        {
            fileh++;
        } else{
        a=fgetc(file);
        if(a==EOF)
        {
            fileh++;
            break;
        }
        }
    }




/*这一段是赋值。。但是printf("cc[%d]:%s",i,cc[i]);后。。输出结果是乱码。。求解决~!!!1就是这个地方。。。换fread fscanf fgets 都是乱码。。。。
*/
for (i=1;i<fileh;i++)
{
fread(cc[i],sizeof(char),100,file);
printf("刚刚读取的是第%d行数据,内容为%s\n",i,cc[i]);//这里输出是乱码。。

}
}



曾经在for循环内尝试过定义 struct zf cc[i]
然后 cc[i].str 是字符串。。cc[i].namber是这个字符串出现的次数。。

但是编译通过后。。。不是提示堆笺溢出。。就是 内存占用可能超过256MB。。不能运行。。。。。

求好的思路。。


2014-02-06 13:06
zuifei07
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2014-2-5
收藏
得分:0 
好了。。。
已经通过各位大神网友解决了。。。。


解决的方法是。。
在开始录入数据那一段的前面 也就是统计完行数后。。
加一句。。
fseek(file,0,SEEK_SET); 将文件指针移到文件开头。。。因为统计完行数后。。指针移到了文件末尾。。。


还有歌问题。。


 /*  这段统计代码。。会统计到文件中间会直接退出。。
 fileh=0;
    while((a=fgetc(file))!=EOF)
    {
        if(a=='\n')
        {
            fileh++;
        } else{
        a=fgetc(file);
        if(a==EOF)
        {
            fileh++;
            break;
        }
        }
    }
*/  不指导什么原因。。 求指导!!



下面这段代码就可以完整的统计行数。。。。。
//得出文件行数,判断是否能处理
    fileh=0;
    while((a=fgetc(file))!=EOF)
    {
        if(a=='\n')
        {
            fileh++;
        }
        
    }
    fileh++;

2014-02-07 00:10
MusicSky
Rank: 2
等 级:论坛游民
帖 子:10
专家分:19
注 册:2013-7-16
收藏
得分:0 
回复 7楼 zuifei07
额..我说,你解决了么?我是个菜鸟,很少来这个论坛
一般什么问题,自己琢磨,自己研究,自己搜索,不爱问

我想,你琢磨得也不错,1个1个问题突破得到解决,这样挺好的

所以我给你的建议是,不懂就先跳过,不要专牛角尖,那样太累了,等下次接触到,回过头再来解决这个问题,就容易多了
2014-02-27 21:02
许大爷
Rank: 1
等 级:新手上路
帖 子:5
专家分:2
注 册:2014-2-27
收藏
得分:0 
以后学习你们,好好努力。
2014-02-27 22:00
zuifei07
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2014-2-5
收藏
得分:0 
多谢各位。。互相学习吧~~
2014-02-28 23:42
快速回复:C。。。头疼死了。。求思路!!!求指导!!
数据加载中...
 
   



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

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