| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2298 人关注过本帖
标题:C语言用结构体模拟类
只看楼主 加入收藏
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
结帖率:93.75%
收藏
已结贴  问题点数:20 回复次数:7 
C语言用结构体模拟类
  程序在我本地编译可运行,编译环境为TDM-GCC 4.9.2 64-bit Release
    但是提交到PTA平台评测的时候提示编译错误
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
#include<stdio.h>
#define MAX 64
struct st {
    int s[MAX];
    int top;
    char name;
    int Top() {
        return s[top];
    };
    int Pop() {
        return s[top--];
    };
    void Push(int x) {
        s[++top]=x;
    };
};

long Pow(int x,int y);//计算x^y
void Creat(struct st ta[],int n);//初始化
void Hannuota(struct st ta[],long max);//主函数

int main() {
    int n;
    scanf("%d",&n);
    struct st ta[3];
    Creat(ta,n);
    long max=Pow(2,n)-1;
//    printf("%lld\n",max);
    Hannuota(ta,max);


    return 0;
}


long Pow(int x,int y) {
    long a=(int)x;
    for(int i=1; i<y; i++)a*=x;
    return a;
}


void Creat(struct st ta[],int n) {
    ta[0].name='a';
    ta[0].top=n-1;
//把所有圆盘从大到小放到柱子A上
    for(int i=0; i<n; i++)ta[0].s[i]=n-i;
    ta[1].top=ta[2].top=0;
    for(int i=0; i<n; i++)ta[1].s[i]=ta[2].s[i]=0;
//若n为偶数,按顺时针方向摆放ABC,否则逆时针
    if(n%2==0) {
        ta[1].name='b';
        ta[2].name='c';
    } else {
        ta[1].name='c';
        ta[2].name='b';
    }
}

void Hannuota(struct st ta[],long max) {
    int k=0;
    int i=0;
    while(k++<max) {
        //按顺时针方向吧圆盘1从现在的位置移动到下一根柱子
        ta[(i+1)%3].Push(ta[i%3].Pop());
        printf("%c -> %c\n",ta[i%3].name,ta[(i+1)%3].name);
        i++;
        //把另外两根柱子上的可以移动的圆盘移动到新的柱子上
        if(k++<max) {
            //吧非空柱子上的圆盘移动到空柱子上,当两根柱子都为空时,移动较小的圆盘
            if(ta[(i+1)%3].Top()==0||
               ta[(i-1)%3].Top()>0&&
               ta[(i+1)%3].Top()>ta[(i-1)%3].Top()) {
                ta[(i+1)%3].Push(ta[(i-1)%3].Pop());
                printf("%c -> %c\n",ta[(i-1)%3].name,ta[(i+1)%3].name);
            } else {
                ta[(i-1)%3].Push(ta[(i+1)%3].Pop());
                printf("%c -> %c\n",ta[(i+1)%3].name,ta[(i-1)%3].name);
            }
        }

    }

}

从错误信息来看,貌似我这样写的结构体是不行的。可是为什么我本地能运行?难道是我的软件把它当做C++来编译了?我写的文件确实是以.CPP作为后缀的,打从学习编程以来就一直这样,也没有深入研究过。C++语言我没学过,反倒是跟风学了JAVA,所以知道有在结构里面写函数的语句。这回这么写纯粹是随便试试的,居然....


问题就一个,我这样写结构体,是不是错的?C语言是不支持的?如果能提供修改方案最好。(我搜过C语言结构体模拟类的文章,大致原理是结构体里面放了指向函数的指针,然后通过把结构体本身传递进函数来实现类,感觉有点笨,还不如不要结构体)





[此贴子已经被作者于2016-9-3 19:33编辑过]

搜索更多相关主题的帖子: 结构体 C语言 color 
2016-09-03 19:27
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1744
专家分:3216
注 册:2015-12-2
收藏
得分:20 
能不能帮我试个程序
我用Dev c++运行这个程序会刷屏
#include <stdio.h>
  #include <stdlib.h>
   main()
   {
       char a[6];
       int i;
       for(i=0;i<=32;i++)
       {
           printf("%s\n",a);
           itoa(i,a,2);
           a[5]='\0';
       }
  }
也不知道是什么问题。
2016-09-03 19:56
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1744
专家分:3216
注 册:2015-12-2
收藏
得分:0 
你的结构体和c++的类很象,还可以添加函数。
2016-09-03 19:57
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 2楼 ehszt
图片附件: 游客没有浏览图片的权限,请 登录注册
0.0

φ(゜▽゜*)♪
2016-09-03 23:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 4楼 书生牛犊
看你的代码,应该是C++
你在本地用的也是C++编译器(我看图片中源文件是test.cpp)
而在PAT上用的却是C编译器(我看图片中编译器是gcc
要么你改代码为C语法,要么在PAT选编译器为g++
2016-09-05 09:52
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 5楼 rjsp
谢谢,明白了。C++向下兼容C语言的语法。所以过去我自以为写的C程序,其实都是编译成了C++程序了。好像

φ(゜▽゜*)♪
2016-09-06 08:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
以下是引用书生牛犊在2016-9-6 08:29:52的发言:

谢谢,明白了。C++向下兼容C语言的语法。所以过去我自以为写的C程序,其实都是编译成了C++程序了。好像
也不兼容,只能说大部分兼容,随便举几个例子:
C中'a'是int类型,C++中是char类型;
C中void*可隐式转化为任意类型的指针,C++中0可隐式转化为任意类型的指针;
C中函数列表空时表示可以传入任意数量任意类型的参数,C++中则表示什么都不可以传;
C中++i是右值,C++中是左值;?: 也差不多
C的函数声明 void foo( char[*][*], char a[const][3], char b[static 3] ),C++肯定是不支持的;
C的 int a[9] = { [8]=0 },C++也不支持;
再看关键字,auto、const 含义不同,_Alignas _Alignof _Atomic _Bool _Complex _Generic _Imaginary _Noreturn _Static_assert _Thread_local 全不支持,新的 _Generic 也不支持

等等太多了,一时半会想不全
2016-09-06 09:07
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 7楼 rjsp
我学了快一年的C语言,一直用的DEV C++,每次都是.CPP。

像是函数里面带上数组大小的,我也用过啊,没发现报错。还是说编译器比较智能,能够分辨我写的到底是C还是C++?

最近在学跟着网易云课堂的课程学习C++,里面谈到了翻译这件事,他说C++的大部分语法结构都是可以翻译成C语言的,像是类其实就是C语言的函数调用,只不过a.f()翻译成C语言的就变成f(&a)了。

φ(゜▽゜*)♪
2016-09-06 18:46
快速回复:C语言用结构体模拟类
数据加载中...
 
   



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

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