1 / 12
Nov 2015

Co jest w tym kodzie nie tak? Dopiero zaczynam uczyć się C# i pewnie to jakiś głupi błąd confused


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

namespace Kalkulator
{
class Program
{

    static void Main(string[] args)
    {
        int N = int.Parse(Console.ReadLine());
         string wyrazenie;
        for (int i = 0; i < N; i++)
        {

            wyrazenie = Console.ReadLine();
            int suma = wyrazenie[0]- 48;

            for (int j = 2; j<wyrazenie.Length; j+=2)
            {
                if (wyrazenie[j - 1] == '+')
                {

                    suma += wyrazenie[j] - 48;
                }
                else if (wyrazenie[j - 1] == '-')
                {  

                    suma -= wyrazenie[j] - 48;
                }
            }
            Console.WriteLine(suma);
            Console.Read();

        }


    }
}

}

  • created

    Nov '15
  • last reply

    Mar '23
  • 11

    replies

  • 907

    views

  • 6

    users

  • 2

    likes

  • 3

    links

Odpal swój kod dla zestawu, który zawiera kilka linijek danych testowych (ale innego niż przykładowy zestaw z zadania. Ten pechowo działa, pomimo błędnego kodu).
Np.
2
1+1
1+1

To będzie jakiś problem ze znakiem enter? Nie wiem jak temu zaradzić.

Wywal tą linijkę i będzie dobrze, spoj nie toleruje takiego "zatrzymywania konsoli" więc będziesz musiał zmienić sposób testowania albo pamiętać o jej usuwaniu. W IDE powinieneś mieć opcję pozostawienia widocznej konsoli, możesz też skorzystać z http://ideone.com3.

ps jak już ci ruszy to usuń kod z forum.

To na pewno wina zatrzymywania konsoli? Bez tej linijki przez ułamek sekundy widziałem,że wyniki miałem prawidłowe. Z nią się nie zgadzały - wychodziły jakieś ujemne liczby. Ktoś powie co było nie tak ? Jak w takim razie zatrzymywać okno konsoli i jaki miał oto wpływ na wynik?

Co prawda nie znam C#, ale po usunięciu tej linijki dostałem AC (a wiem że spoj ze względu na sprawdzanie maszynowe czegoś takiego nie toleruje).

Co do "pozostawiania" konsoli, to zależy od twojego IDE, mi np w code::blocks "sama z siebie" czeka aż wcisnę enter

7 years later

Program zle oblicza.
W ideone przekopiuj test z tresci zadania do okienka stdin.
Ideone sluzy do testowania. Prawda?

Nie pomogłeś mi za bardzo. Wiem, że program źle oblicza, w przeciwnym wypadku dostałbym AC. Mój program zaczyna się psuć dla wielu zestawów danych. Dla jednego zestawu podaje dobre wyniki.
Myślę, że może być problem z enterem, ale nie jestem do końca przekonany. W jaki sposób zerwać pętlę po naciśnięciu enter tak aby suma została wypisana na ekran ?

Twój program nie działa nawet dla zestawu wejściowego: https://ideone.com/hJqeU45
Podejrzewam, że problemem jest wczytywanie danych. Mieszanie wczytywanie int’ów i char’ów nigdy nie kończy się dobrze.
Najlepiej najpierw wczytaj liczbę testów
cin >> n
a potem cały wyrażenie wczytaj do string’a lub tablicy.
Potem odpal swój algorytm dla tak zapisanego działania

Myślę, że może być problem z enterem, ale nie jestem do końca przekonany. W jaki sposób zerwać pętlę po naciśnięciu enter tak aby suma została wypisana na ekran ?

int n;
cin >> n;
while (n--) {
	int suma = 0, liczba;
	char znak;
	cin >> suma;
	while (cin >> znak >> liczba) {
		/* ... */

		if (cin.peek() == '\n')
			break;
	}
	cout << suma << "\n"; 
}

Funkcja peek zwraca kolejny znak znajdujący w strumieniu. Jeżeli będzie nim znak nowej linii to przerywamy pętlę (break). Analogicznie można podpiąć wszystko do wyrażenia warunkowego pętli:

while (cin.peek() != '\n' and cin >> znak >> liczba) {