Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Problem z 3 zadaniami


Wilczurzyca

Rekomendowane odpowiedzi

Opublikowano

Może i to głupie, ale proszę o pomoc w rozwiązaniu tych zadań najprostszymi metodami dla laika. 

Dam 4x dzienny limit plusów.

 

Zad. 3

Dany jest ciąg n liczb rzeczywistych. Napisz program obliczający ich sumę i średnią. Jak można poprawić czytelność interfejsu?.

 

Sugestia: aby nie wprowadzać danych z klawiatury (szczególnie dużej ilości danych), można skorzystać z generatora liczb losowych. Jest to funkcja rand(). 

 

Zad. 4

Dany jest ciąg liczb całkowitych zakończony zerem. Wypisz, ile liczb zaczyna się parzystą cyfrą, a ile nieparzystą.

(w tym zadaniu jeśli można prosiłabym o narysowanie schematu blokowego łącznie z kodem c++)

Zad. 5

Dany jest ciąg n-znaków. Napisz program zliczający ilość liczb całkowitych bez znaku.

Jaki byłby algorytm dla liczb całkowitych ze znakiem, a jaki dla liczb rzeczywistych.

 

Pozdrawiam :)

tlofbnowe2.jpg

Opublikowano

Prosisz o pomoc, czy o rozwiązanie? Jest to spora różnica. Jeśli o pomoc, to w czym masz problem?

Bardziej o rozwiązanie, przynajmniej zadania 4.

 

To zadanie 3, ale nie wiem czy jest dobrze...

#include <iostream> 
#include <stdlib.h> 
#include <conio.h>
using namespace std;
main()
{
int n,suma;
 
cout<<"Podaj dowolna liczbe n"<<endl;
cin>>n;
for (int i;i<n;i++)
{ int a = rand();
suma=suma+a;
cout<<a<<endl;
cout<<suma\n;
}
 
        getch();
        return 0;
}

tlofbnowe2.jpg

Opublikowano

Nie do końca dobrze, bo

1. Średnia raczej powinna być jakiegoś typu zmiennoprzecinkowego, a przy takim dzieleniu dostaniesz int.

2. nie inicjalizujesz zmiennej i, więc nie masz gwarancji, że będzie ona równa zero

3. statystycznie dla n > RAND_MAX/2 (~131072 = 2^17 = 2^31 / 2^14 (czyli RAND_MAX/2))będziesz miał overflow, nie wiem jaki zakres możesz mieć tego n

Opublikowano

zamiast cout<<suma/n wpisz cout<<(float)(suma/n)

jest to rzutowanie na typ float, jesli bedziesz miec np liczby 2 i 7 to srednia u ciebie bedzie 4, a po dodaniu rzutowania bedzie 4.5, czyli prawidlowa.

dodaj #include <ctime>, w main, na gorze, dodaj linijke

srand(time(null));

to ci zainicjalizuje generator liczb losowych i mozesz uzywac rand() wtedy

Opublikowano
zamiast cout<<suma/n wpisz cout<<(float)(suma/n)

 

suma/n dalej daje inta. Trzeba zrobić tak

cout<< ((float)suma)/n

 

srand(time(null));

 

null nie jest w standardzie (nie musi być go w implementacji)

jest NULL i nullptr

Opublikowano

pseudolosowych* :) I warto pamiętać o tym: http://www.cplusplus.com/reference/cstdlib/RAND_MAX/

oj tam, dla poziomu wtajemniczenia opa sa losowe, i tego sie trzeba trzymac

 

 

suma/n dalej daje inta. Trzeba zrobić tak

cout<< ((float)suma)/n

 

null nie jest w standardzie (nie musi być go w implementacji)

jest NULL i nullptr

float - my fault

a co do nulla - srand(time(0)); - better? btw nie spotkalem sie nigdy z problemem zeby kompilator nie weidzial co to null

 

co do 4 zadania - zrob tak  - bedzie chyba najlatwiej

#include <iostream>
using namespace std;
 
int main()
{
   string in;
  int licznikp = 0, liczniknp = 0;
   while(cin>>in)
{
if(in[0] == '0')
{
cout<<"NIEPARZYSTE: "<<liczniknp<<endl<<"PARZYSTE: "<<licznikp;
return 0;
}
if((int)(in[0]-'0')%2==0)
{
licznikp++;
} 
else liczniknp++;
}
return 0;
}

http://ideone.com/cz2bHY - dowod ze dziala

 

schemat blokowy - narysuj sama, opis:

1. utworz zmienne licznikP, licznikNP rowne zero, jeden string in

2. wczytaj do in

