private static string ExtractAnswers(string[] answers, ref ExamsRow r) { int AIDcorrecto = Convert.ToInt32(answers[1]); //toma la respuesta correcta answers = answers[0].Split(SEP); //the array of answers ID QuestionsRow q = r.QuestionsRow; IEnumerable <AnswersRow> answ = q.GetAnswersRows(); int option = 0; string examen; examen = string.Empty; foreach (string s in answers) { char letra = Tools.Alpha[option]; int aid = Convert.ToInt32(s); AnswersRow a = answ.FirstOrDefault(o => o.AID == aid); //selectivamente en el mismo orden en que fue generada string respuesta = a.Answer; examen += letra; examen += ") " + respuesta + "\n"; //respuesta option++; } return(examen); }
/// <summary> /// PERHAPS THE MOST IKPORTAN, WHERE QAS ARE GENERATED AND PASSWORDS TOO /// </summary> /// <param name="exams"> </param> /// <param name="pr"> </param> /// <param name="questionAnswer"></param> /// <returns></returns> private static string[] makeQAs(ref IEnumerable <ExamsRow> exams, ref PreferencesRow pr, out IList <string[]> questionAnswer) { bool showPoints = pr.showPoints; double pointFactor = pr.Factor; questionAnswer = new List <string[]>(); int pregunta = 1; int claveCount = 1; string Clave; string questionWeight; string qidString; Clave = string.Empty; questionWeight = string.Empty; qidString = string.Empty; foreach (DataRow row in exams) { string[] qAns = new string[2]; ExamsRow r = (ExamsRow)row; string examen = string.Empty; examen = ExtractQuestionAndWeight(ref questionWeight, ref qidString, ref pregunta, showPoints, pointFactor, ref r); qAns[0] = examen; string[] answers = ExtractAnswersArray(ref r); examen = ExtractAnswers(answers, ref r); qAns[1] = examen; ExtractKey(ref Clave, ref claveCount, answers, ref r); questionAnswer.Add(qAns); } if (qidString[qidString.Length - 1].Equals(SEP)) { qidString = qidString.Substring(0, qidString.Length - 1); //erase last separator } if (questionWeight[questionWeight.Length - 1].Equals(SEP)) { questionWeight = questionWeight.Substring(0, questionWeight.Length - 1); //erase last separator } questionWeight += SEP2.ToString() + pointFactor.ToString(); //KEEP THE FACTOR IN THE STRING!!! if (Clave[Clave.Length - 1].Equals(SEP)) { Clave = Clave.Substring(0, Clave.Length - 1); //erase last separator } ///IMPORTANT CUMJULATIVE INFO return(new string[3] { Clave, questionWeight, qidString }); // LAnswer , LQuestion, }
/// <summary> /// MAIN FILE FOR GENERATING AN EXAM /// </summary> /// <param name="p"></param> private ExamsListRow doOneExam(ref PreferencesRow p) { inter.Status = Resources.Creando + inter.IdB.Questions.Count + Resources.PregAleatorias; Func <DB.QuestionsRow, bool> selector = x => { bool?ok = x.TopicsRow?.UseIt; if (ok == null) { ok = false; } return((bool)ok); }; ///RANDOMNIZE RAW QUESTIONS IEnumerable <DB.QuestionsRow> questions = inter.IdB.Questions.Where(selector).ToArray(); //toma todas las preguntas if (questions.Count() == 0) { inter.Status = "No hay preguntas seleccionadas"; return(null); } int times = 3; questions = Tools.RandomnizeStringsTimes(questions, times); IList <ExamsRow> exams = new List <ExamsRow>(); //todas las preguntas randomnizadas seran guardadas primero en esta lista foreach (QuestionsRow q in questions) { ExamsRow er = inter.IdB.Exams.NewExamsRow(); //crea rows pero no los metas en la tabla er.QID = q.QID; //dales el id de la pregunta exams.Add(er); //agregalos a la lista } inter.Status = Resources.Filtrando; IEnumerable <ExamsRow> join = weightThem(ref p, ref exams); //not re-ordered // preguntas seleccionadas y filtradas Application.DoEvents(); inter.Status = Resources.OrderAleatorio; // de las preguntas del examen ya pesadas (filtradaS) join = Tools.RandomnizeStringsTimes(join, times); inter.Status = Resources.Seleccionando + join.Count() + Resources.PregAleatorias; Application.DoEvents(); foreach (ExamsRow ex in join) { inter.IdB.Exams.AddExamsRow(ex); //agregalas a la tabla para salvarlas DB.QuestionsRow q = ex.QuestionsRow; IEnumerable <AnswersRow> answ = q.GetAnswersRows(); ///RANDOMIZE RAW ASWERS answ = Tools.RandomnizeStringsTimes(answ, times); //CREATE EXAM QUESTION CODE! AIDSTRING string code = CreateExamQuestionCode(ref answ); ex.AIDString = code; ExamsRow auxiliar = ex; MakeTableBytes(ref auxiliar, examsPath); } DB.TAM.ExamsTableAdapter.Update(inter.IdB.Exams); Application.DoEvents(); ExamsListRow ls = inter.IdB.AddExam(ref p); // Image img = Tools.CreateQRCode(ls.GUID, qrSizeDB); ls.QRCode = Tools.imageToByteArray(img); DB.TAM.ExamsListTableAdapter.Update(inter.IdB.ExamsList); Application.DoEvents(); //este orden es importante foreach (DB.ExamsRow re in join) { re.EID = ls.EID; //ahora asocia las preguntas a cada examen generado } DB.TAM.ExamsTableAdapter.Update(inter.IdB.Exams); Application.DoEvents(); return(ls); }
private static string[] ExtractAnswersArray(ref ExamsRow r) { string[] answers = r.AIDString.Split(SEP2); ///separates de correct value AID, from the array of answers AIDs return(answers); }
private static void MakeTableBytes <T>(ref T l, string examPath) { Type tipo = l.GetType(); byte[] arr2 = null; // string afile = string.Empty; if (tipo.Equals(typeof(ExamsListRow))) { ExamsListRow ls = l as ExamsListRow; IEnumerable <ExamsRow> rows = ls.GetExamsRows(); ExamsDataTable exdt = new ExamsDataTable(); foreach (var item in rows) { exdt.ImportRow(item); } // afile = ExasmPath + ls.EID.ToString(); arr2 = Tables.MakeDTBytes(ref exdt, examPath); ls.EData = arr2; } else if (tipo.Equals(typeof(ExamsRow))) { //SAVE COPY OF TABLE ExamsRow ex = l as ExamsRow; QuestionsRow q = ex.QuestionsRow; // afile = ExasmPath + ex.QID.ToString(); IEnumerable<DB.QuestionsRow> shortQlist = // new List<DB.QuestionsRow>(); ((IList<DB.QuestionsRow>)shortQlist).Add(ex.QuestionsRow); QuestionsDataTable qdt = new QuestionsDataTable(); qdt.ImportRow(q); byte[] qarray = Tables.MakeDTBytes(ref qdt, examPath); ex.QData = qarray; Dumb.FD(ref qdt); AnswersDataTable adt = new AnswersDataTable(); IEnumerable <AnswersRow> answ = q.GetAnswersRows(); foreach (var item in answ) { adt.ImportRow(item); } // afile = ExasmPath + ex.QueToString() + ".xml"; arr2 = Tables.MakeDTBytes(ref adt, examPath); ex.AData = arr2; Dumb.FD(ref adt); } else if (tipo.Equals(typeof(PreferencesRow))) { PreferencesRow p = l as PreferencesRow; //SAVE A COPY OF EXAMS LISTS IEnumerable <DB.ExamsListRow> rows = p.GetExamsListRows(); ExamsListDataTable dt = new ExamsListDataTable(); foreach (var item in rows) { dt.ImportRow(item); } // afile = ExasmPath + p.PID.ToString() + ".xml"; arr2 = Tables.MakeDTBytes(ref dt, examPath); p.ELData = arr2; Dumb.FD(ref dt); } }
private static string ExtractQuestionAndWeight(ref string questionWeight, ref string qidString, ref int pregunta, bool showPoints, double pointFactor, ref ExamsRow r) { string examen; QuestionsRow q = r.QuestionsRow; qidString += r.QID.ToString() + SEP.ToString(); Decimal askValue = Convert.ToDecimal(q.Weight * pointFactor); string weight = Decimal.Round(askValue, 3).ToString(); examen = pregunta.ToString() + "- " + q.Question; //pregunta if (showPoints) { examen += "\t( " + PUNTOS + ": " + weight + " )"; } examen += "\n"; pregunta++; //contador questionWeight += q.Weight.ToString() + SEP.ToString(); // save a string of questionsWeights return(examen); }
private static void ExtractKey(ref string Clave, ref int claveCount, string[] answers, ref ExamsRow r) { int AIDcorrecto = Convert.ToInt32(answers[1]); //toma la respuesta correcta answers = answers[0].Split(SEP); //the array of answers ID QuestionsRow q = r.QuestionsRow; int option2 = 0; IEnumerable <AnswersRow> answ2 = q.GetAnswersRows(); foreach (string s in answers) { char letra = Tools.Alpha[option2]; int aid = Convert.ToInt32(s); AnswersRow a = answ2.FirstOrDefault(o => o.AID == aid); //selectivamente en el mismo orden en que fue generada a.Char = letra.ToString().ToUpper().Trim(); if (a.AID == AIDcorrecto) { Clave += letra; } option2++; } if (claveCount == answers.Count()) { Clave += SEP.ToString(); claveCount = 0; } claveCount++; }