• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie z LNU Ćwiczenie: parking 2

Object Storage Arubacloud
0 głosów
915 wizyt
pytanie zadane 29 maja 2021 w C i C++ przez VesoMa Nowicjusz (120 p.)

Zadanie:
ten sam system parkingowy, który wyposażyłeś kilka lekcji wcześniej w funkcję zliczającą wjeżdżające i wyjeżdżające samochody oraz ilość wolnych miejsc, posiada zabezpieczenie na wypadek przekłamań we wskazaniach fotokomórek. Na podstawie dalmierzy zamontowanych nad każdym miejscem parkingowym system sprawdza czy na danym miejscu jest zaparkowany samochód. 
Dalmierze zainstalowane są pod sufitem parkingu i mierzą odległość do najbliższej przeszkody pionowo w dół. Aby odczytać dane z dalmierzy należy użyć zawartej w API systemu funkcji int get_range(int floor, int place), która zwraca odczyt odległości do nabliższej przeszkody. Parametr floor jest numerem piętra, natomiast paramter place jest numerem miejsca parkingowego na danym piętrze. Parking jest trzypoziomowy. Na pierwszym i na drugim piętrze znajduje się po 125 miejsc parkingowych, na trzecim piętrze znajduje się 80 miejsc parkingowych. Miejsca są liczone od numeru 1.
Odległość od dalmierza do podłogi wynosi 280 cm, przy czym producent podaje, że czujnik działa z tolerancją 10 cm (czyli jego wskazania mogą różnić się do 10 cm od stanu faktycznego). 
Uzupełnij funkcję count_free w taki sposób, aby obliczyła ilość wolnych miejsc parkingowych na podstawie wskazań wszystkich dalmierzy i zwróciła tę wartość. 

 

Moj kod:

#include "parking.h"

int count_free()
{
    int x = 1,y = 1,n = 0;
    if(x == 1 || x == 2)
    {
        if(y <= 125)
        {
            if(get_range(x,y) < 270)
            {
                n++;
                y++;    
                count_free();
            }
        }
        else
        x++;
        count_free();
    }
    else if(x == 3)
    {
        if(y <= 80)
        {
            if(get_range(x,y) < 270)
            {
                n++;
                y++;    
                count_free();
            }
        }
        else
        return n;
    }
    
    return n;
}

plik parking.h:

#ifndef PARKING_API_H
#define PARKING_API_H

// get_range: Funkcja zwraca odległość w [cm] między dalmierzem a przeszkodą
// Argumenty:
//      floor: numer piętra
//      place: numer miejsca parkingowego
// return:
//      int: zwraca ilość cm od przeszkody
// error:
//      w przypadku błędu pomiaru funkcja zwraca wartość -1
int get_range( int floor, int place );
#endif // PARKING_API_H

Problem:
po skompilowaniu mam błąd "Nieprawidłowe zakończenie programu - kod = 255"
Proszę o sugestie jak zrobić to zadanie. Nie skorzystałem z iteracji for, ponieważ nie wiem jak.

Podpowiedz z zadania:
Wartość, którą zwraca funkcja get_range(x, y) świadczy o tym, czy na piętrze x na miejscu parkingowym o numerze y zaparkowany jest samochód. Jeżeli wartość tej funkcji jest mniejsza niż 270, oznacza to, że miejsce jest zajęte. Skorzystaj z licznika zainicjowanego w pętli for w wywołaniu funkcji get_range w instrukcji sprawdzającej status miejsc. 

1
komentarz 29 maja 2021 przez Oscar Nałogowiec (29,320 p.)
edycja 29 maja 2021 przez Oscar

Wydaje mi się że masz nieskończoną rekurencję (count_free() woła samą siebie) i stąd błąd wykonania po zapełnieniu stosu.

Funkcja jest bezparametrowa i działa tylko na zmiennych lokalnych, więc za każdym razem wykonuje się tak samo. Jak się uprzeć to daje się to zrobić rekurencyjnie, tylko musisz przekazać jakieś parametry i sumować wyniki. Jednak prościej (i co ważniejsze znacznie czytelniej) jest zrobić te pętle.

 

1 odpowiedź

0 głosów
odpowiedź 31 maja 2021 przez TOM_CPP Pasjonat (22,640 p.)

Jak było napisane w podpowiedzi - użyj pętli for.

C++17

#include <iostream>
#include <map>

using namespace std;

const map<int,int> ranges { {1,125},{2,125},{3,80} };

int get_range( int floor, int place )
{
    // random result, possible return -1
    return rand()%280-1;
}

int count_free()
{
    int occupied {0};
    for( const auto [floor,places] : ranges )
    {
        for( int i {1} ; i<places+1 ; ++i )
        {
             auto measure = get_range(floor,i);
             if( measure<270 && measure != -1 ) ++occupied;
        }
    }
    return occupied;
}

int main()
{
    cout << count_free() << endl;
}

 

komentarz 23 marca 2022 przez loozi Nowicjusz (100 p.)

Czy można prosić o wersję dla starszego C++? 

Mój kod poniżej, nie przechodzi testów:

#include <parking.h>
int count_free()
{
    int occupied=0;
    int i,j,k,l,zmierzone=0;
    for(i=1; i<=3; i++)
    {
        if  (i==1)
            {
            for (j=1; j<=125; j++)
            {
                zmierzone=get_range(i,j);
                if( zmierzone<270) 
                {
                occupied++;
                }
            }
        }
        if  (i==2)
            {
            for (k=1; k<=125; k++)
            {
                zmierzone=get_range(i,k);
                if( zmierzone<270) 
                {
                occupied++;
                }
            }
        }
        if (i==3)
            {
            for (l=1; l<=80; l++)
            {
                zmierzone=get_range(i,l);
                if( zmierzone<270) 
                {
                occupied++;
                }
            }
    
        }
    }
    return occupied;
}

A tak wygląda to po teście:


 

FAILEDcount_free() { return 313; } == 14

FAILEDcount_free() { return 317; } == 10

FAILEDcount_free() { return 313; } == 14

FAILEDcount_free() { return 314; } == 14

FAILEDcount_free() { return 315; } == 14

komentarz 23 marca 2022 przez loozi Nowicjusz (100 p.)
Ok już sam sobie rozkminiłem. Jakiś mistrz układający tą podpowiedź wprowadza w błąd. Jak sprawdzałem warunek zmierzone<270 to nie działało, po zmianie warunku na zmierzone>270 działa git i mój kod przechodzi testy. Czuwaj!
komentarz 24 marca 2022 przez Oscar Nałogowiec (29,320 p.)
Bo funkcja miała liczyć miejsca wolne, a nie zajęte.

Podobne pytania

0 głosów
1 odpowiedź 557 wizyt
pytanie zadane 4 maja 2023 w C i C++ przez meyuil Nowicjusz (150 p.)
+1 głos
1 odpowiedź 929 wizyt
pytanie zadane 23 czerwca 2022 w SQL, bazy danych przez Vladyslav Yavorskyi Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 563 wizyt
pytanie zadane 14 kwietnia 2022 w Python przez mewtwo Użytkownik (830 p.)

92,620 zapytań

141,474 odpowiedzi

319,813 komentarzy

62,004 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...