Design e Criação de Jogos em Portugal (por Paulo Gomes)

Amanhã dia 21 de novembro, vai decorrer nas instalações do Instituo Politécnico de Bragança  uma palestra acerca do Design e Criação de Jogos em Portugal

Tags : , ,

Visutal Studio.. para qualquer versão.

Tive a necessidade de instalar o Visual Studio e dei por mim a necessitar de uma ligação à internet suficientemente rápida para não desanimar.

Assim procurei uma alternativa e encontrei uma possivel solução, para uma instalação offline (sem a necessidade de uma ligação à internet)

Para isso precisei de fazer o seguinte:
(1) fazer o download do “push” (web installer) dos ficheiros relativo à versão que preciso:

Visual Studio Community 2017 LINK
Visual Studio Enterprise 2017 LINK
Visual Studio Professional 2017 LINK
Visual Studio Test Professional 2017 LINK
Visual Studio Community 2017 for macOS LINK
Visual Studio Professional 2017 for macOS LINK
Visual Studio Enterprise 2017 for macOS LINK

(2) criar uma pasta com o nome (por exemplo) tempVB

(3) colar lá o ficheiro do web installer, abrir uma janela de CMD para escrever o seguinte comando nessa pasta:
vs_enterprise.exe –layout C:\tempVS –lang en-US

o que vai ser feito é o descarregar os ficheiros para depois se fazer uma instalação local e sem a necessidade da internet.

Tags : , ,

02_Introdução (pweb)

A arquitectura típica:

Tecnologias e frameworks:

O ASP.NET:
é uma framework da microsoft para o desenvolvimento de aplicações web e web services;
possibilidade de utilizar várias linguagens: C#, VB.NET, C++;
code-behind: separação do código HTML;
arquitectura de controlos do lado do servidor;
uso do padrão Model-View-Controller (MVC);
a usar o ASP.NET MVC 5.. embora já exista a evolução com o Core 2.0;

Com o ASP.NET surgem vários modelos para a criação de aplicações web:
web forms (é uma transição do desenvolvimento de aplicações de desktop windows para aplicações web),
ASP.NET MVC (em que o MVC é um padrão de arquitectura de desenvolvimento que separa a aplicação em três componentes: Model (manipula regras de negócio, lógica de entradas), Controller (interação com o utilizador e lógica de entrada) e a View (apresentação). Nesta metodologia o Controller é uma classe separada, o que permite a automatização de testes, e os Controllers não estão limitados a uma view especifica. Esta arquitectura apresenta também como vantagens o desempenho e a escalabilidade.


ASP.NET Web pages, semelhante ao PHP, faz uso de modelos de single pages, e do razor view engine (criação dinâmica de páginas)

ASP.NET Web API, framework que permite desenvolver serviços HTTP

ASP.NET SignalIR, permite desenvolver aplicações em tempo real (exemplo: jogos)

 

Tags : ,

01_projeto: a começar (pweb)

O objectivo é começar um projeto de um web site usando a metodologia MVC e fazendo uso do ASP.Net com a Entity Framework, através do méotodo Code First.

Para começar é necessário instalar no Visual Studio 2017:
1) nuget packages
2) entity framework

Depois de instalados é começar o projeto sabendo por onde começar (isto é, conhecer que tipo de dados queremos e como os queremos usar no web site)

Para começar o projecto temos que:

De seguida é necessário ter em conta os dados que achamos nesta altura fundamentais para o que queremos construir.

e transformar isso no nosso modelo de dados

em que surge:

 

Tags : , , ,

POO, conceitos (Cap-05, Memoria dinâmica)

#arrays de objetos
os arrays de objetos

#include "pch.h"
#include <iostream>
#include <string>

using namespace std;

class Ponto {
	int x, y;
public:
	Ponto(int x0 = 0, int y0 = 0);
	~Ponto();
};

int main()
{
	//ou indicamos o construtor que queremos usar
	Ponto a[] = { Ponto(1,3), Ponto(2,4), Ponto(5,7) }; 
	Ponto b[] = { {1,3}, {2,4},{5,7} };

	//ou usamos o construtor por omissão
	Ponto c[3];
	Ponto d[3] = { Ponto(1,3) };

	system("pause");
}
//main
#include "Relogio.h"

