\input cwebmac
% Zé Augusto 8/98

\documentclass[language=brazil,structure=flat]{cweb}

%% Escrevendo em português:
\usepackage[brazil]{babel}
\usepackage[T1]{fontenc}
%----------------------------

\setlength{\topmargin}{-0.5in}
\setlength{\textheight}{9in}
\setlength{\oddsidemargin}{-.125in}
\setlength{\evensidemargin}{-.125in}
\setlength{\textwidth}{6.75in}

% Macros do LaTeX
\newcommand{\cweb}{\texttt{CWEB}}

\begin{document}




\title{{\small Exemplo de Uso do Stanford GraphBase com \texttt{CWEB}-\LaTeX}\\
Geração e Gravação de um Grafo}
\author{Zé Augusto}
\date{São Paulo, \today}
\maketitle
\tableofcontents


\N{3}{1}Descrição.
Este programa em \cweb\ cria e grava num arquivo um grafo que é
um circuito com $n$ vértices.
A inclusão do arquivo \texttt{gb\_types.w} acima --- através do
comando
\texttt{@i gb\_types.w} que não dá para ver na documentação --- faz com que
referências a
\PB{\&{Graph}}, \PB{\&{Arc}}, \PB{\&{Vertex}}, \PB{\&{Area}}, \PB{\&{util}} e %
\PB{\&{siz\_t}} sejam tratadas na
documentação como palavras reservadas.

\fi

\N{3}{2}Estrutura geral do programa.
Aqui vai a estrutra geral do programa \PB{\\{cria\_circuito}}.

\Y\B\X3:Arquivos a serem incluídos\X\6
\X5:Programa Principal\X\par
\fi

\M{3}Precisamos incluir as definições da estrutura de dados do Stanford
GraphBase.

\Y\B\4\X3:Arquivos a serem incluídos\X${}\E{}$\6
\8\#\&{include} \.{"gb\_graph.h"}\C{ A estrutura de dados para criar o grafo }\6
\8\#\&{include} \.{"gb\_save.h"}\C{ e para salvar nosso grafo }\par
\A4.
\U2.\fi

\M{4}Este programa usa também a rotina para mostrar grafos na tela.
Para tanto, vamos incluir o arquivo \textit{header} correspondente.

\Y\B\4\X3:Arquivos a serem incluídos\X${}\mathrel+\E{}$\6
\8\#\&{include} \.{"mostra\_grafo.h"}\C{ rotina para mostrar o grafo na tela }%
\par
\fi

\N{3}{5}Programa principal.
Agora vamos definir o programa \PB{\\{main}} em linhas gerais.

\Y\B\4\X5:Programa Principal\X${}\E{}$\6
\&{int} ${}\\{main}(\\{argc},\39\\{argv}){}$\1\1\6
\&{int} \\{argc};\C{ o número de argumentos na linha de comando do {\small
UNIX} }\6
\&{char} ${}{*}\\{argv}[\,]{}$;\C{ os argumentos propriamente ditos, um array
de strings }\2\2\6
${}\{{}$\5
\1\X15:Variáveis locais de \PB{\\{main}}\X\6
\X6:Verifica se o programa foi chamado corretamente\X\6
\X7:Criação de uma estrutura vazia de um grafo com $n$ vértices\X\6
\X8:Atribuição de valores ao grafo criado\X\6
\X12:Gravação do grafo\X\6
\X13:Imprime os vértices e arestas de \PB{\\{grafo}}\X\6
\X14:Finalização\X\6
\4${}\}{}$\2\par
\U2.\fi

\M{6}\B\X6:Verifica se o programa foi chamado corretamente\X${}\E{}$\6
\&{if} ${}(\\{argc}\I\T{2}\V\\{sscanf}(\\{argv}[\T{1}],\39\.{"\%d"},\39{\AND}%
\|n)\I\T{1}\V\|n<\T{2}){}$\5
${}\{{}$\1\6
${}\\{fprintf}(\\{stderr},\39\.{"Uso:\ \%s\ n,\ "},\39\\{argv}[\T{0}]);{}$\6
${}\\{fprintf}(\\{stderr},\39\.{"cria\ um\ circuito\ co}\)\.{m\ n\ >\ 1\
vértices\\n"});{}$\6
\&{return} (\T{1});\C{ Erro }\6
\4${}\}{}$\2\par
\U5.\fi

\M{7}\B\X7:Criação de uma estrutura vazia de um grafo com $n$ vértices\X${}%
\E{}$\6
$\\{grafo}\K\\{gb\_new\_graph}(\|n);{}$\6
\&{if} ${}(\\{grafo}\E\NULL){}$\1\5
\&{return} (\T{1});\C{ Não há memória disponível }\2\par
\U5.\fi

\M{8}\B\X8:Atribuição de valores ao grafo criado\X${}\E{}$\6
\X9:Atribui nomes e especificações ao grafo\X\6
\X10:Atribui nomes para os vértices\X\6
\X11:Cria as arestas\X\par
\U5.\fi

