| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 22140 人关注过本帖, 3 人收藏
标题:C日记~立标记~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
今天闲逛看到了"魔王的语言"这数据结构题型~
题目大意是这样的~

[问题描述]
有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1) α -> β1β2…βm
(2)(θδ1δ2…δn)->θδnθδn-1… θδ1θ
在这两种形式中,从左到右均表示解释。试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
[基本要求]
用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可含人的词汇。
(1)B -> tAdA
(2)A -> sae
[测试数据]
B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae

看资料说用栈和队列完成~关键是算法的意义可以解决多重括号问题~不多不少和解决中缀表达式算法有关~有兴趣的可以看看有关资料~

而且栈和队列适用于我那个通用链表哦~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-26 18:30
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
弄了个储存不同类型数据的两种方法~~第一种是用共用体(数组)~~第二种是用抽象指针(空指针)~感觉共用体就是一个内存块多些引用不同数据类型的接口~实际本质应该就是一个内存块~和普通内存块没啥区别~至于课课提供变量类型接口其实是在预编译的时候处理好了~就是这样~~~~~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

#define MAXLEN 32

typedef union U_Node
{
    void* s;
    int a;
    float b;
    double c;
}U_Node;

void fun(void** p,size_t size);
void Input(void** p,size_t n,void* e,size_t size);
void free_point(void** p);

int main()
{
    U_Node un[MAXLEN]={0};
    void** p=NULL;
    int a=3;
    float b=(float )1.23;
    double c=3.14159;

    fun(&un[0].s,sizeof("abcde"));
    memmove(un[0].s,"abcde",sizeof("abcde"));

    un[1].a=a;
    un[2].b=b;
    un[3].c=c;

    printf("%s\n",un[0].s);
    printf("%d\n",un[1].a);
    printf("%.2f\n",un[2].b);
    printf("%g\n",un[3].c);

    puts("");

    free_point(&un[0].s);

    fun(&(void* )p,sizeof(void* )*MAXLEN);
    Input(p,0,"abcde",sizeof("abcde"));
    Input(p,1,&a,sizeof(a));
    Input(p,2,&b,sizeof(b));
    Input(p,3,&c,sizeof(c));

    printf("%s\n",((char* )p[0]));
    printf("%d\n",*((char* )p[1]));
    printf("%.2f\n",*(float* )((char* )p[2]));
    printf("%g\n",*(double* )((char* )p[3]));

    free_point((void* )&((char* )p[0]));
    free_point((void* )&((char* )p[1]));
    free_point((void* )&((char* )p[2]));
    free_point((void* )&((char* )p[3]));
    free_point((void* )&p);

    return 0;
}

void fun(void** p,size_t size)
{
    *p=malloc(size);
    assert(*p);
    memset(*p,0,size);
}

void Input(void** p,size_t n,void* e,size_t size)
{
    void** pt=(char** )p+n;
    *pt=malloc(size);
    assert(*pt);
    memset(*pt,0,size);
    memmove(*pt,e,size);
}


void free_point(void** p)
{
    if (*p==NULL)
        return ;

    free(*p);
    *p=NULL;
}