int main()
{
	{
	Relogio a[10]; //criar um array de 10 objetos
	}
	system("pause");
}
//Relogio.cpp
#include "Relogio.h"

Relogio::Relogio(int hora, int minuto, int segundo)
{
	cout << "Relogio criado" << endl;
}
Relogio::~Relogio()
{
	cout << "Relogio destruido" << endl;
}
//Relogio.h
#pragma once
#include "pch.h"
#include <iostream>
#include <string>

using namespace std;

class Relogio
{
public:
	Relogio(int hora = 0, int minuto = 0, int segundo = 0);
	~Relogio();
};

#variaveis em memoria dinâmica
o uso do operador new permite criar um objecto até ser explicitamente destruido com o operador delete
pVar = new tipo; //ponteiro para um endereço
delete pVar;

ou podemos usar da seguinte forma
int *v1 = new int(4); //valor inicial a 4
delete v1;

#objectos em memoria dinâmica
ou aplicar a uma classe

#include "pch.h"
#include <iostream>
#include <string>

using namespace std;

class Ponto {
	int x, y;
public:
	Ponto() {
		x = 0; y = 0;
		cout << "construindo" << endl;
	};
	~Ponto() { cout << "destruindo" << endl; };

	void imprimir() { cout << "valor x=" << x << " valor de y=" << y << endl; }
};

int main()
{
	{
		//usar memoria dinamica
		Ponto *p = new Ponto;
		p->imprimir();
		delete p;
	}

	system("pause");
}

#arrays dinamicos de objetos
para criar um é necessário fazer:
pVar = new tipo[dim];
para libertar a memoria:
delete [] pVar;

#include "pch.h"
#include <iostream>
#include <string>

using namespace std;

class Ponto {
	int x, y;
public:
	Ponto() {
		x = 0; y = 0;
		cout << "construindo" << endl;
	};
	~Ponto() { cout << "destruindo" << endl; };

	void imprimir() { cout << "valor x=" << x << " valor de y=" << y << endl; }
};

int main()
{
	{
	//usar arrays dinamico de objectos, com construtor e destrutir para cada elemento
	Ponto *p = new Ponto[4];
	for (int i = 0; i < 4; i++) {
		p[i].imprimir();
	}
	delete [] p;
	}
	system("pause");
}
Tags : , , ,

POO, conceitos (cap 4)

as Classes:

#estruturas com funções membros
as funções que são declaradas como membros de uma estrutura são as funções membro
uma função membro sabe sempre para que objecto foi invocada
os membros privados só podem ser “trancados” se estes forem declarados como private, e desta forma apenas as funções membro conseguem aceder a eles
por omissão os membros de uma classe são privados, já se fosse os membros de uma estrutura são públicos.
qualquer função membro (nao estática) consegue aceder aos membros da classe sem referência explicita do objecto

acessibilidade:
se as funções membros forem as únicas a ter acesso directo à informação, então essas informações são membros privados
mantendo as funções membros como publicas, dentro da estrutura ou classe
as funções membros podem aceder a membros públicos ou privados, dentro da estrutura ou classe

para a aceder a um método de uma classe faz-se uso do operador ::

#construtores
serve para inicializar os objectos de uma classe
um construtor de uma classe pode ter parâmetros que podem representar os valores iniciais

#construtores overloaded
podemos ter vários construtores para especificar várias maneiras de inicializar objetos.
a escolha do construtor depende do dos argumentos que forem especificados
pode existir o construtor por omissão, será aquele que não tem especificado qualquer argumento

#construtores com parâmetros com valores por omissão
este tipo de construtor é também um construtor por omissão , pois pode ser chamado sem a especificação de argumentos

#destrutor
quando o objeto deixa de existir, os recursos devem ser libertados, usando destrutores, que são automaticamente invocados
a destruição dos objectos é feita da seguinte forma:
_objectos locais não estáticos são destruídos quando a execução do programa sai do bloco onde foram declarados
_objectos globais, são destruídos quando o programa termina
_objectos dinâmicos são destruídos recorrendo ao operador delete

#funções inline
são todas as funções que são funções membro de uma classe e que estejam definidas na classe
normalmente são funções pequenas e que são muitas vezes utilizadas

