Why isn’t this program running the commands inside the second function on?

Asked

Viewed 63 times

0

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EX7
{
    class Program
    {
        static void Main(string[] args)
        {
            /* 7.Criar um algoritmo que possa armazenar nome, duas notas e a média de 50
            alunos.A média será calculada segundo o critério: peso 3 para a primeira
            nota e peso 7 para a segunda.A impressão deverá conter nome, duas notas
            e a média.
            ESCOLA VIVA
            1.Cadastra nomes
            2.Cadastrar 1a nota
            3.Cadastrar 2a nota     
            4.Calcular média
            5.Lista no monitor
            6.Sair
            OPÇÃO: */

            float med;
            int choice, alns, cod, codmed;
            string[] alunos = new string[50];
            string[] cpf = new string[50];
            float[] nota1 = new float[50];
            float[] nota2 = new float[50];
            menu();


            void menu()
            {
                Console.WriteLine("ESCOLA VIVA");
                Console.WriteLine("1.Cadastrar nomes");
                Console.WriteLine("2.Cadastrar 1a nota");
                Console.WriteLine("3.Cadastrar 2a nota");
                Console.WriteLine("4.Calcular média");
                Console.WriteLine("5.Lista no monitor");
                Console.WriteLine("6 - Sair");

                choice = int.Parse(Console.ReadLine());


                if (choice != 6)
                {
                    switch (choice)
                    {
                        case 1:
                            Console.Clear();
                            cad();

                            break;

                        case 2:
                            Console.Clear();
                            cad1nota();
                            break;

                        case 3:
                            Console.Clear();
                            cad2nota();
                            break;

                        case 4:
                            Console.Clear();
                            calcmedia();
                            break;

                        case 5:
                            Console.Clear();
                            list();
                            break;

                        default:
                            Console.Clear();
                            Console.WriteLine("--------------------------------");
                            Console.WriteLine("---------Opção Inválida!--------");
                            Console.WriteLine("--------------------------------");
                            menu();
                            break;
                    }
                }
            }
            void cad()
            {
                Console.WriteLine("--------------- Cadastro de Alunos ---------------");
                Console.WriteLine("Digite quantos alunos deseja cadastrar (máx 50): ");
                alns = int.Parse(Console.ReadLine());
                for (int i = 0; i < alns; i++)
                {
                    Console.WriteLine("Digite o nome do aluno: ");
                    alunos[i] = Console.ReadLine();
                    Console.WriteLine("Digite o cpf do aluno: ");
                    cpf[i] = Console.ReadLine();
                    Console.WriteLine("\n O códido de cadastro do aluno " + alunos[i] + " é: " + i + " \n");
                }

                menu();


            }

            void cad1nota()
            {
                Console.WriteLine("--------------- Cadastro da 1a Nota ----------------");
                Console.WriteLine("Digite o codigo do aluno que deseja cadastrar nota:");
                cod = int.Parse(Console.ReadLine());
                Console.Clear();
                Console.WriteLine("Digite a 1a nota do aluno "+alunos[cod]);
                nota1[cod] = float.Parse(Console.ReadLine());

                Console.Clear();
                menu();




            }

            void cad2nota()
            {

                Console.WriteLine("--------------- Cadastro da 2a Nota ----------------");
                Console.WriteLine("Digite o codigo do aluno que deseja cadastrar nota:");
                cod = int.Parse(Console.ReadLine());
                Console.Clear();
                Console.WriteLine("Digite a 2a nota do aluno " + alunos[cod]);
                nota2[cod] = float.Parse(Console.ReadLine());

                menu();
            }
            void calcmedia()
            {
                Console.WriteLine("--------------- Calculo da Media de Notas ----------------");
                Console.WriteLine("Digite o codigo do aluno que deseja calcular média:");
                codmed = int.Parse(Console.ReadLine());
                med = ( nota1[codmed] + nota2[codmed] ) / 2;
                Console.WriteLine("a media é" + med);
            }
            void list()
            {

            }


            Console.WriteLine("Pressione ENTER para sair...");
            Console.Read();
        }
    }
}
  • For example in the function where 1note it runs only when it calls the menu function again it to

1 answer

2


There are a huge amount of errors in the code, apart from the disorganization. I won’t fix them all. Simplifying and modernizing:

using static System.Console;