3. jesli in[0] = '0' to wypisz oba liczniki i wyjdz z programu

4. jesli nie, no to sprawdz czy in[0]-'0' %2 == 0 (objasnienie: in[0] - pierwsza cyfra liczby wczytanej, -'0' odejmuje od kodu liczby kod liczby '0', wiec daje nam ta liczbe, modulo chyba znasz)

5. jesli tak, to dodaj do licznikP 1

6. jesli nie to dodaj 1 do licznikNP

7. wroc do kroku 2

 

@SylverWolf

Opublikowano

A może być to tak rozwiązane?

 

 

#include <iostream>
#include <conio.h>
 
using namespace std;
 
 
main()
 
{ int parzyste,nieparzyste,liczba,reszta;
parzyste=0;
nieparzyste=0;
cout<<"Program liczy ilosc liczb parzystych i nieparzystych podanych przez uzytkownika";
cout<<endl;
cout<<"Podaj liczbe, gdy wpiszesz '0' program zakonczy zliczanie liczb";
cout<<endl;
cin>>liczba;
while(liczba!=0)
{
reszta=0;
if(liczba<0)liczba=-liczba;
while(liczba>9)
{
liczba=liczba/10;
}
if(liczba!=0)reszta=liczba%2;
if(reszta==1)parzyste=parzyste+1;
else nieparzyste=nieparzyste+1;
cin>>liczba;
}
cout<<endl;
cout<<"Ilosc liczb, ktorych pierwsze cyfry sa parzyste wynosi ";
cout<<parzyste<<endl;
cout<<"Ilosc liczb, ktorych pierwsze cyfry sa nieparzyste wynosi ";
cout<<nieparzyste<<endl;
 
getch();
return 0;
}

tlofbnowe2.jpg

Opublikowano

Hmmm @Sopelek997

 

 

#include <iostream>
using namespace std;
 
int main()
{
   string in;
  int licznikp = 0, liczniknp = 0;
   while(cin>>in)
{
if(in[0] == '0')
{
cout<<"NIEPARZYSTE: "<<liczniknp<<endl<<"PARZYSTE: "<<licznikp;
return 0;
}
if((int)(in[0]-'0')%2==0)
{
licznikp++;
} 
else liczniknp++;
}
return 0;
}

 

Czemu się nie czepiasz c-style castów? :(

 

@blowfish

http://en.wikibooks.org/wiki/C++_Programming/Programming_Languages/C++/Code/Statements/Variables/Type_Casting

Nie pomagam na PW, od tego macie forum!!!

 

#PHP-things

 

 

08FMpDu.png

 

Opublikowano

@Vesim

Miałem się poczepiać wcześniej, ale nie miałem chęci.

Ale jak prosisz.

1. Dziwne wypisywanie wyniku w pętli a potem return, to powinno być poza nią

2. Wspomniany niepotrzebny dziwny cast

3. endl, kiedy nie jest potrzebny

Ja bym to zrobił tak.

#include <iostream>
#include <limits>

using namespace std;

int main()
{
    char pierwszaCyfra;
    int nieparzyste = 0;
    int liczbaLiczb = 0;
    while(cin >> pierwszaCyfra)
    {
        if(pierwszaCyfra == '0') break;
        nieparzyste += pierwszaCyfra%2;
        ++liczbaLiczb;
        cin.ignore(numeric_limits<streamsize>::max(), ' ');
    }
    cout << "Patrzyste:   " << liczbaLiczb-nieparzyste << '\n'
         << "Nieparzyste: " << nieparzyste;
    return 0;
}

A propos c-style castów.

Jeśli chodzi o konwersje typów wbudowanych to IMO nie ma w tym nic złego, bo są czytelniejsze, krótsze i łatwiej się je pisze. (przynajmniej zamiast static_cast<>())

Opublikowano

@Vesim

słusznie

Tylko to log10 i pow to troche overkill.

Wystarczy wczytać znak i sprawdzić czy jest minusem, jak jest to wczytać po prostu ponownie.

Opublikowano

@Sopelek997

czemu to wypisywanie wyniku jest dziwne? standard

czemu endl gdy nie jest potrzebny? jaka roznice ci zrobi "\n" a endl na jednej linijce? zadna

+ moje sprawdzanie nie zawiera znaku, ale wystarczy dodac jedneo ifa, a to od @Vesim dla np 9999999999999999 nie zadziala + jesli sie tak czepiamy powinno byc while(scanf(costam...)!=-1) + OLABOGA SCANF I PRINTF W C++, PRZECIEZ W C++ MASZ COUTY, SA PO TO ZEBY ICH UZYWAC(tak wszyscy plakali na SO gdy dalem kod do oceny przejrzystosci) + zadanid ze znakami liczb to 5, a ty zrobiles 4 przystosowane pod ujemne liczby xD + kod vesima wypisuje zly wynik - 8 parzystych 12 nieparzystych, podczas gdy tam jest 10 parzystych i 10 nieparzystych - zaorane xD

Opublikowano
czemu to wypisywanie wyniku jest dziwne? standard

 

Bo jest w dziwnym miejscu.

 

Co do reszty się zgadzam.

tylko jest nie 10/10 tylko 9/11

i rzeczywiście nie ma wspomnienia o tym, że są tylko dodatnie

 

Poprawiony mój kod

#include <iostream>
#include <limits>

using namespace std;

int main()
{
    char pierwszaCyfra;
    int nieparzyste = 0;
    int liczbaLiczb = 0;
    while(cin >> pierwszaCyfra)
    {
        if(pierwszaCyfra == '0') break;
	if(pierwszaCyfra == '-') cin >> pierwszaCyfra;
        nieparzyste += pierwszaCyfra%2;
        ++liczbaLiczb;
        cin.ignore(numeric_limits<streamsize>::max(), ' ');
    }
    cout << "Patrzyste:   " << liczbaLiczb-nieparzyste << '\n'
         << "Nieparzyste: " << nieparzyste;
    return 0;
}
Opublikowano

@blowfish czytanie ze zrozumieniem się kłania: "Dany jest ciąg liczb całkowitych zakończony zerem. Wypisz, ile liczb zaczyna się parzystą cyfrą, a ile nieparzystą". I jak chcesz 9999999999999999 zmieścić w int? O_o Co do EOF(-1), nie widzę problemu, w tym przypadku 0 działa dobrze :)