#membros variáveis estáticos (static)
é partilhado para todos os objectos de uma classe
existe apenas uma única existência de um e um só membro estático pelos objectos da classe
os não estáticos existe apenas uma existência por objectos
são definidos fora da classe, e pode ser inicializado

#funções estáticas (static)
têm acesso apenas aos membros estáticos (variáveis ou funções)
funções não estáticas tem acesso a todos os membros (estáticos ou não estáticos)
o acesso a um membro estático publico:
a.membro ou a.funçãoMembro()

o acesso a um membro estático publico sem referencia de objeto:
Disciplina::membro
Disciplina::funçãoMembro()

#funções membros constantes
o uso de const no fim do prototipo das funções indica que estas nao alteram os membros
se uma função membro tem const no final do prototipo também tem que aparecer const
as funções membros constantes podem ser invocadas para objectos constantes e nao constantes
as funções membros não constantes só podem ser invocadas para objectos não constantes

#funções friend
uma função friend relacionada com uma classe tem acesso aos seus membros privados não sendo mesmo membro dessa classe
a palavra friend surge antes do prototipo

#construtores com lista de inicialização
Disciplina():x(i), y(i){…
..
}

existem situações em que não é possivel inicializar membros variáveis dentro do construtor, tendo que se usar uma lista de inicialização
se forem membros constantes, têm que ser inicializados na lista de inicialização
se forem membros referencia, têm que ser inicializados na lista de inicialização

#Membros variáveis inicializados na declaração
é possivel inicializar os membros variáveis da classe aquando da declaração

#Membros default e delete
o uso da especificação default serve para indicar qual o construtor a ser utilizado (por omissão)
o uso da especificação delete serve para tornar indisponível a sua implementação


Tags : ,

“20 Essential Games to Study” por Joshua Bycer

Um livro a passar pelos olhos:
“20 Essential Games to Study” por Joshua Bycer

+infos(oficial): LINK

Tags : , ,

“Indie Games Are Getting Cloned Before They’re Even Out” por Cecilia D’Anastasio

Que história mais “macabra” … damms

“Earlier this month, a buddy sent game developer Ben Esposito a surprising screenshot: an Instagram ad for a game that looked a lot like the one he’d been working on for five years. Esposito is nearly finished toiling away on an indie game called Donut County, which will be released later this year by publisher Annapurna Interactive. At the tail end of this labor of love, now a copycat game called Hole.io is number one on the iOS store, and Esposito feels the need to say something.

“I went into this endeavor to make something meaningful to people and spent a long time trying to figure out what that looks like. I had to make all the little details myself. I wanted it to matter,” Esposito told me over Skype today. “They just took the elevator pitch, the unique selling point. . . It’s the message that content doesn’t matter. The message is, if you can find the content for free, take it.”

+infos(oficial): LINK

Tags :

“Introduction to Game Design”

Introduction to Game Design – Part 1
Tópicos:
“Definition of a Game”
“Game Genres”
“Game Team”
“Game Design Document (Plan)”

Introduction to Game Design – Part 2
Tópicos:
“Game Design Document”
“Cameras”
“Controls”
“HUD (heads up display)”
“Levels”
“Combat”
“Enemies”
“Mechanics”
“Power ups & Rewards”
Mini GDD (com respostas a..):
“Title of your game? Have an adequate, original, to the point title for your game.
Platform (console)? Is your game going to be on iOS, Android, windows, xbox,etc.?
Target age ? Is your game for kids or adults?
Rating? (ESRB) Choose your rating depending on what your game contains. If it contains violence and sexuality, it can’t be ESRB EVERYONE
Game summary? A short description of your game.
Unique selling points? What makes your game stand out and compete with other similar games?
Similar competitive products? What are the games that you consider similar to your game?”

+infos(part 1, fonte): LINK
+infos(part 2, fonte): LINK

Tags : ,

“There are too many video games. What now?” por Steven Wright (texto interessante)

There are too many video games. What now?

“in 2018, there have been over 6,000 games released on Steam; the majority of them have sold fewer than 500 copies” preocupante? .. uma chamada de atenção mas o sonho tem que continuar.

+infos(oficial): LINK

Tags :

Sistemas operativos – o inicio (SO1)

