Переглянути джерело

Adicionar 'js/assistant/assistant.js '

victor_passos 2 роки тому
батько
коміт
de1a257e9e
1 змінених файлів з 223 додано та 0 видалено
  1. 223 0
      js/assistant/assistant.js

+ 223 - 0
js/assistant/assistant.js

@@ -0,0 +1,223 @@
+// Dados constantes
+const exerciseTheme = [ "Leitura e Escrita",
+												"Manipulação de Entrada",
+												"Lógica",
+												"Matemática",
+												"Condição",
+												"Condição de Parada",
+												"Laço",
+												"Vetor"]
+
+const testCaseTypes = [ "Caso Geral",
+												"Caso Limite",
+												"Caso Nulo",
+												"Caso Negativo",
+												"Igualdade",
+												"Tipo de Entrada"]
+
+										
+
+
+
+// Aquisição de dados externos
+// Dados vindos do Avaliador Automático
+let exerciseType = [exerciseTheme[getRandomInt(0, exerciseTheme.length)],
+										exerciseTheme[getRandomInt(0, exerciseTheme.length)]];
+
+let testCases = [ {tag: testCaseTypes[getRandomInt(0, testCaseTypes.length)], incorrect: getRandomInt(0,2)},
+									{tag: testCaseTypes[getRandomInt(0, testCaseTypes.length)], incorrect: getRandomInt(0,2)},
+									{tag: testCaseTypes[getRandomInt(0, testCaseTypes.length)], incorrect: getRandomInt(0,2)},
+									{tag: testCaseTypes[getRandomInt(0, testCaseTypes.length)], incorrect: getRandomInt(0,2)},
+									{tag: testCaseTypes[getRandomInt(0, testCaseTypes.length)], incorrect: getRandomInt(0,2)},
+									{tag: testCaseTypes[getRandomInt(0, testCaseTypes.length)], incorrect: getRandomInt(0,2)}];
+
+let allIncorrect = true;
+
+// Dados vindos da base de dados associada ao aluno
+let types = [ {type: exerciseTheme[0], total: 1, errors: 0},
+							{type: exerciseTheme[1], total: 3, errors: 0},
+							{type: exerciseTheme[2], total: 2, errors: 0},
+							{type: exerciseTheme[3], total: 1, errors: 0},
+							{type: exerciseTheme[4], total: 2, errors: 0},
+							{type: exerciseTheme[5], total: 9, errors: 2},
+							{type: exerciseTheme[6], total: 4, errors: 0},
+							{type: exerciseTheme[7], total: 1, errors: 0}];
+
+let tags = [{tag: testCaseTypes[0], total: 15, errors: 0},
+						{tag: testCaseTypes[1], total: 8, errors: 1},
+						{tag: testCaseTypes[2], total: 5, errors: 1},
+						{tag: testCaseTypes[3], total: 6, errors: 0},
+						{tag: testCaseTypes[4], total: 7, errors: 0},
+						{tag: testCaseTypes[5], total: 4, errors: 0}];
+
+let lastErrorsPerType = []; // Fila com os últimos 50 erros 
+
+for (let i = 0; i<50; i++){
+	lastErrorsPerType.push(exerciseTheme[getRandomInt(0, exerciseTheme.length)])
+}
+
+let lastErrorsPerTag = []; // Fila com os últimos 50 erros 
+
+for (let i = 0; i<50; i++){
+	lastErrorsPerTag.push(testCaseTypes[getRandomInt(0,testCaseTypes.length)])
+}
+
+
+
+
+// Variáveis internas
+let incorrect = false;
+let sugestions = [];
+let performance = [];
+
+let wrongTags = [];
+let wrongTagsAux = [];
+
+let lastErrorsPerTypeGraph = {};
+let lastErrorsPerTagGraph = {};
+
+
+
+// Funções auxiliares
+// Função que retorna um valor inteiro aleatório a partir de um intervalo definido
+function getRandomInt(min, max) {
+  min = Math.ceil(min);
+  max = Math.floor(max);
+  return Math.floor(Math.random() * (max - min)) + min;
+}
+
+// Função que encontra um objeto dentro de um array a partir do valor de uma de suas chaves
+function findObject(array,key,value) {
+	for(let i = 0; i < array.length; i++) {
+		if(array[i][key] === value) {
+				return i
+		}
+	}
+}
+
+
+
+// Funções do agente
+// Função que analisa o exercício em relação às tags
+function updateTags(testCases,tags,lastErrorsPerTag) {
+	for (var i = 0; i < testCases.length; i++) {
+		for (var j = 0; j < tags.length; j++) {
+			if (testCases[i].tag === tags[j].tag) {
+				tags[j].total += 1;
+				if (testCases[i].incorrect) {
+					incorrect = true;
+					tags[j].errors += 1;
+					lastErrorsPerTag.push(testCases[i].tag);
+					if (lastErrorsPerTag.length > 50) {
+						lastErrorsPerTag.shift();
+					}
+					wrongTagsAux.push(testCases[i].tag);
+				}
+			}
+		}
+	}
+   wrongTags = wrongTagsAux.filter((element, i) => wrongTagsAux.indexOf(element) === i)
+	//wrongTags = [...new Set(wrongTagsAux)]; // CUIDADO com o set
+}
+
+// Função que analisa o exercício em relação aos types
+function updateTypes(exerciseType,types,lastErrorsPerType) {
+	for (var i = 0; i < exerciseType.length; i++) {
+		for (var j = 0; j < types.length; j++) { 
+			if (exerciseType[i] === types[j].type) {
+				types[j].total += 1;
+				if (incorrect) {
+					types[j].errors += 1;
+					lastErrorsPerType.push(exerciseType[i]);
+					if (lastErrorsPerType.length > 50) {
+						lastErrorsPerType.shift();
+					}
+				}
+			}
+		}
+	}
+}
+
+// Função que contabiliza as ocorrências dentro das fila de últimos erros
+function lastErrors() {
+	lastErrorsPerType.forEach((x) => lastErrorsPerTypeGraph[x] = (lastErrorsPerTypeGraph[x] || 0)+1);
+	lastErrorsPerTag.forEach((x) => lastErrorsPerTagGraph[x] = (lastErrorsPerTagGraph[x] || 0)+1);
+}
+
+// Função que adiciona o desempenho à saída
+function addPerformance(exerciseType,wrongTags) {
+	let performanceText = "Desempenho\n\n";
+	performanceText += `Neste exercício relacionado a ${exerciseType} você `;
+	if (incorrect) {
+		performanceText += `errou os teste que envolvem ${wrongTags}.\n\n`;
+	}
+	else {
+		performanceText += `acertou todos os teste.\n\n`;
+	}
+	for (let i = 0; i < exerciseType.length; i++) {
+		let obj = findObject(types,"type",exerciseType[i]);
+		performanceText += `Seu desempenho em exercícios com ${exerciseType[i]} é de ${(100*(1-types[obj].errors/types[obj].total)).toFixed(2)}% de sucesso\n\n`;
+	}
+	if (incorrect) {
+		for (let i = 0; i < wrongTags.length; i++) {
+			let obj = findObject(tags,"tag",wrongTags[i]);
+			performanceText += `Seu desempenho em testes de ${wrongTags[i]} é de ${(100*(1-tags[obj].errors/tags[obj].total)).toFixed(2)}% de sucesso\n\n`;
+			performanceText += `Dos seus últimos 50 erros ${(100*(lastErrorsPerTagGraph[wrongTags[i]]/lastErrorsPerTag.length)).toFixed(2)}% foram em testes de ${wrongTags[i]}\n\n`;
+		}
+	}
+	console.log(performanceText);
+}
+
+// Função que adiciona a sugestão à saída
+function addSugestion(wrongTypes,wrongTags) {
+	let sugestionText = "Sugestões\n\n";
+	if (incorrect) {
+		sugestionText += `Levantar quais são os Casos Limites do problema a ser resolvido é fundamental para se avaliar o funcionamento adequado do programa desenvolvido, pois ao se testá-los podem ser encontrados erros que não são observados nos Casos Gerais.\n\n`;
+		sugestionText += `[Explicação de Casos Limites]\n\n`;
+		sugestionText += `[Exemplo de Casos Limites e Casos Gerais]\n\n`;
+		sugestionText += `[Material ou link sobre Casos Limites]\n\n\n`;
+		sugestionText += `O conceito de Laço é muito importante na programação, pois com ele ….\n\n`;
+		sugestionText += `[Explicação sobre Laços]\n\n`;
+		sugestionText += `[Exemplo do uso de Laços no iVProg]\n\n`;
+		sugestionText += `[Material ou link sobre Laços]\n\n`;
+	}
+	else {
+		sugestionText += `Parabéns!!! Seu exercício não apresentou erros.\n\n`;
+	}
+	console.log(sugestionText);
+}
+
+
+
+// Exibição dos valores recebidos
+console.log("\nAntes da Execução\n");
+console.table(exerciseType);
+console.table(testCases);
+console.table(types);
+console.table(tags);
+//console.table(lastErrorsPerType);
+//console.table(lastErrorsPerTag);
+console.log("*****************************************************************\n");
+
+
+
+// Execução do agente
+updateTags(testCases,tags,lastErrorsPerTag);
+updateTypes(exerciseType,types,lastErrorsPerType);
+lastErrors();
+addPerformance(exerciseType,wrongTags);
+addSugestion(exerciseType,wrongTags);
+console.log("*****************************************************************\n");
+
+
+
+// Reescrita do dados na base de dados associada ao aluno
+console.log("Após Execução\n");
+console.table(types);
+console.table(tags);
+console.table(lastErrorsPerTypeGraph);
+console.table(lastErrorsPerTagGraph);
+//console.table(lastErrorsPerType);
+//console.table(lastErrorsPerTag);
+console.log("\n");
+