Nie pomagam na PW, od tego macie forum!!!

 

#PHP-things

 

 

08FMpDu.png

 

Opublikowano

@Vesim
i o to chodzi, zeby uwalic takie ubogie rozwiazania - nie masz max i min liczb zeby przypuszczac ze sie zmieszcza w int- wejscia sa 50 razy wieksze od unsigned long long i co zrobisz, nic nie zrobisz, dostaniesz 20% za zadanie xD stringiem obsluzysz zalozmy liczby do miliona cyfr, na int gdy podam 95582763456245347654 wyjdzie syf - nie mozesz myslec schematowo - mam cos z liczba, hohoh wczytam do inta - dziesiatki razy juz sie spotkalem z zadaniami typu "policz sume cyfr liczby, ktorych pozycje sa kolejnymi liczbami pierwszymi", czy innymi glupotami, i jak sie okazywalo, liczby mialy po 5tys cyfr, a inty to bylo 20-30% max xD + ja kiedys mialem problem z while(scanf()), i doczytalme, ze !=-1 jest najbezpieczniejsza metoda, jak znajde jakis stary kod to ci pokaze dokladnie

Opublikowano

 

Bo jest w dziwnym miejscu.

 

Co do reszty się zgadzam.

tylko jest nie 10/10 tylko 9/11

i rzeczywiście nie ma wspomnienia o tym, że są tylko dodatnie

 

Poprawiony mój kod

#include <iostream>
#include <limits>

using namespace std;

int main()
{
    char pierwszaCyfra;
    int nieparzyste = 0;
    int liczbaLiczb = 0;
    while(cin >> pierwszaCyfra)
    {
        if(pierwszaCyfra == '0') break;
	if(pierwszaCyfra == '-') cin >> pierwszaCyfra;
        nieparzyste += pierwszaCyfra%2;
        ++liczbaLiczb;
        cin.ignore(numeric_limits<streamsize>::max(), ' ');
    }
    cout << "Patrzyste:   " << liczbaLiczb-nieparzyste << '\n'
         << "Nieparzyste: " << nieparzyste;
    return 0;
}

jak 9/11? mi wyszło parzystych: 8, nieparzystych: 12

#include <iostream>
using namespace std;


int main()
{
    string liczba;
    int nieparzyste =0;
    int wszystkie = 0;
    while(cin >> liczba)
    {
        if(liczba != "0")
        {
            if(liczba[0] == '-')
                liczba[0] = liczba[1];
            if(liczba[0] % 2 != 0)
                nieparzyste+=1;
        }
        else break;

        ++wszystkie;
    }
    cout << "Parzyste: " << wszystkie - nieparzyste << endl;
    cout << "Nieparzyste: " << nieparzyste << endl;
}
 

na czerwono te co sie zaczynaja na nieparzyste:

 

-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 1 2 3 4 5 6 7 8 9 10 0

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...