namespace EX7 {
    class Program {
        static string[] alunos = new string[50];
        static string[] cpf = new string[50];
        static float[] nota1 = new float[50];
        static float[] nota2 = new float[50];
        static void Main() {
            while (true) {
                WriteLine("ESCOLA VIVA");
                WriteLine("1.Cadastrar nomes");
                WriteLine("2.Cadastrar 1a nota");
                WriteLine("3.Cadastrar 2a nota");
                WriteLine("4.Calcular média");
                WriteLine("5.Lista no monitor");
                WriteLine("6 - Sair");
                int choice = int.Parse(ReadLine());
                Clear();
                if (choice == 6) return;
                switch (choice) {
                    case 1:
                        Aluno();
                        break;
                    case 2:
                        Nota1();
                        break;
                    case 3:
                        Nota2();
                        break;
                    case 4:
                        CalculaMedia();
                        break;
                    case 5:
                        Listagem();
                        break;
                    default:
                        WriteLine("--------------------------------");
                        WriteLine("---------Opção Inválida!--------");
                        WriteLine("--------------------------------");
                        break;
                }
            }
        }
        static void Aluno() {
            WriteLine("--------------- Cadastro de Alunos ---------------");
            WriteLine("Digite quantos alunos deseja cadastrar (máx 50): ");
            if (!int.TryParse(ReadLine(), out var quantidade) && quantidade <= 50) {
                WriteLine("Quantidade inválida");
                return;
            }
            for (int i = 0; i < quantidade; i++) {
                WriteLine("Digite o nome do aluno: ");
                alunos[i] = ReadLine();
                WriteLine("Digite o cpf do aluno: ");
                cpf[i] = ReadLine();
                WriteLine("\n O códido de cadastro do aluno " + alunos[i] + " é: " + i + " \n");
            }
        }
        static void Nota1() {
            WriteLine("--------------- Cadastro da 1a Nota ----------------");
            WriteLine("Digite o codigo do aluno que deseja cadastrar nota:");
            if (!int.TryParse(ReadLine(), out var codigo)) {
                WriteLine("Código inválido");
                return;
            }
            WriteLine("Digite a 1a nota do aluno " + alunos[codigo]);
            if (!float.TryParse(ReadLine(), out var nota)) {
                WriteLine("Código inválido");
                return;
            }
            nota1[codigo] = nota;
        }
        static void Nota2() {
            WriteLine("--------------- Cadastro da 2a Nota ----------------");
            WriteLine("Digite o codigo do aluno que deseja cadastrar nota:");
            if (!int.TryParse(ReadLine(), out var codigo)) {
                WriteLine("Código inválido");
                return;
            }
            WriteLine("Digite a 2a nota do aluno " + alunos[codigo]);
            if (!float.TryParse(ReadLine(), out var nota)) {
                WriteLine("Código inválido");
                return;
            }
            nota2[codigo] = nota;
        }
        static void CalculaMedia() {
            WriteLine("--------------- Calculo da Media de Notas ----------------");
            WriteLine("Digite o codigo do aluno que deseja calcular média:");
            if (!int.TryParse(ReadLine(), out var codigo)) {
                WriteLine("Código inválido");
                return;
            }
            WriteLine("a media é" + (nota1[codigo] + nota2[codigo]) / 2);
        }
        static void Listagem() {}
    }
}

Behold working in the ideone. And in the .NET Fiddle. Also put on the Github for future reference.

You can’t be sure of everything the way you wanted it, but come on:

  • I passed the variables that are used in all methods to the object that seems to me to be most suitable to do it for this exercise. This would hardly be so in real code, even the most correct is to create a class for the student containing all information and then have only one array. Note that I put everything static so it can be accessed by static methods.
  • I made all methods static, after all if you call a method directly within a static method it needs to be static as well, as a matter of life time (research more on the subject right here).
  • I put a loop to repeat the menu. The way I was doing I was going to make a single noodle and burst the execution stack. You can’t keep calling methods like this from one to the other without terminating the execution, it all hangs up and becomes a single mess.
  • I simplified the output when the output option is typed, if it is to exit then leave soon.
  • Repetitive code Clear() you isolate and use only once.
  • I put more meaningful names and within the nomenclature of the C#.
  • I think the average calculation should be stored in a array too, but I left this for you.
  • Do not use Parse(), prefer TryParse() that does not break the request if the conversion fails.
  • I validated to not allow a number greater than or equal to 50.
  • The whole concept is wrong, but anyway, it’s improved.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.