免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4496 | 回复: 11
打印 上一主题 下一主题

[C++] 小白刚接触LINUX编程,问几个小代码问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-13 00:11 |只看该作者 |倒序浏览
UBUNTU 12.10
环境都是好的,用的GEANY,编译器G++和GCC都有。
刚装好环境,拿了一个在WINDOWS下用DEV CPP编写的程序,在WINDOWS环境下是能够完美运行的。
  1. #include<iostream>
  2. #include<stdlib.h>
  3. #include<fstream>

  4. int times,k,found;     //k为区块长度,times为区块重复次数 ,found为压缩结束标志

  5. int find(char *p);
  6. void findnext(char *p,int len);
  7. void compress(char *p);

  8. int main()
  9. {
  10.         char *tmp,*tmp1;
  11.         char a[200],tem[100];
  12.         char *p;
  13.         int num;
  14.         int f=0;
  15.         fstream file,fileout;
  16.     file.open("problem1.in");
  17.     fileout.open("problem1.out");
  18.         file>>num;
  19.         while(num)
  20.         {
  21.         file>>a;
  22.         cout<<a<<endl;
  23.             p=a;
  24.             while(!found)
  25.         {
  26.             for(;*p!='\0';p++)                   //直到结尾
  27.                     {
  28.                             k=find(p);
  29.                             if(k&&((k+3)<=k*times))          //不值得压缩时不压缩,否则长度反而增加
  30.                             {
  31.                                     f=1;
  32.                                     int i;
  33.                                     for(i=0;i<k;i++)             //找到可压缩点后进行压缩
  34.                                             *(tem+i)=*(p+i);
  35.                                     *(p)=times+'0';
  36.                                     *(p+1)='{';
  37.                                     for(i=0;i<k;i++)
  38.                                             *(p+i+2)=*(tem+i);
  39. //                                    cout<<p+i+2<<endl;
  40.                                     *(p+2+k)='}';
  41.                                     tmp=p+k+3;
  42.                                     tmp1=p+k*times;              //压缩点后的往前排列
  43.                                     for(;*tmp1!='\0';tmp1++)
  44.                                             *(tmp++)=*tmp1;
  45.                                     *tmp='\0';
  46.                                     p=p+k+2;                     //压缩一个区块后跳过这一区块
  47.                             }
  48.                     }
  49.             if(!f)
  50.                 found=1;                                 //上次压缩有结果,则重复压缩
  51.             p=a;                                         //p重新定位到字符串开头,重复压缩
  52.             f=0;
  53. //            cout<<a<<endl;
  54. //            system("pause");
  55.             }
  56.         fileout<<strlen(a)<<endl;
  57. //        cout<<num<<endl;
  58.         num-=1;
  59.         found=0;                              //压缩完一个字符串后重置标志位
  60. //        system("pause");
  61.     }
  62.         fileout.close();
  63. //        system("pause");
  64.         return 0;
  65. }

  66. void findnext(char *p,int len)                    //寻找后续压缩
  67. {
  68.         static int t=2;
  69.         char *q;
  70.         int j=1;
  71.         q=p+len;
  72.         for(int i=0;i<len;i++)
  73.         {
  74.                 if(*(q+i)!=*(p+i))
  75.                 {
  76.                         j=0;
  77.                         break;
  78.                 }
  79.         }
  80.         if(j)
  81.         {
  82.                 t++;
  83.                 times=t;
  84. //              cout<<"子函数"<<t <<*(q+len)<<"次数"<<times<<endl;
  85.                 if(*(q+len)==*q)                             //递归
  86.         findnext(q,len);
  87.             t=2;                                 //递归结束后为下一个压缩重置次数
  88.     }
  89. }

  90. int find(char *p)                     //寻找有无压缩点
  91. {
  92.         char *q;
  93.         q=p+1;
  94.         int n;
  95.         int j=0;
  96.         for(;*q!='\0';q++)
  97.         {
  98.                 if(*(q)==*(p))               //找到第一个相同的
  99.                 {
  100.                         for(n=0;p+n<q;n++)       //判断中间是否相同
  101.                         {
  102.                                 if(*(p+n)!=*(q+n))
  103.                                 {
  104.                                         j=1;
  105.                                         break;
  106.                                 }
  107.                         }
  108.                         if(j)                    //失败,开始下一个相同字符
  109.                                 j=0;
  110.                         else                     //成功,跳出
  111.                                 break;
  112.                 }
  113.         }
  114.         if(*q!='\0')                     //获取压缩点
  115.         {
  116.         times=2;
  117.                 if(*(q+n)==*q)               //有后续压缩则继续压缩
  118.                     findnext(q,n);
  119.                 return n;                    //返回长度
  120.         }
  121.         else
  122.         return 0;                        //默认长度
  123. }
