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

Program sprawdzający ile kół leży w pierwszej ćwiartce

Object Storage Arubacloud
+1 głos
290 wizyt
pytanie zadane 27 grudnia 2020 w C i C++ przez Beginner555 Obywatel (1,760 p.)

Cześć,

Chcę zrobić program, który pobiera z pliku tekstowego dane kół konkretnie promień r, współrzędna środka x i współrzędna środka y, program ma wypisać ile jest kół i ile kół leży w całości pierwszej ćwiartce. No i ogólnie prawie wszystko działa tylko mam problem z tym warunkiem sprawdzającym ile kół leży w pierwszej ćwiartce, robię to dwoma if (choć chyba można to zrobić w jednym, ale nie jestem pewien) pierwszy if sprawdza czy środek ma dodatnie współrzędne, drugi if sprawdza czy promień nie jest większy od którejś współrzędnej bo jak by był to koło nie leży w całości w pierwszej ćwiartce. No i problem jest taki że pokazuje ciągle ten sam wynik 1. Z góry dziękuję!smiley

#include<stdio.h>
#include<stdlib.h>

int main()
{
    FILE *fp;
    struct Kolo{
        double r, x, y;
    }Kolo;

    int licznik=0;

   if((fp=fopen("kolo.txt","r"))!=NULL){    
       while(fscanf(fp, "%f", &Kolo.r)>0){
           fscanf(fp, "%f",&Kolo.x);
           fscanf(fp, "%f",&Kolo.y);
           licznik++;
       }}
       fclose(fp);
   printf("Ilosc kol %d\n",licznik);

    struct Kolo *kol;
    kol=(struct Kolo*)malloc(licznik*sizeof(struct Kolo));
    int wynik=0;
    licznik =0;
    if((fp=fopen("kolo.txt", "r"))!=NULL){
        while(fscanf(fp, "%lf", &Kolo.r)>0){
            fscanf(fp, "%lf",&Kolo.x);
            fscanf(fp, "%lf",&Kolo.y);
            kol[licznik].r=Kolo.r;
            kol[licznik].x=Kolo.x;
            kol[licznik].y=Kolo.y;
            licznik++;
            if((kol[licznik].x>0) && (kol[licznik].y>0))
            {
              if((kol[licznik].r <= kol[licznik].x) && (kol[licznik].r <= kol[licznik].y))
              {
               wynik++;
              }
            }
        }
    }
    fclose(fp);
    printf("Kol w pierwszej cwiartce jest %d",wynik);
free(kol);
return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 27 grudnia 2020 przez Whiskey_Taster Pasjonat (15,610 p.)
wybrane 27 grudnia 2020 przez Beginner555
 
Najlepsza
Najprawdopodobniej błędem jest to, że zwiększasz wartość zmiennej licznik w linii nr 33, a następnie w kolejnych liniach masz odwołanie do kol[licznik]. Więc tak naprawdę sprawdzasz inne wartości. Tak więc przesuń inkrementację na koniec pętli i to powinno załatwić sprawę.
komentarz 27 grudnia 2020 przez Oscar Nałogowiec (29,290 p.)
Dwie pętle są niepotrzebne, tak samo tablica. Nie ma warunku, że trzeba pamiętać w jakimś celu parametry tych kół. Policzyć je i te z pierwszej ćwiartki można jednocześnie.
komentarz 27 grudnia 2020 przez Beginner555 Obywatel (1,760 p.)

Wielkie Dzięki smiley

Właśnie mam problemy z wykrywaniem takich drobnych błędów i tracę dużo czasu. Ale cóż na błędach człowiek się uczy.

komentarz 27 grudnia 2020 przez Oscar Nałogowiec (29,290 p.)
W sumie to kurs programowania powinien wyglądać tak, że po pierwszym programie typu "Hello, I am JanB" jest lekcja jak używać debuggera.
komentarz 28 grudnia 2020 przez Beginner555 Obywatel (1,760 p.)

@Oscar, Racja tylko w tym programie jeszcze był kod, którego tu nie ma który przepisuje parametry kół do innego pliku, ale to już szczegół.

komentarz 28 grudnia 2020 przez Beginner555 Obywatel (1,760 p.)
Używam takiego debuggera który pokazuje błędy które mogą być przy kompilacji.
+1 głos
odpowiedź 28 grudnia 2020 przez VBService Ekspert (253,120 p.)
edycja 28 grudnia 2020 przez VBService

Jak już @Oscar, napisał

Dwie pętle są niepotrzebne, tak samo tablica. Nie ma warunku, że trzeba pamiętać w jakimś celu parametry tych kół. Policzyć je i te z pierwszej ćwiartki można jednocześnie.

dodam jeszcze, można się "obejść" bez struktury Kolo, Moja propozycja zmian wink


#include <stdio.h>

int main()
{
    double x, y, r;
    int counter_circle = 0;
    int counter_circle_1st_qtr = 0;
    char *first_qtr;
    
    FILE *file_ = fopen("circles.txt", "r");
    
    printf("\n |  os x  |  os y  | promien | I cwiartka |\n");
    printf(" +--------+--------+---------+------------+\n");
    
    if (file_ != NULL) {
        while (fscanf(file_, "%lf,%lf,%lf", &x, &y, &r) > 0) {
            counter_circle++;
            
            if ((x>0 && y>0) && (r<=x && r<=y)) {
                counter_circle_1st_qtr++;
                first_qtr = "tak";
            } else {
                first_qtr = "nie";
            }
            
            printf("%2c %5.2lf %2c %5.2lf %2c %5.2lf %6c %s\n", 32, x, 32, y, 32, r, 32, first_qtr);
        }
        
        printf(" +--------+--------+---------+------------+\n");
        printf("%4cIlosc kol: %d\n%4cIlosc w I cwiartce: %d\n", 32, counter_circle, 32, counter_circle_1st_qtr);
    }
    
    fclose(file_);
    return 0;
}

circles.txt   x,y,r

2,-3,4
2,3,2
3,1,3
-2,-3,2
4,5,2

Podobne pytania

0 głosów
1 odpowiedź 2,280 wizyt
+1 głos
1 odpowiedź 564 wizyt
pytanie zadane 28 maja 2021 w C i C++ przez Domika Nowicjusz (200 p.)
–1 głos
1 odpowiedź 2,027 wizyt

92,556 zapytań

141,403 odpowiedzi

319,559 komentarzy

61,942 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!

...