Entrada no módulo 11 – Programação Orientada a Objectos Avançada

Março 30, 2009

Com a entrada neste módulo 11, Programação Orientada a Objectos Avançada, era necessário um IDE que nos permitisse programar em C++ utilizando Qt. Para tal, o nosso professor escolheu o QT Creator, que apesar de não ser ainda estável serve perfeitamente os nossos interesses.


Utilizando sempre o paradigma ADT, vamos continuar a programar em QT e C++, com uma pequena diferença para o módulo 8, pois a partir de agora vamos criar a interface com o Designer, uma ferramenta incorporada no QT Creator em vez de utilizarmos o código fonte.

Aqui está um exemplo de um programa que verifica se uma matrícula é válida ou não, chamado IdDoAutomovelDialog.

IdDoAutomovelDialog.cpp

#include <QtGui>

#include "IdDoAutomovelDialog.h"

IdDoAutomovelDialog::IdDoAutomovelDialog(QWidget *parent):QDialog(parent){
    //Label
    label = new QLabel("&Matrícula:");

    //Line Edit
    lineEdit = new QLineEdit;

    //Buddyes
    label->setBuddy(lineEdit);

    //Spacer
    horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

    //OK Button
    okButton = new QPushButton("Ok");
    okButton->setEnabled(false);

    //CANCEL Button
    cancelButton = new QPushButton("Cancel");
    cancelButton->setObjectName(QString::fromUtf8("cancelButton"));

    //Validar a matrícula introduzida ( http://pt.wikipedia.org/wiki/Matr%C3%ADculas_autom%C3%B3veis_em_Portugal )
    listaMatriculasValidas = new QStringList;
    listaMatriculasValidas->append("[A-Za-z]{2,2}[-][0-9]{2,2}[-][0-9]{2,2}");
    listaMatriculasValidas->append("[0-9]{2,2}[-][0-9]{2,2}[-][A-Za-z]{2,2}");      //or
    listaMatriculasValidas->operator <<("[0-9]{2,2}[-][A-Za-z]{2,2}[-][0-9]{2,2}");
    QRegExp regExp(listaMatriculasValidas->join("|"));
    lineEdit->setValidator(new QRegExpValidator(regExp, this));

    //Definir acções
    connect(lineEdit, SIGNAL(textChanged(const QString &)),
            this, SLOT(on_lineEdit_textChanged()));

    connect(okButton, SIGNAL(clicked()),
            this, SLOT(accept()));
    connect(cancelButton, SIGNAL(clicked()),
            this, SLOT(close()));

    //layout Dialog
    horizontalLayout = new QHBoxLayout;
    horizontalLayout_2 = new QHBoxLayout;
    verticalLayout = new QVBoxLayout;

    horizontalLayout->addWidget(label);
    horizontalLayout->addWidget(lineEdit);

    horizontalLayout_2->addItem(horizontalSpacer);
    horizontalLayout_2->addWidget(okButton);
    horizontalLayout_2->addWidget(cancelButton);

    verticalLayout->addLayout(horizontalLayout);
    verticalLayout->addLayout(horizontalLayout_2);

    setWindowTitle("Matrícula");
    setLayout(verticalLayout);

    //Tab order
    QWidget::setTabOrder(lineEdit, okButton);
    QWidget::setTabOrder(okButton, cancelButton);
}

void IdDoAutomovelDialog::on_lineEdit_textChanged(){
    okButton->setEnabled(lineEdit->hasAcceptableInput());
}

IdDoAutomovelDialog.h

#ifndef IDDOAUTOMOVELDIALOG_H
#define IDDOAUTOMOVELDIALOG_H

#include <QDialog>

class QLabel;
class QLineEdit;
class QSpacerItem;
class QPushButton;
class QHBoxLayout;
class QVBoxLayout;
class QString;
class QRegExp;

class IdDoAutomovelDialog : public QDialog
{
    Q_OBJECT

public:
    IdDoAutomovelDialog(QWidget *parent = 0);

private slots:
    void on_lineEdit_textChanged();

private:
    QLabel *label;
    QLineEdit *lineEdit;
    QSpacerItem *horizontalSpacer;
    QPushButton *okButton;
    QPushButton *cancelButton;
    QStringList *listaMatriculasValidas;
    QVBoxLayout *verticalLayout;
    QHBoxLayout *horizontalLayout;
    QHBoxLayout *horizontalLayout_2;
};

#endif // IDDOAUTOMOVELDIALOG_H

main.cpp

#include <QApplication>

#include "IdDoAutomovelDialog.h"

int main(int argc, char *argv[]){
    QApplication app(argc, argv);
    IdDoAutomovelDialog *dialog = new IdDoAutomovelDialog;
    dialog->show();
    return app.exec();
}

Se a matricula for válida o botão OK passa a “Enable”, caso contrário estará sempre “Disable”.


Rádio – Abordagem em C++ segundo o paradigma ADT

Dezembro 12, 2008