[此贴子已经被作者于2017-5-26 23:05编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-26 23:00
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 112楼 九转星河
感觉第二种方法写得比较简单~~其实可以用一个结构体来保存每个空间长度信息~感觉一个共用体包含4个基本变量类型成员就可以了(其中一个是空指针)~就是这样~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-26 23:03
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 113楼 九转星河
现在有一个问题~~~~~~~就是如何判断共用体成员void* p是否被分配空间?~~
如果有一大堆数据集合~~则怎么判断该空间是否被释放?~~~感觉要自己另外记录数据类型的指向才行~~~

程序代码:
typedef enum UNION_TYPE
{
    POINT,CHAR,SHORT,INT,FLOAT,DOUBLE,SIZE,U_CHAR,U_SHORT,U_INT,EMPTY,
}UNION_TYPE;

typedef struct Node
{
    UNION_TYPE type;

    union un
    {
        void* p;
        char c;
        int i;
        short sh;
        float f;
        double d;


        unsigned char uc;
        unsigned short ush;
        unsigned int ui;

        size_t size;

    }un;
}Node;


这个可以试试做个基本的结构体~~

[此贴子已经被作者于2017-5-27 00:14编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-26 23:22
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 114楼 九转星河
联合的成员使用的是同一个空间呀,释放 int* 占用的空间 和释放 void *是一样的啊。


继续被NULL指针虐,不搞了,睡觉。以后再慢慢来。

太久不写代码,好生疏,我怀疑我现在还能不能写出一个程序

[此贴子已经被作者于2017-5-26 23:48编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-26 23:35
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
端午回家~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-27 12:37
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
游戏编程对接受离散信息的加工处理要用到傅里叶变换这方面的知识~表示消化这块是一个漫长的过程~还是先看看怎么样处理简单的图层结构问题~

简单来说图层就是一个区域的多元信息参数~例如推箱子里面箱子的位置和目的地的位置可以叠加(刚开始用"重合"这个词~后来感觉用"叠加"表示更恰当)~表示在不同的图层里面~而人的位置和箱子的位置不能叠加~表示在同一个图层里面~


多元信息储存空间是可以变换的~可以通过一种映射找到元和其值的关系~

例如如果图层参数只用表示0或1来表示有或无的时候可以用二次方指数来标记各信息参数~这样可以通过其值的唯一组合来推测出该域到底储存了什么信息~不过考虑到不是所有信息都在不同的图层里面~单位信息参数值还可以通过其图层结构进行优化~



[此贴子已经被作者于2017-5-28 08:06编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-28 07:29
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
给一个简单的小练笔~怎么用一个16位数来记录一个俄罗斯方块的信息~~感觉这是处理信息问题的基础~~
如果要表示方向则可以用32位来表示(记得公开课是用一个char表示方向~或许这样会简单一点)~


[此贴子已经被作者于2017-5-28 09:11编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-28 08:08
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
写了个输入处理文件~这个可以防止输入数据出错而引发bug~不过是用动态处理的~~用完后记得释放空间~~~

程序代码:
#ifndef INPUT_DATA
#define INPUT_DATA

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<ctype.h>

#define BUFF_MAX 10  //最大缓冲区

void Input_UN_Int(char** );   //输入长无符号整数
void Absorb_Buffer(char** );  //对缓冲区残留数据进行处理

void Input_UN_Int(char** p)                //初始化数据
{
    char* pt=NULL;
    size_t length=0;

    pt=*p=(char* )malloc((BUFF_MAX)*sizeof(char));
    assert(*p!=NULL);
    memset(*p,0,sizeof(pt));

    while (isdigit(*pt=getchar()))
    {
        ++length;
        if (length%(BUFF_MAX-1)==0)
        {
            assert(realloc(*p,(length+BUFF_MAX)*sizeof(char)));
            memset(*p+length,0,BUFF_MAX*sizeof(char));

            pt=*p+length-1;
        }

        ++pt;
    }

    if (*pt=='\n')
    {
        *pt='\0';
        return ;
    }

    Absorb_Buffer(p);   //对缓冲区残留数据进行处理
}

void Absorb_Buffer(char** p)
{
    while (getchar()!='\n');

    free(*p);
    *p=strdup("");
}

#undef BUFF_MAX

#endif  


程序代码:
#include<stdio.h>
#include"Input.h"
int main()
{
    char* p1=NULL;
    char* p2=NULL;

    Input_UN_Int(&p1);
    Input_UN_Int(&p2);

    puts(p1);
    puts(p2);

    free(p1);
    free(p2);

    return 0;
}


[此贴子已经被作者于2017-5-28 21:56编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-28 21:28
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
这里你错啦。
            realloc(*p,(length+BUFF_MAX)*sizeof(char));//realloc失败会返回NULL,但作为参数的p,是无影响的。
            assert(*p);//所以你断言 p != NULL 是多余的。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-28 21:35
快速回复:C日记~立标记~
数据加载中...
 
   



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

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