Instalar o software:
VirtualBox-5.2.18-124319-Win (LINK)
e o Oracle_VM_VirtualBox_Extension_Pack-5.2.18 (LINK)

de seguida criar uma virtualização do sistema operativo debian-9.5.0-i386-xfce-CD-1 (LINK) ou o torrent (LINK)

Aquando da instalação do VirtualBox em Windows ter em atenção:
desligar primeiro o sistema Hyper-V do windows;
e durante a instalação do VirtualBox solicitar/aceitar a instalação das extensões.

A configuração da máquina virtual deve ser feita tendo em conta os seguintes aspectos:
reservar/verificar 10 gigas de espaço em disco;
colocar a imagem do disto numa pasta perto do root (sem caracteres complexos);
instalar na maquina virtual um SSH server;
sistema de caracteres de UTF8;

já depois de instalado é necessário fazer:
sudo pico /etc/apt/sources.list e comentar o cdrom com #
apt install sudo
adduser username sudo
sudo apt update
sudo apt upgrade

Na interface do VirtualBox fazer clique em devices e escolher insert guest aditions..  e depois na janela de terminal fazer:
cd /media/cdrom
sudo sh ./VboxLinuxAdditions.run

instalar ferramentas de desenvolvimento:
sudo apt-get install build-essential module-assitant dkms
e
sudo m-a prepare

instalação de software adicional na máquina virtual:
1. (netbeans)
na máquina virtual fazer o download do ficheiro e na linha de comandos escrever sudo sh netbeans-8.2-cpp-linux-x86.sh

2. (cliente dropbox)
para instalar o dropbox (32 bits)no debian fiz o seguinte:
cd ~ && wget -O – “https://www.dropbox.com/download?plat=lnx.x86” | tar xzf –
e para correr
~/.dropbox-dist/dropboxd
ou
activar o autostart dropbox autostart y

se for de 64 bits é fazer:
cd ~ && wget -O – “https://www.dropbox.com/download?plat=lnx.x86_64” | tar xzf –

3.( SSH server)
para instalar o SSH server fiz o seguinte:
sudo apt-get install openssh-server
e para correr
sudo systemctl status ssh
ou
sudo systemctl start ssh
e para parar
sudo systemctl stop ssh
e retirar a sua inicialização
sudo systemctl disable ssh

4.(instalar o ncurses):
sudo apt-get install libncurses5-dev libncursesw5-dev
não esquecer que para compilar com o ncurses é necessário fazer:
gcc E1.c -o E1 -lncurses

e Coisas importantes a rever:
sistemas de ficheiros em disco, particionamento, processo de arranque da máquina, sectores MBR e sector boot
Sistema de ficheiros unix, Partições: /, /boot, /home, /etc, /dev, /opt
Comando básicos Unix para navegação no sistema de ficheiros
Gestão de software com apt / apt-get
Noção iniciais de atributos de utilizadores e de segurança em ficheiros Unix. Comando sudo

 

Tags : ,

finalistas dos PlayStation Prémios 2018 (em Portugal)

Redcatpig Studio com KEO

+infos: (estúdio)

OX (Game Nest) com Capture

+infos: (website);

Team Fayo (Game Nest) com Fayo

+infos (website);

SnakeWhirl (Game Nest), com Ink Knight

+infos(website);

Silver Lining, com Advanced Override

+infos(webiste);

Hone Game Studios, com Dark Things About

+infos(…);

Lobster Lord Studios (Game Nest), com Tin-Heart

+infos(webiste);

Flying Pan (Game Nest), com Keg Wars

+infos(webiste);

Once a Bird, com Outsider

+infos(website);

Mad Shark, com Deep Journey

DarkArts, com Under The Rain

Tags : ,

POO, conceitos (cap 3)

#funções overloaded, são funções com o mesmo nome se:
tiverem diferentes tipos de argumentos
tiverem diferentes números de argumentos
tiverem diferentes tipos e números de argumentos

#funções com argumentos por omissão:
deve ser feito na declaração da função usando o =

Tags : ,

POO, conceitos (cap 2)

Operadores de saída e entrada:
Operador de saída: << Operador de entrada: >>

podemos usar o namespace para organizar ou evitar conflitos, inclusive podemos criar o nosso próprio exemplo:
namespace exemplo {
// definições de funções, variáveis,
// classes, etc.
}