Desde Terça-Feira, dia 9 de Dezembo, que temos investido neste novo paradigma de programação. Foi então proposta a realização de um programa em que utilizá-se-mos o que aprendemos. Pusemos mãos à obra, e as cabeças a funcionar. Surgiram então ideias inovadoras como uma Slot Machine e uma Calculadora.

Eu optei por um rádio com uma lâmpada, um botão para o volume (entre 1 e 10) e outro botão para a emissora (entre 1 e 10) como mostra a imagem seguinte.

Rádio

Como podem ver, o meu forte não é desenhar, mas para tal trabalho adapta-se perfeitamente.

Aqui está o código do programa:

main.cpp

#include <iostream>
#include"Radio.h"
using namespace std;
int main(){
    Radio radio;

    //comandos
    radio.Luz();

    radio.VolumeMais();
    radio.VolumeMais();
    radio.VolumeMenos();

    radio.EmissoraMais();
    radio.EmissoraMenos();

    //status
    cout<<"Status"<<endl;
    cout<<"Emissora: "<<radio.ObterEmissora()<<endl;
    cout<<"Volume: "<<radio.ObterVolume()<<endl;
    cout<<"Lâmpada: "<<radio.ObterLampada()<<endl;

}

Radio.h

#ifndef RADIO_H
#define RADIO_H
#include <string>
using namespace std;
class Radio{
public:
	Radio();
	void Luz();
	void VolumeMais();
	void VolumeMenos();
	void EmissoraMais();
	void EmissoraMenos();
	int ObterVolume();
	int ObterEmissora();
	string ObterLampada();

private:
	string MensagemLigado;
	string MensagemDesligado;
	int Volume;
	int Emissora;
	bool Lampada;
};
#endif

Radio.cpp

#include <iostream>
#include <string>
#include "Radio.h"
using namespace std;
Radio::Radio(){
	Volume=1;
	Emissora=1;
	Lampada=false;
}
void Radio::Luz(){
	if(Lampada==true){
		Lampada=false;
		cout<<"Lâmpada desligada"<<endl;
	}
	else{
		Lampada=true;
		cout<<"Lâmpada ligada"<<endl;
	}
}
void Radio::VolumeMais(){
	if(Volume<10){
		Volume++;
		cout << "Volume Aumentado: " <<Volume<< endl;
	}
}
void Radio::VolumeMenos(){
	if(Volume>1){
		Volume--;
		cout << "Volume Aumentado: " <<Volume<< endl;
	}
}
void Radio::EmissoraMais(){
	if(Emissora<10){
		Emissora++;
		cout << "Emissora Aumentado: " <<Emissora<< endl;
	}
}
void Radio::EmissoraMenos(){
	if(Emissora>1){
		Emissora--;
		cout << "Emissora Aumentado: " <<Emissora<< endl;
	}
}
int Radio::ObterVolume(){
	return Volume;
}
int Radio::ObterEmissora(){
	return Emissora;
}
string Radio::ObterLampada(){
	if(Lampada==true)
		return "Ligada";
	else
		return "Desligada";
}


Paradigma ADT

Dezembro 12, 2008

No paradigma ADT o programa é construído mediante a utilização de tipos de dados definidos pelo utilizador designadas por classes, que quando instanciadas originam objectos, cada um dos quais podendo conter conjuntos de dados e funções, que são manipulados de forma a resolverem o problema proposto.

Na base deste tipo de programação encontra-se o conceito de classe, em torno do qual se pode dizer que tudo funciona.

Um bom exemplo deste tipo de programação é o programa The Tinking Cap, ou Capacete Pensante.



Entrada no Módulo 8

Novembro 10, 2008

Entrá-mos numa nova era na disciplina de Programação de Sistemas de Informação, pois vamos começar neste módulo a trabalhar em modo gráfico. Como estavamos habituados a trabalhar em modo de texto(CLI), a passagem para o modo gráfico(GUI) irá ser difícil. Contudo não mudamos de linguagem e mantivé-mos o C++. Vamos passar a programar em QT porque é uma ferramenta Open Source e que nos permite programar em C++ ou Java.

Aqui fica um exemplo de um programa.


#include<QApplication>
#include<QLabel>
#include <QVBoxLayout>

int main(int argc, char *argv[]){
    QApplication app(argc, argv);
    QWidget *janela= new QWidget;
    QLabel *dia1 = new QLabel("DOM");
    QLabel *dia2 = new QLabel("SEG");
    QLabel *dia3 = new QLabel("TER");
    QLabel *dia4 = new QLabel("QUA");
    QLabel *dia5 = new QLabel("QUI");
    QLabel *dia6 = new QLabel("SEX");
    QLabel *dia7 = new QLabel("SAB");
    QVBoxLayout *coluna1 = new QVBoxLayout;

    coluna1->addWidget(dia1);
    coluna1->addWidget(dia2);
    coluna1->addWidget(dia3);
    coluna1->addWidget(dia4);
    coluna1->addWidget(dia5);
    coluna1->addWidget(dia6);
    coluna1->addWidget(dia7);

    janela->setLayout(coluna1);

    janela->show();
    return app.exec();
}

