Mudanças entre as edições de "PRG2-2015-2b"
Linha 35: | Linha 35: | ||
= 26/11: Projeto 3: Quebra de Linhas de Logs = | = 26/11: Projeto 3: Quebra de Linhas de Logs = | ||
− | + | Uso do sscanf no C++: | |
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
/* sscanf exemplo */ | /* sscanf exemplo */ | ||
Linha 55: | Linha 55: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | Resolução da Quebra de Logs: | ||
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> |
Edição das 08h36min de 26 de novembro 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;
int status;
long bytes;
string agente;
};
int dia, ano, hora, minuto, segundo, codigo;
char ip[20], data[35], traco[2], colchete[1], barra[1], aspas[1], metodo[9], paths[250], usuario [45], agente[40];
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;
// 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);
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 = codigo;
Regist.path= paths;
Regist.agente=agente;
Regist.data.dia=datadia;
Regist.data.mes=datames;
Regist.data.ano=dataano;
cout << ": " <<Regist.ip<< endl;
cout << ": " << Regist.usuario<< endl;
cout << ": " << Regist.metodo<< endl;
cout << ": " << Regist.status<< endl;
cout << ": " << Regist.path<< endl;
cout << ": " << Regist.agente<< endl;
cout << ": " << Regist.data.dia<< endl;
cout << ": " << Regist.data.mes<< endl;
cout << ": " << Regist.data.ano<< endl;
}
arq.close();
}