复制代码
在LINUX下面,用G++命令编译不通过,说没有iostream.h fstream.h这俩,我搜了一下,把.h去掉了,倒不提示这个错误了,但又提示了其他几个错误。。。实在不知道错误在哪,求指正。以及顺便求推荐本书,C++ PRIMER有讲LINUX部分么?我还没看过,怎么样?

论坛徽章:
0
2 [报告]
发表于 2013-12-13 00:11 |只看该作者
附错误提示
problem1.cpp: 在函数‘int main()’中:
problem1.cpp:18:2: 错误: ‘fstream’在此作用域中尚未声明
problem1.cpp:18:2: 附注: 建议的替代:
In file included from /usr/include/c++/4.7/ios:39:0,
                 from /usr/include/c++/4.7/ostream:40,
                 from /usr/include/c++/4.7/iostream:40,
                 from problem1.cpp:1:
/usr/include/c++/4.7/iosfwd:165:33: 附注:   ‘std::fstream’
problem1.cpp:18:10: 错误: expected ‘;’ before ‘file’
problem1.cpp:19:5: 错误: ‘file’在此作用域中尚未声明
problem1.cpp:20:5: 错误: ‘fileout’在此作用域中尚未声明
problem1.cpp:25:9: 错误: ‘cout’在此作用域中尚未声明
problem1.cpp:25:9: 附注: 建议的替代:
In file included from problem1.cpp:1:0:
/usr/include/c++/4.7/iostream:62:18: 附注:   ‘std::cout’
problem1.cpp:25:18: 错误: ‘endl’在此作用域中尚未声明
problem1.cpp:25:18: 附注: 建议的替代:
In file included from /usr/include/c++/4.7/iostream:40:0,
                 from problem1.cpp:1:
/usr/include/c++/4.7/ostream:562:5: 附注:   ‘std::endl’
problem1.cpp:59:26: 错误: ‘strlen’在此作用域中尚未声明

论坛徽章:
0
3 [报告]
发表于 2013-12-13 00:12 |只看该作者
额。。。compress函数忘了删了。。。

论坛徽章:
0
4 [报告]
发表于 2013-12-13 00:21 |只看该作者
以及在geany里面点运行总出现这个玩意。。。

./geany_run_script.sh: 5: ./geany_run_script.sh: ./problem1: not found


------------------
(program exited with code: 127)
Press return to continue

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
5 [报告]
发表于 2013-12-13 12:21 |只看该作者
回复 2# komakoh
错误提示说的很清楚了。
google一下iostream.h和iostream的区别,fstream相同
strlen要包含string.h头文件,windows下能编译通过不知道是什么原因,不熟悉windows

   

论坛徽章:
0
6 [报告]
发表于 2013-12-13 12:39 |只看该作者
井蛙夏虫 发表于 2013-12-13 12:21
回复 2# komakoh
错误提示说的很清楚了。
google一下iostream.h和iostream的区别,fstream相同


我查了一下,原来要声明命名空间。。。cout要用std::cout。。。

论坛徽章:
11
2015年迎新春徽章
日期:2015-03-04 09:55:282017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之辽宁
日期:2016-12-15 10:24:1715-16赛季CBA联赛之佛山
日期:2016-11-30 09:04:2015-16赛季CBA联赛之江苏
日期:2016-04-29 15:56:1215-16赛季CBA联赛之同曦
日期:2016-04-12 13:21:182016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之山东
日期:2016-02-16 11:37:52每日论坛发贴之星
日期:2016-02-07 06:20:00程序设计版块每日发帖之星
日期:2016-02-07 06:20:0015-16赛季CBA联赛之新疆
日期:2018-01-09 16:25:37
7 [报告]
发表于 2013-12-13 14:59 |只看该作者
这个是C++程序吗?哦,好像C也是算C++的

论坛徽章:
0
8 [报告]
发表于 2013-12-13 15:00 |只看该作者
回复 7# bskay


    是C++啊。。刚接触。。。WINDOWS下面可以编译的。。。

论坛徽章:
0
9 [报告]
发表于 2013-12-13 17:59 |只看该作者
哥  你要知道一个东西叫跨平台。。。   win下跑的程序用的一些库文件 和一些库函数  在linux下会没有

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
10 [报告]
发表于 2013-12-13 18:00 |只看该作者
windows下居然能运行,给跪了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP