Kilka największych liczb z ciągu, sprawdzanie wartości tablicy, układ współrzędnych

0

Witam. Jestem bardzo początkującym programistą i potrzebuję pomocy z kilkoma zadankami.

user image

Mój program:

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int main()
{
    srand(time(0));
    int n;
    int k;
    cin>>n;
    cin>>k;
    if (k<n && 5<=n<=50000)
 {const int max=n;
    int tab[max];
        for (int i=0; i<max; i++)
    {int tab [i];
        tab[i]=rand()%2000-1000;
        cout<<tab[i]<<" ";
    }
int swp;
      for (int i=1;i<max;i++)
    {
      for (int j=max-1;j>=i;j--)
       if (tab[j]<tab[j-1])
         {
            swp=tab[j];
            tab[j]=tab[j-1];
            tab[j-1]=swp;
          }
     }
for (int i=0;i<max;i++)
 {cout<<tab[i]<<" ";}
}
    else
 {system("pause");}
}

I teraz tak, jak mam wprowadzić tą zmienną k w dalszej części zadania, aby po sortowaniu bąbelkowym wyświetliło się k największych liczb?

user image

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
    srand(time(0));
    int N;
    cin>>N;
    if (1<=N<=1000000)
    {
for (int i=0; i<N; i++)
{
    int tab[i];
    tab[i]=rand()%2;

      int c;
      c=0;
    for (int j=0; j<=i; j++)
{if (tab[i]==0)
    {c++;}
}
cout<<c;
    }
    }
    else
    {
        system("pause");
    }
}

W którym miejscu w tym programie jest błąd, bo wychodzą złe wyniki, a sam nie mogę nic znaleźć?

user image

No i z tym prawie wcale sobie nie poradziłem. Wstawiam to, co na razie napisałem, ale to nawet nie chce ruszyć i nie wiedziałem za bardzo jak zabrać się za sprawdzanie, czy ten romb może powstać.

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
    srand(time(0));
    int N;
    cin>>N;
if (0<N<1000)


    for (i=0; i<N; i++)
    {
        for (int j=0; j<8; i++)
        {
            int tab[j];
            tab[j]=rand()%20000-10000;
            cout<<tab[j]<<" ";

if (j=8)
{ int x;
int y;
int z;
int w;
    x=tab[0]-tab[2];
    y=tab[4]-tab[6];
    z=tab[1]-tab[3];
    w=tab[5]-tab[7];
  if (x==y && z==w)
  {
      cout<<"TAK";
  }
  else
  {
      cout<<"NIE";
  }
}
else
{
    return (0);
}

        }
}
        system("pause");
}
else
    {
        system("pause");
    }
}
0

Ad A. jeżeli posortowałeś malejąco to wyświetl pierwszych K liczb i po sprawie. Z tym że nie wyrobisz się w czasie, użyj partycjonowania. Poza tym masz nie losować tylko wczytać.
Ad F. nic dziwnego ponieważ losujesz dane zamiast je wczytać.
Ad G. to samo - masz wczytać.

0

Tragiczne wcięcia. Nie zaczynaj instrukcji w tej linijce, gdzie jest klamra otwierająca. I wyrównaj klamry w pionie.

for (int i=0;i<max;i++)

wypisz K liczb zamiast max liczb

  1. Masz wczytać te liczby, a nie wygenerować losowe. I algorytm jest błędny, bo liczy zera (w dodatku w pętli -> dodatkowy bug). A co jeśli jedynek jest mniej?

  2. Znowu generujesz losowe zamiast wczytać. No i definicja rombu się przyda.

0

Faktycznie, tak przyzwyczaiłem się to losowania, że i teraz wszędzie dałem rand zamiast przeczytać dokładnie zadanie. Zmieniłem wszędzie z losowania na wczytywanie, ale nadal nie za bardzo ogarniam.

A - Coś jest nie tak w sortowaniu i nie wiem co. Wychodzi ogólnie źle. Dodatkowo totalnie nie mam pojęcia, jak wyświetlić to k największych liczb, jak to zapisać w C++.
F - Nadal podaje błędnie wyniki.
G - Tam wyżej były źle zrobione klamry, ale nawet po poprawieniu ich coś nie jest ok, oprócz tego sprawdzania. No i dobra, rozumiem już, że to trzeba obliczać tak, że np. pierwiastek z (c-a)²+(d-b)², ale jak zapisać coś takiego w c++?

0

A. Posortuj malejąco, to potem wystarczy

for (int i = 0; i < K; ++i)
    cout << tab[i] <<" ";

F. Bo masz błędny algorytm. Masz liczyć zera i jedynki osobno i zwrócić mniejszą liczbę.

G. http://www.cplusplus.com/reference/cmath/sqrt/?kw=sqrt

0

Zadanie pierwsze lepiej zrealizować sortowaniem przez zliczanie ponieważ zakres liczb jest niewielki.

0

Zadanie A ciągle ma błędy, nie mam pojęcia co zrobić :/

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int main()
{
    srand(time(0));
    int N;
    int K;
    cin>>N;
    cin>>K;
    if (K<N && 5<=N<=50000)
 {
     for (int i=0; i<N; i++)

         {
         int tab[i];
         cin>>tab[i];
         }
        {for (int j=0; j<N; j++)
            if (tab[j]<tab[j+1])
                {
                    swap(tab[j], tab[j+1]);
                }

     }
for (int i=0; i<K; i++)
    {cout<<tab[i]<<" ";
}
 }
    else
 {
     system("pause");
     }
}

Zadanie F to samo - błędy i nie mam pojęcia jak je wyeliminować.

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
    srand(time(0));
    int N;
    cin>>N;
    if (1<=N<=1000000)
    {
for (int i=0; i<N; i++)
{
    int tab[i];
    cin>>tab[i];

      int c;
      c=0;
      int d;
      d=0;
    for (int j=0; j<=i; j++)
{
    if (tab[i]==0)
    {
        c++;
        }
else
{
    d++;
}
    }
    if (c>d)
    {
        cout<<"c";
    }
    else
    {
        cout<<"d";
    }
    }
    else
    {
        system("pause");
    }
}
}
0
  1. zacznij od formatowania kodu, przy takim - nie widzisz nic.
  2. następnie przeczytaj jakikolwiek kurs C/C++ ponieważ naprawdę nie wiesz co robisz np:
for (int i=0; i<N; i++)
 
         {
         int tab[i]; // Stwórz tablice i-elementówą (która zniknie przy następnym kroku pętli) 
         cin>>tab[i]; // wczytaj element w miejsce poza tą tablicą 
         } // w tym miejscu już żadna z tych N tablic nie istnieje
  1. nie używaj i++ kiedy możesz użyć ++i

1 użytkowników online, w tym zalogowanych: 0, gości: 1