Mudanças entre as edições de "PRG2-2015-2b"
Linha 82: | Linha 82: | ||
string metodo; | string metodo; | ||
string path; | string path; | ||
+ | string http; | ||
int status; | int status; | ||
long bytes; | long bytes; | ||
string agente; | string agente; | ||
}; | }; | ||
− | int dia, ano, hora, minuto, segundo, | + | int dia, ano, hora, minuto, segundo, status; |
− | char ip[20], data[35 | + | int long bytes; |
+ | char ip[20], data[35], metodo[9], paths[250], usuario [45], agente[40], http[200]; | ||
int datadia, dataano; | int datadia, dataano; | ||
− | + | ||
int main(int argc, char *argv[]) { | int main(int argc, char *argv[]) { | ||
// testa se o nome do arquivo foi passado pela linha de comando | // testa se o nome do arquivo foi passado pela linha de comando | ||
Linha 97: | Linha 99: | ||
} | } | ||
Registro Regist; | Registro Regist; | ||
+ | Lista<Registro> Encadeada; | ||
+ | |||
− | |||
// Cria o objeto ifstream, o que implica abrir o arquivo | // Cria o objeto ifstream, o que implica abrir o arquivo | ||
ifstream arq(argv[1]); | ifstream arq(argv[1]); | ||
Linha 111: | Linha 114: | ||
while (not arq.eof()) { | while (not arq.eof()) { | ||
string linha; | string linha; | ||
− | + | ||
getline(arq, linha); | getline(arq, linha); | ||
− | + | ||
− | sscanf( linha.c_str(), "%s %s %s %c %s %d %c %c %s %s %s ", ip, traco, usuario, colchete, data, &codigo, barra, aspas, metodo, paths, agente); | + | //sscanf( linha.c_str(), "%s %s %s %c %s %d %c %c %s %s %s ", ip, traco, usuario, colchete, data, &codigo, barra, aspas, metodo, paths, agente); |
− | + | sscanf(linha.c_str(), "%s %*c %s [%s %*d] \"%s %s %[^\"]\" %d %ld %*s \"%[^\"]\"", ip, usuario, data, metodo, paths, http, &status, &bytes, agente); | |
string datacompleta= data; | string datacompleta= data; | ||
string dia = datacompleta.substr(0,datacompleta.find('/')); | string dia = datacompleta.substr(0,datacompleta.find('/')); | ||
− | + | ||
datadia= atoi(dia.c_str()); | datadia= atoi(dia.c_str()); | ||
datacompleta.erase(0,3); | datacompleta.erase(0,3); | ||
− | + | ||
string datames = datacompleta.substr(0,3); | string datames = datacompleta.substr(0,3); | ||
datacompleta.erase(0,4); | datacompleta.erase(0,4); | ||
− | + | ||
string anos = datacompleta.substr(0,4); | string anos = datacompleta.substr(0,4); | ||
datacompleta.erase(0,5); | datacompleta.erase(0,5); | ||
Linha 132: | Linha 135: | ||
Regist.usuario= usuario; | Regist.usuario= usuario; | ||
Regist.metodo = metodo; | Regist.metodo = metodo; | ||
− | Regist.status = | + | Regist.status = status; |
+ | Regist.bytes = bytes; | ||
Regist.path= paths; | Regist.path= paths; | ||
+ | Regist.http= http; | ||
Regist.agente=agente; | Regist.agente=agente; | ||
Regist.data.dia=datadia; | Regist.data.dia=datadia; | ||
Regist.data.mes=datames; | Regist.data.mes=datames; | ||
Regist.data.ano=dataano; | Regist.data.ano=dataano; | ||
− | + | ||
− | + | Encadeada.adiciona(Regist); | |
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
arq.close(); | arq.close(); | ||
− | + | ||
+ | cout<< "Comprimento: "<< Encadeada.comprimento()<<endl; | ||
+ | for (int pos=0;pos<Encadeada.comprimento();pos++) | ||
+ | { | ||
+ | cout<< "IP: "<< Encadeada.obtem(pos).ip<<endl; | ||
+ | cout<< "Usuario: "<< Encadeada.obtem(pos).usuario<<endl; | ||
+ | cout<< "Metodo: "<< Encadeada.obtem(pos).metodo<<endl; | ||
+ | cout<< "Status: "<< Encadeada.obtem(pos).status<<endl; | ||
+ | cout<< "Bytes: "<< Encadeada.obtem(pos).bytes<<endl; | ||
+ | cout<< "Path: "<< Encadeada.obtem(pos).path<<endl; | ||
+ | cout<< "Http: "<< Encadeada.obtem(pos).http<<endl; | ||
+ | cout<< "Agente: "<< Encadeada.obtem(pos).agente<<endl; | ||
+ | cout<< "Dia: "<< Encadeada.obtem(pos).data.dia<<endl; | ||
+ | cout<< "Mes: "<< Encadeada.obtem(pos).data.mes<<endl; | ||
+ | cout<< "Ano: "<< Encadeada.obtem(pos).data.ano<<endl; | ||
+ | cout<< " "<<endl; | ||
+ | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> |
Edição das 22h15min de 1 de dezembro de 2015
Programação 2: Diário de aula 2015-2 da turma B
Página da turma do Prof. Marcelo Sobral
Professor: Francisco de Assis
Encontros: 4a feira/13:30, 5a feira/13:30
Atendimento paralelo: 4a de 10:00 às 11:00
19/11: Projeto 3
25/11: Prova 1
A avaliação 1 será uma prova prática individual em laboratório, envolvendo questões sobre filas e pilhas, além de possíveis referências aos projetos 1 e 2.. Cada estudante deve trazer sua implementação de fila e pilha. Durante a prova podem-se consultar a wiki e o manual online do Linux. A prova consistirá de pelo menos quatro questões, valendo 10 pontos cada uma. Sua avaliação será feita da seguinte forma:
< 10 pontos: os projetos 1 e 2 serão avaliados com D. entre 10 e 19 pontos: os conceitos dos projetos 1 e 2 serão reduzidos em um nível. entre 20 e 25 pontos: os conceitos dos projetos 1 e 2 serão mantidos. acima de 25 pontos: os conceitos dos projetos 1 e 2 serão elevados em um nível.
OBS: uma questão será considerada correta somente se compilar, for implementada exatamente como solicitado e fornecer um resultado correto.
Prova 1 2015-2
Prova 2015-1
26/11: Projeto 3: Quebra de Linhas de Logs
Uso do sscanf no C++:
/* sscanf exemplo */
#include <stdio.h>
int main ()
{
char sentence []="Ana tem 23 anos";
char str [20];
int i;
sscanf (sentence,"%s %*s %d",str,&i);
printf ("%s -> %d\n",str,i);
return 0;
}
Saída: Ana -> 23
Resolução da Quebra de Logs:
#include <iostream>
#include <fstream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "Lista.h"
using namespace std;
struct DataHorario {
int dia;
string mes;
int ano;
int hora;
int minuto;
int segundo;
};
struct Registro {
string ip;
string usuario;
DataHorario data;
string metodo;
string path;
string http;
int status;
long bytes;
string agente;
};
int dia, ano, hora, minuto, segundo, status;
int long bytes;
char ip[20], data[35], metodo[9], paths[250], usuario [45], agente[40], http[200];
int datadia, dataano;
int main(int argc, char *argv[]) {
// testa se o nome do arquivo foi passado pela linha de comando
if (argc < 2) {
cout << "Uso: " << argv[0] << " nome_arquivo" << endl;
return 0;
}
Registro Regist;
Lista<Registro> Encadeada;
// Cria o objeto ifstream, o que implica abrir o arquivo
ifstream arq(argv[1]);
// Verifica se o arquivo foi aberto, ou se houve algum erro
if (not arq.is_open()) {
cout << "Erro: não conseguiu abrir o arquivo (ele existe ?)" << endl;
return 0;
}
// Lê todas as linhas do arquivo
while (not arq.eof()) {
string linha;
getline(arq, linha);
//sscanf( linha.c_str(), "%s %s %s %c %s %d %c %c %s %s %s ", ip, traco, usuario, colchete, data, &codigo, barra, aspas, metodo, paths, agente);
sscanf(linha.c_str(), "%s %*c %s [%s %*d] \"%s %s %[^\"]\" %d %ld %*s \"%[^\"]\"", ip, usuario, data, metodo, paths, http, &status, &bytes, agente);
string datacompleta= data;
string dia = datacompleta.substr(0,datacompleta.find('/'));
datadia= atoi(dia.c_str());
datacompleta.erase(0,3);
string datames = datacompleta.substr(0,3);
datacompleta.erase(0,4);
string anos = datacompleta.substr(0,4);
datacompleta.erase(0,5);
dataano= atoi(anos.c_str());
Regist.ip = ip;
Regist.usuario= usuario;
Regist.metodo = metodo;
Regist.status = status;
Regist.bytes = bytes;
Regist.path= paths;
Regist.http= http;
Regist.agente=agente;
Regist.data.dia=datadia;
Regist.data.mes=datames;
Regist.data.ano=dataano;
Encadeada.adiciona(Regist);
}
arq.close();
cout<< "Comprimento: "<< Encadeada.comprimento()<<endl;
for (int pos=0;pos<Encadeada.comprimento();pos++)
{
cout<< "IP: "<< Encadeada.obtem(pos).ip<<endl;
cout<< "Usuario: "<< Encadeada.obtem(pos).usuario<<endl;
cout<< "Metodo: "<< Encadeada.obtem(pos).metodo<<endl;
cout<< "Status: "<< Encadeada.obtem(pos).status<<endl;
cout<< "Bytes: "<< Encadeada.obtem(pos).bytes<<endl;
cout<< "Path: "<< Encadeada.obtem(pos).path<<endl;
cout<< "Http: "<< Encadeada.obtem(pos).http<<endl;
cout<< "Agente: "<< Encadeada.obtem(pos).agente<<endl;
cout<< "Dia: "<< Encadeada.obtem(pos).data.dia<<endl;
cout<< "Mes: "<< Encadeada.obtem(pos).data.mes<<endl;
cout<< "Ano: "<< Encadeada.obtem(pos).data.ano<<endl;
cout<< " "<<endl;
}
}