e para evitar o uso dos operadores :: aquando da biblitoeca iostream
std::cout
faz-se:
using namespace std;

Bibliotecas a usar:
#include <iostream>
#include <string>

Cast: conversão explícita de tipo:
static_cast, de ponteiros do tipo void* para ponteiros de outros tipos
exemplo:
double d = 0.0;
int x = d;
x = static_cast(d);

const_cast,
reinterpret_cast,
dynamic_cast, Converte um ponteiro para um uma classe, num ponteiro para uma classe derivada, derivada da derivada
auto, o compilador determina automaticamente o tipo de uma variável
exemplo:
double val1 = 1;
double val2 = 2;
auto x = val1 + val2;

Ciclo for range-based, para quando todos os elementos de uma colecção (array, vector, …) devem ser processados
for(auto & elemento: tabela)
exemplo:
int a[10];
for(auto & elemento: a){
elemento = 4;
}

A constante nullptr em C++11, A constante nullptr pode ser usada para inicializar ponteiros nulos.

Referências,pode:
ser passada a uma função
ser retornada por uma função
ser criada de forma independente.

Ponteiro como parâmetro de uma função
exemplo:
void f(int *n);

int main() {
int i = 0;
f(&i);
cout << “\nNovo valor de i:” << i << endl;
return 0;
}

void f(int *n) {
*n = 100;
}

Referência como parâmetro de uma função
exemplo:
void f(int & n);

int main() {
int i = 0;
f(i);
cout << “\nNovo valor de i:” << i << endl;
return 0;
}
void f(int & n) {
n = 100;
}

Referência como retorno de uma função
exemplo:
int & f( );
int x = 0; //tem que ser global
int main( ){
f( ) = 100;
cout << x << endl;
return 0;
}
int & f( ){
return x;
}

Constantes, uma constante deve ser inicializada, já que não é possível fazer-lhe atribuições.
A palavra const antes do * impede qualquer alteração ao objecto apontado através do ponteiro em causa
A palavra const depois do * torna constante o ponteiro.
A palavra const antes e depois do * torna impossivel alterar o objeto apontado

Quando usar: quando uma função nao deve alterar uma variavel

Parâmetros do tipo referência para constante
_ganhar eficiencia de passar a referência ao invés do valor

exemplo conclusão

#include <iostream>

void t(int*) {}

void u(const int* cip) {
//*cip = 2; // ERRO: modifica valor
int i = *cip; // OK: copia valor
//int* ip2 = cip; // ERRO: ip2 nao é pont. para const
}

const char* v() {
// Retorna o endereço de uma string: 
return "result of function v()";
}


void main()
{
int x = 0;
int* ip = &x;
const int* cip = &x;
t(ip);
//t(cip);//Erro:t() nao pode receber ponteiro para constante
u(ip);  // OK u() pode receber ponteiro sem restricoes
u(cip); // OK u() pode receber ponteiro para constante 
//char* cp = v(); // Erro: nao deve ser possivel alterar 
// a string retornada por v() 
const char* ccp = v(); // OK 
system("pause");
}

faltou:
referências a lvalue e rvalue

Tags : ,

poo – parte 1 (início)

POO

//—->classe
_uma classe representa a especificação do novo tipo de dados que representa a entidade.
_a classe é definida por: dados e funções
_essas funções são apenas para esses dados e só essas funções é que podem manipular os dados
_o objecto é uma instância (variavel) de uma classe

//—->mecanismos
_existem mecanismos de encapsulamento (o código que manipula os dados estão na mesma classe. existem mecanismos de acesso a esses dados ao exterior da classe)
_existem mecanismos de herança (os dados podem herdar as propriedades e ter as suas propriedades especificas)
_existem mecanismos de polimorfismo (manipular diferentes dados através de algo que têm em comum. faz uso da herança e do nome da classe base)

//—->várias coisas
_operador de saida (<<) e de entrada (>>)
_fazer uso do using namespace std; para evitar ,p.e., usar std::cout
_faz-se uso do “if” se ? “true” : “false”
_conversões de tipo (implicita fazer uso do static_cast) static_cast<int>i
_e ainda o const_cast (????)
_determinar o tipo de variavel: auto x
_ciclo for, para todos os elementos de uma coleção (array, vector,..) (for range-based)
for (auto & elemento: tabela) instrução
_funções: void imprime(int val);
_funções overloaded (são usadas/substituias dependendo dos dados)

