2013年12月25日水曜日

開発環境

C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅢ部(高度なプログラミング概念)の18章(モジュールプログラミング)、18-14(プログラミング実習)、実習18-4.を解いてみる。

その他参考書籍

18-14(プログラミング実習)、実習18-4.

コード

words.h

struct node{
    char *word;
    int i;
    int linenos[100];
    struct node *left;
    struct node *right;
};

extern struct node *root;
extern void scan(char *name);
extern void print_tree(struct node *top);

コード

words.c

#include "ia.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

struct node{
    char *word;
    int i;
    /* int linenos[100]; */
    struct infinite_array *linenos;
    struct node *left;
    struct node *right;
};

static int current_lineno = 1;

struct node *root = NULL;

int is = 0;

void memory_error(void)
{
    fprintf(stderr, "Error:Out of memory\n");
    exit (8);
}

void add_list(struct node *node, int n)
{
    ia_store(node->linenos, node->i, n);
    node->i = node->i + 1;
}

void print_lineno(struct node *node)
{
    /*
    int j;
    for(j = 0; j < node->i; j++){
        printf("%d ", node->linenos[j]);
    }
    */
    int index;
    for(index = 0; index < node->i; ++index){
        int data;
        data = ia_get(node->linenos, index);
        printf("%d ", data);
    }
    printf("\n");
}

char *save_string(char *string)
{
    char *new_string;
    
    new_string = malloc((unsigned) (strlen(string) + 1));
    
    if (new_string == NULL){
        memory_error();
    }
    strcpy(new_string, string);
    return (new_string);
}

void enter(struct node **node, char *word)
{
    int result;
    char *save_string();
    void memory_error();
    void add_list(struct node *node, int n);
    
    if ((*node) == NULL){
        (*node) = malloc(sizeof(struct node));
        if ((*node) == NULL){
            memory_error();
        }
        (*node)->linenos = malloc(sizeof(struct infinite_array));
        if((*node)->linenos == NULL){
            memory_error();
        }
        (*node)->i = 0;
        (*node)->word = save_string(word);
        add_list((*node), current_lineno);
        (*node)->left = NULL;
        (*node)->right = NULL;
        return;
    }
    
    result = strcmp((*node)->word, word);
    
    if (result == 0){
        add_list((*node), current_lineno);
        return;
    }

    if (result < 0){
        enter(&(*node)->right, word);
    } else {
        enter(&(*node)->left, word);
    }
}

void scan(char *name)
{
    char word[100];
    int index;
    int ch;
    FILE *in_file;
    
    in_file = fopen(name, "r");
    if (in_file == NULL){
        fprintf(stderr, "Error:Unable to open %s\n", name);
        exit(8);
    }
    while (1){
        while(1){
            ch = fgetc(in_file);
            if (ch == '\n'){
                current_lineno++;
            }
            if(isalpha(ch) || (ch == EOF)){
                break;
            }
        }
        if (ch == EOF){
            break;
        }
        word[0] = ch;
        for (index = 1; index < sizeof(word); ++index){
            ch = fgetc(in_file);
            if (!isalpha(ch)){
                break;
            }
            word[index] = ch;
        }
        word[index] = '\0';
        enter(&root, word);
    }
    fclose(in_file);
}

void print_tree(struct node *top)
{
    if (top == NULL){
        return;
    }
    print_tree(top->left);
    printf("%-10s: ", top->word);
    print_lineno(top);
    print_tree(top->right);
}

コード

sample.c

#include "words.h"
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if(argc != 2){
        fprintf(stderr, "Error:Wrong numbr of parameters\n");
        fprintf(stderr, "      on the command line\n");
        fprintf(stderr, "Usage is:\n");
        fprintf(stderr, "    words 'file'\n");
        exit(8);
    }
    scan(argv[1]);
    printf("単語      : 行\n");
    print_tree(root);
    return (0);
}

Makefile

CC=cc
CFLAGS=-g
OBJS=sample.o words.o ia.o

all: sample

sample: $(OBJS)
 $(CC) $(CFLAGS) -o sample $(OBJS)

sample.o: words.h sample.c

words.o: ia.h words.c

ia.o: ia.c

clean:
 rm -f sample sample.o words.o ia.o

入出力結果(Terminal)

$ make
make: Nothing to be done for `all'.
$ ./sample sample.c
単語      : 行
Error     : 8 
Usage     : 10 
Wrong     : 8 
argc      : 5 7 
argv      : 5 14 
char      : 5 
command   : 9 
exit      : 12 
file      : 11 
fprintf   : 8 9 10 11 
h         : 1 2 3 
if        : 7 
include   : 1 2 3 
int       : 5 5 
is        : 10 
line      : 9 
main      : 5 
n         : 8 9 10 11 15 
numbr     : 8 
of        : 8 
on        : 9 
parameters: 8 
print     : 16 
printf    : 15 
return    : 17 
root      : 16 
scan      : 14 
stderr    : 8 9 10 11 
stdio     : 2 
stdlib    : 3 
the       : 9 
tree      : 16 
words     : 1 11 
$

0 コメント:

コメントを投稿