Este programa mostra os 7 dias da semana alinhados numa coluna.


Final do Módulo 07 – Resumo e Reflexão

Outubro 21, 2008

Neste post vou falar da matéria que demos no Módulo 7. Falámos de diversas coisas novas como “fopen/fclose”, “fputc/fgetc”, “fprintf/fscanf” e “fwrite/fread”.

fopen – este comando serve para abrir o ficheiro.

Modo de utilização

fp=fopen("texto.txt","r");

fclose – este comando serve para fechar o ficheiro.

Modo de utilização

fclose(fp);

fputc – este comando serve para escrever um caracter num ficheiro.

Modo de utilização

fputc('x', fp);

fgetc – este comando serve para ler um caracter num ficheiro.

Modo de utilização

caracter=fgetc(fp);

fprintf – Escreve dados num programa num formato indicado.

Modo de utilização

fprintf(fp,"%d",a);

fscanf – Lê dados num programa no formato indicado.

Modo de utiização

fscanf(fp, "%d", &a");

fwrite – transfere um bloco de dados, com um determinado tamanho em bytes, da memória primária para ao ficheiro.

Modo de utilização

fwrite(valores, sizeof(int), 5, fp);

fread -lê um bloco de dados com um determinado tamanho em bytes do ficheiro para a memória primária.

Modo de utilização

fread(valores, sizeof(int), 5, fp);


Entrada no Módulo 7 – Manipulação de ficheiros

Outubro 10, 2008

Começamos, neste modulo a manipular ficheiros através da Linguagem de Programção C. A grande vantagem deste módulo/matéria é que no fim dos programas os dados não são perdidos, sendo gravados num ficheiro, e podendo ser usados e/ou alterados mais tarde.

Este foi o primeiro programa:


#include <stdio.h>
int main(){
	FILE *ficheiro;
	ficheiro=fopen("meutexto.txt","r");
	if(ficheiro==NULL)
		printf("Impossivel abrir o ficheiro\n");
	else{
		printf("Ficheiro aberto com sucesso\n");
		fclose(ficheiro);
		}
	return 0;
}


Novo Ano – Programar até cair para o lado

Outubro 7, 2008

Espera-se mais um ano repleto de novas aventuras no mundo da programação. Se o ano passado demos os primeiros passos nesta área tão vasta, este ano espera-se que o nível de dificuldade seja mais elevado. Este ano vamos estudar algumas áreas mais interessantes como a manipulação de ficheiros através da programação em Linguagem C.


Primeiro programa com apontadores

Setembro 19, 2008

Hoje fizemos o nosso 1º programa com apontadores.

Basicamente, este programa apenas lê dois números e faz a sua soma. O programa é muito simples.


Agenda em C++

Setembro 19, 2008

Hoje vou apresentar uma agenda muito complexa, que foi feita durante a aula de “Programação de Sistemas Informáticos”. Faz basicamente tudo, mas apresenta um grave defeito: quando o programa fecha, perdem-se todos os dados.
Com este programa aprendemos um novo conceito, estrutura, que simplifica muito o trabalho do programador, permitindo, entre outras coisas, criar variáveis que podem conter vários tipos de dados. Com este novo conceito, surgiu outro, o ‘typedef’ que é uma espécie de estrutura que permite criar novos tipos de dados definidos pelo utilizador.


Apontador

Setembro 19, 2008

Um apontador é uma variável como qualquer outra, mas que é utilizada para armazenar o endereço de memória de outra variável.
O código seguinte entre numa linguagem de programação chamada C++. Este código contem vários tipos de variáveis incluindo apontadores


#include<iostream>
#include<iomanip>
using namespace std;
int main(){
    int x=33;
    int *ptr_x=&x;
    cout << "-- Estado inicial ---------------------------------------\n";
    cout << "\tValor armazenado na variável x       : " << x << endl;
    cout << "\tEndereço de memória da variável x    : " << &x << endl;
    cout << "\tValor armazenado na variável ptr_x   : " << ptr_x << endl;
    cout << "\tEndereço de memória da variável ptr_x: " << &ptr_x << endl;

    cout << "-- Ler um novo valor para x ------------------------------\n";
    cout << "x = "; cin >> x;
    cout << "\tValor armazenado na variável x       : " << x << endl;
    cout << "\tEndereço de memória da variável x    : " << &x << endl;
    cout << "\tValor armazenado na variável ptr_x   : " << ptr_x << endl;
    cout << "\tEndereço de memória da variável ptr_x: " << &ptr_x << endl;

    return 0;
}

Na linha 6, criamos uma variável nova, mas agora trata-se de um apontador:

* O nome do apontador é ptr_x.
* O conteúdo de ptr é o endereço de memória da variável x.

Conclusão: ptr_x é um apontador para a variável x.


Seguir

Get every new post delivered to your Inbox.