//—->a referencia é uma variavel e que pode:
__ser passada a uma função
__ser retornada por uma função
__ser criada de forma independente
__mas se for uma variavel não pode ser alterada

//—->o uso de um ponteiro como parametro de uma função:
f(&i) >> void f(int *n); em que
void f(int *n){
*n=…;
}

//—->o uso de uma referencia como parametro de uma função:
f(i) >> void f(int & n); em que
void f(int & n){
n=…;
}

//—->o uso de uma referencia como retorno de uma função:
global >> int x
f() -> int & f(); em que
int & f(){
return x;
}

//—->constantes (variaveis, arrays)
na sua area de validade não pode ser alterado
const antes do * impede a alteração do apontado >> int const * p;
const depois * torna constante o ponteiro >> int * const p = &i;

const antes e depois do P (nao é possivel qualquer alteração) >> int const * const a = &i;

quando uma função nao deve alterar uma variavel >> ponteiro para constante

//—->referencias a lvalue e rvalue (????)

//—->funções inline
sao expandidas inline
inline void par(int x) return !(x%2);
int main(){
if(par(10)) cout << “\npar..”<< endl;
}

//—->funções overloaded
funções com o mesmo nome mas
__diferentes

#a_lista dos includes “normais/regulares”
#include <iostream>
#include <string>
#include <iostream>
using namespace std;

Tags : , ,

No gamedev mas gamificação, que também é interessante (em gráficos)

O que é:

O planeamento:

Tags :

Gamedev, explicado em modo gráficos! :)

Open source developer

 

Unreal developer

Game deve artist

Unity developer

fonte: gameDev.tv

Tags :

Gaming, é mais ou menos isto o que se passa nos nossos dias..

Tags :

POO, conceitos

Uma classe representa a especificação do novo tipo de dados que representa a entidade. Definida por:
Dados
Funções
Essas funções só possam ser aplicadas a esses dados
Esses dados só podem ser manipulados por essas funções
Um objecto é uma variável (instância) de uma classe

A programação orientada a objectos utiliza os mecanismos de:
encapsulamento
_Dados e código que manipula esses dados são reunidos dentro da mesma entidade (classe), formando uma unidade íntegra e indivisível, autónoma em termos de dados e funcionalidade, que vai funcionar como um bloco de construção do programa
herança
_A herança é o processo pelo qual um tipo de dados pode herdar as propriedades de outro e ter ainda as suas propriedades específicas e sem ter que repetir código
polimorfismo
O polimorfismo um mecanismo/propriedade que permite manipular dados diferentes por aquilo que têm de comum, sem necessidade de repetir código nem estruturas de dados. O mesmo interface (molde) pode usar-se para especificar diversas acções com significado análogo

Tags :

ZX Spectrum 48k

Encontrei uma malta no reino unido que andar a reconstruir e a recuperar os velhinhos ZX Spectrum e não só, para depois os revendem a funcionar em pleno. O contacto inicial que fiz indica que o custo de uma ZX Spectrum ronda as 100 libras + portes de envio. Acho caro para a máquina que é e o que se pode fazer com ela, mas .. fica para já o registo aqui da coisa.

+infos(loja): http://www.mutant-caterpillar.co.uk/shop/

 

Tags : ,

Indie X

Está a decorrer em Lisboa uma chamada de jogos Indie, tanto nacionais como internacionais. Ao todo são esperadas até um máximo de cinquenta participações, que vão ser analisadas e mostradas num evento que depois vai decorrer no espaço da Lisboa Games Week

+infos(oficial): https://indiex.pt

Tags :

Dreams

Aqui está uma daquelas coisas que acho que vou precisar, um a Mochila para Portátil do género da Odyssey Backpack da HP.

Coisas positivas:
+suficiente para o portátil que uso;
+com espaço para levar outras coisas que devo precisar (ao invés de andar com dois sacos atrás).

-preço apenas de referência (link)

Tags :

parte 6 – várias funções em C para manipulação de ficheiros e estruturas dinâmicas