\M{9}O campo \PB{\\{util\_types}} serve para especificar como os $14$ campos %
\PB{\&{util}}
serão usados.
\begin{itemize}
\item Os seis primeiros caracteres são para os campos \PB{$\|u,\|v,\|w,\|x,\|y,%
\|z$} dos vértices
.
\item Os dois próximos caracteres são para os campos \PB{$\|a,\|b$} das
arestas.
\item Os seis últimos caracteres são para os campos
\PB{$\\{uu},\\{vv},\\{ww},\\{xx},\\{yy},\\{zz}$} do grafo.
\end{itemize}
As seguintes especificações podem ser dadas:
\begin{itemize}
\item \PB{\|I}: um \PB{\&{long} \&{int}};
\item \PB{\|S}: um apontador para um string;
\item \PB{\|V}: um apontador para um \PB{\&{Vertex}};
\item \PB{\|A}: um apontador para um \PB{\&{Arc}};
\item \PB{\|G}: um apontador para um \PB{\&{Graph}};
\item \PB{\|Z}: o campo não será usado.
\end{itemize}
Como não usaremos nenhum dos campos, usaremos \PB{\|Z} em todos eles.

\Y\B\4\X9:Atribui nomes e especificações ao grafo\X${}\E{}$\6
$\\{sprintf}(\\{grafo}\MG\\{id},\39\.{"Circuito\ com\ \%d\ ver}\)\.{tices"},\39%
\|n){}$;\C{ A identidade (RG) do grafo }\6
${}\\{strcpy}(\\{grafo}\MG\\{util\_types},\39\.{"ZZZZZZZZZZZZZZ"}){}$;\par
\U8.\fi

\M{10}\B\X10:Atribui nomes para os vértices\X${}\E{}$\6
${}\{{}$\5
\1\&{register} \&{Vertex} ${}{*}\|v{}$;\C{ o vértice corrente }\6
\&{char} \\{nome}[\T{40}];\6
\&{int} \\{cont}${}\K\T{0};{}$\7
\&{for} ${}(\|v\K\\{grafo}\MG\\{vertices};{}$ ${}\\{cont}<\\{grafo}\MG\|n;{}$
${}\\{cont}\PP,\39\|v\PP){}$\5
${}\{{}$\1\6
${}\\{sprintf}(\\{nome},\39\.{"\%d"},\39\\{cont});{}$\6
${}\|v\MG\\{name}\K\\{gb\_save\_string}(\\{nome}){}$;\C{ essa função aloca
memória para o     nome do vértice }\6
\4${}\}{}$\2\6
\4${}\}{}$\2\par
\U8.\fi

\M{11} \Y\B\4\X11:Cria as arestas\X${}\E{}$\6
${}\{{}$\5
\1\&{register} \&{Vertex} ${}{*}\|v,{}$ ${}{*}\|u;{}$\6
\&{int} \\{cont}${}\K\T{0};{}$\7
\&{for} ${}(\|v\K\\{grafo}\MG\\{vertices};{}$ ${}\\{cont}<\\{grafo}\MG\|n-%
\T{1};{}$ ${}\\{cont}\PP,\39\|v\PP){}$\5
${}\{{}$\1\6
${}\|u\K\|v+\T{1};{}$\6
${}\\{gb\_new\_edge}(\|v,\39\|u,\39\T{1});{}$\6
\4${}\}{}$\2\6
${}\\{gb\_new\_edge}(\|v,\39\\{grafo}\MG\\{vertices},\39\T{1}){}$;\C{ última
aresta que fecha o circuito }\6
\4${}\}{}$\2\par
\U8.\fi

\M{12}\B\X12:Gravação do grafo\X${}\E{}$\6
$\\{save\_graph}(\\{grafo},\39\.{"circuito.gb"}){}$;\par
\U5.\fi

\M{13}\B\X13:Imprime os vértices e arestas de \PB{\\{grafo}}\X${}\E{}$\6
\\{mostra\_grafo}(\\{grafo});\par
\U5.\fi

\M{14}\B\X14:Finalização\X${}\E{}$\6
\\{gb\_recycle}(\\{grafo});\C{ Libera memória que foi alocada para criar o
grafo }\6
\&{return} (\T{0});\C{ Saída normal }\par
\U5.\fi

\M{15}
\Y\B\4\X15:Variáveis locais de \PB{\\{main}}\X${}\E{}$\6
\&{Graph} ${}{*}\\{grafo}{}$;\C{ o grafo a ser construído }\6
\&{int} \|n;\par
\U5.\fi

\M{16}

\cwebIndexIntro{%
Aqui vai uma lista de identificadores usados e onde eles aparecem.
Entradas grifadas indicam os lugares de definições. Mensagens de erros
também são mostradas.
}

\end{document}

\fi


\inx
\fin
\con