Assunto deste post: várias funções em C para manipulação de ficheiros (de texto para binários e de binários para texto e estruturas dinâmicas (lista ligada e vector dinâmico de estruturas)

//ficheiro parte1.c
#include "parte1Comum.h"

int menu(){
    int i;
    puts("1 - adiciona grupo");
    puts("2 - remove grupo");
    puts("3 - lista grupo");
    puts("4 - pesquisa grupo");
    puts("5 - ");
    puts("6 - ");
    puts("7 - carregar grupo de um ficheiro binario");
    puts("8 - terminar");
    puts("Escolha uma opcao: ");
    
    do{
        scanf(" %d", &i);
    }while(i <0 || i >8);
    
    return i;
}


void main() {
    int escolha;
    pGrupo listaGrupo=NULL;
    pMesa listaMesa[TAM]={NULL};
    int totalMesas=0;
    int h, m, pessoas;
    char mesa[20];
   
     do{
         printf("\ntotal de mesas: %d\n\n", totalMesas);
        escolha = menu();
        switch(escolha){
            case 1: 
                    printf("\nA que horas e minutos vem a reserva? (formato h m)\n");
                    scanf(" %d", &h);
                    scanf(" %d", &m);
                    printf("\nQuantas pessoas?\n");
                    scanf(" %d", &pessoas);
                    printf("\nQual a mesa?\n");
                    scanf(" %99[^\n]", mesa);
                    adicionaGrupo(listaMesa[TAM], &totalMesas, &listaGrupo, h, m, pessoas, mesa);
                    break;
            case 2: break;
            case 3: 
                    listagemGrupo(listaGrupo);
                    break;
            case 4: break;
            case 5: break;
            case 6: break;
            case 7: break;
        }
    }while(escolha != 8);
    
}


//ficheiro parte1Comum.h
#ifndef PARTE1COMUM_H
#define PARTE1COMUM_H

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

#define TAM 20

typedef struct tipoA mesa, *pMesa;
typedef struct tipoB grupo, *pGrupo;

struct tipoA{
    char id[20];
    int conta, valorTot;
};

struct tipoB{
    struct hora{int h, m;} in, out;
    int num, valor;
    pMesa ptr;
    pGrupo prox;
};

pGrupo adicionaGrupo(pMesa v, int *tot, pGrupo *lista, int h, int m, int pessoas, char *idM);
void adicionaGrupoAux();
pGrupo listagemGrupo(pGrupo lista);

#endif /* PARTE1COMUM_H */


//ficheiro parte1Comum.c
#include "parte1Comum.h"
//funções

//receber um grupo: dados do grupo e preenhcer os dados da mesa

pGrupo adicionaGrupo(pMesa v, int *tot, pGrupo *lista, int h, int m, int pessoas, char *idM){

    printf("\nvamos la ver se apanho os dados\n");
    printf("%d\t%d\t%d\t%d\t%s\t", *tot, h ,m ,pessoas, idM);
    pGrupo novo;
    novo = malloc(sizeof(grupo));
     if(novo==NULL){
         printf("\nerro: nao foi possivel reservar memoria");
         return NULL;
     }else{
     if(*tot==0){
         //primeira reserva mesa
        novo->in.h = h;
        novo->in.m = m;
        novo->num = pessoas;
        novo->prox = NULL;
        (*tot)++;
        //v[0].id = idM;
        //strcpy(v[0].id, idM);
        printf("\n\n%s",v[0].id);
        
        return novo;
    }
    
    
    }
    return novo;
    free(novo);
}

pGrupo listagemGrupo(pGrupo lista){

    printf("entrei");
    
    return NULL;
}
Tags : , ,

parte 5 – gestão dinâmica de memória (listas ligadas a listas ligadas)

O caso de uma lista de disciplinas que tem alunos inscritos.. :) as disciplinas é uma lista ligada e os alunos inscritos também o são.. vamos ver como corre

//listas de listas (listas ligadas)
#include <stdio.h>
#include <stdlib.h>

#define TAM 3
#define TAMNOME 10

typedef struct pessoa aluno, *paluno; 
typedef struct disciplina aUC, *pUC; 

struct pessoa{s
    int nif;
    char nome[TAMNOME];
    paluno pseguinte;
};


struct disciplina{
    int numeroUC;
    char nomeUC[TAMNOME];
    pUC pUCseguinte;
    paluno lista;
};

int lista_vazia(paluno p, pUC puc);
int menu();
pUC adicionaUC(int *auxTUC, pUC p);
void listaUCs(pUC p, int totalUC);
pUC removerUC(int *auxTUC, pUC p);
paluno adicionaAluno(paluno pA, pUC pU);



int lista_vazia(paluno p, pUC puc){
    if(p==NULL && puc == NULL){
        return 1;
    }else{
        return 0;
    }
}

int menu(){
    int i;
    //printf("total UCs: %d", totalUCs)
    puts("1 - adiciona UC");
    puts("2 - remove UC"); //last
    puts("3 - lista UCs");
    puts("4 - adiciona aluno a UC");
    puts("5 - remove aluno a UC"); //last
    puts("6 - lista UC de aluno");
    puts("7 - ");
    puts("8 - terminar");
    puts("Escolha uma opcao: ");
    
    do{
        scanf(" %d", &i);
    }while(i <0 || i >8);
    
    return i;
}

pUC removerUC(int *auxTUC, pUC p){
    int retirarUC;
    pUC atual, anterior=NULL;
    
    atual = p;
    
    if(p==NULL){
        printf("\nerro: nao existe nada para remover");
        return p;
    }else{
        printf("\nqual o nif da UC a remover?\n");
        scanf("%d", &retirarUC);
        
        while(atual != NULL && atual->numeroUC != retirarUC){
            anterior = atual;
            atual= atual->pUCseguinte;
        }
        if(anterior == NULL){
            p = atual->pUCseguinte;
            (*auxTUC)--;
        }else{
            anterior->pUCseguinte = atual->pUCseguinte;
            (*auxTUC)--;
        }
        }
    free(atual);
    return p;
}

paluno adicionaAluno(paluno pA, pUC pU){
    
    
    
    

    return pA;
}


pUC adicionaUC(int *auxTUC, pUC p){
    int auxiliar;
    pUC novo, cursor;
    
    novo = malloc(sizeof(aUC));
    if(novo == NULL){
        printf("erro: nao e possivel alocar memoria para a UC");
        return p;
    }else{
    
    if(*auxTUC >= TAM){
        printf("erro: nao e possivel adicionar mais UC\n");
        free(novo);
        return p;
    }else{
        printf("Qual o numero da nova UC?\n");
        scanf("%d", &novo->numeroUC);
        printf("Qual o nome da nova UC?\n");
        scanf(" %99[^\n]", novo->nomeUC);
        novo->pUCseguinte = NULL;
        novo->lista = NULL;
        
        if(p==NULL){    
            p=novo;
            (*auxTUC)++;
            return p;
        }else{
            cursor=p;
            while(cursor->pUCseguinte != NULL){
                cursor=cursor->pUCseguinte;
                }
                cursor->pUCseguinte = novo;
                (*auxTUC)++;
                return p;
        }
    }
    }
    free(novo);
}

void listaUCs(pUC p, int totalUC){

    if(p==NULL){
        printf("\nerro: nao tem nada para listar de UCs");
    }else{
        printf("\nlistagem das %d UCs:\n", totalUC);
        while(p!=NULL){
            printf("%d\t%s\n", p->numeroUC, p->nomeUC);
            p=p->pUCseguinte;
        }
    }
}



int main() {
    int escolha, totalUC=0;
    paluno listaA=NULL;
    pUC listaUC=NULL;
    
    if(lista_vazia(listaA, listaUC)==1){
    do{
        escolha = menu();
        switch(escolha){
            case 1: listaUC=adicionaUC(&totalUC, listaUC); break;
            case 2: listaUC=removerUC(&totalUC, listaUC); break;
            case 3: listaUCs(listaUC, totalUC);
            case 4: listaA=adicionaAluno( listaA, listaUC);break;
            case 5: break;
            case 6: break;
            case 7: break;
            case 8: break;
        }
    }while(escolha != 8);
    }else{
        printf("nao foi possivel inicializar!");
    }
    
    
    return 0;
}


e ficou incompleto..

ajudas:
LINK1

Tags : , ,