Tablice jednowymiarowe - zapisanie elementów do nowej tablicy.

0

Witam

Mam zadanie do wykonania dot. tablic jednowymiarowych. Treść polecenia brzmi [..] obliczyć ilość elementów niepodzielnych przez 7, zapisać te elementy do nowej tablicy, w nowej tablicy znaleźć najmniejszą wartość oraz jej pozycję w tablicy, posortować nową tablicę rosnąco.

Nie wiem jak mam zapisać te elementy do nowej tablicy więc chwilo pominąłem ten podpunkt. Zrobiłem resztę na domyślnej tablicy i chyba wszystko wygląda dobrze.

Kod:


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

int main()
{
    int x[30];
    int n,i,niep=0;

    printf("Podaj rozmiar tablicy n<30: \n");
    scanf("%i",&n);
    printf("\n Podaj %i liczb: \n",n);

    for(i=0; i<n; i++)
    {
        printf("\n x[%i]= ",i);
        scanf("%i",&x[i]);
    }
    printf("\n Wczytana tablica: \n");
    for(i=0; i<n; i++)
    {
        printf("\n x[%i]=%i\n",i,x[i]);
    }

    for(i=0; i<n; i++)
    {
        if(!(x[i]%7==0))niep++;
    }
    printf("\n Ilosc elementow niepodzielnych przez 7 wynosi: %i",niep);



    int min,ilosc,poz;
    ilosc=0, poz=0;
    min=x[0];

    for(i=1; i<n; i++)
        {
            if(x[i]<min)
                {
                    min=x[i];
                    ilosc++;
                    poz=i;
                }
        }

    printf("\n Najnizsza wartosc w tablicy = %i",min);
    printf("\n Pozycja najmniejszej wartosci w tablicy -> %i",poz);


    int j,ch;

    for(i=1; i<n; i++)
        for(j=0; j<n-i; j++)
        if(x[j] > x[j+1])
        {
            ch = x[j];
            x[j] = x[j+1];
            x[j+1] = ch;
        }
    printf("\n Tablica posortowana rosnaco");
    for (i=0; i<n; i++)
	{
		printf (" %d", x[i]);
	}


    return 0;
}

Pozdrawiam

2

Ten if wygląda dziwnie:

if(!(x[i]%7==0))niep++;

Gdy można zapisać go tak:

if (x[i] % 7 != 0) niep++;

Poza tym porozbijaj sobie rzeczy takie jak wczytywanie do tablicy, sortowanie itp. do osobnych funkcji to będziesz wiedział co już jest zrobione i co jest do zrobienia (i przy okazji kod będzie czytelniejszy :D).

Co do wpisywania liczb do osobnej funkcji:
Stwórz tablicę o takim samym rozmiarze jaki podał użytkownik zainicjalizowaną zerami, dodaj pomocniczą zmienną (indeks) i ustaw również na 0.
Za każdym razem jak dodasz element do tablicy liczb niepodzielnych pod dany indeks, inkrementuj go.

0

Zastosowałem się do instrukcji i napisałem coś takiego:

int niepodzielne[0],index=0;

    for(i=0; i<n; i++)
        {   if(x[i]=niep)
            {
                niepodzielne[i]=niep;
                index++;
            }
        }
    printf("\n Ilosc elementow niepodzielnych w nowej tablicy: %i",niepodzielne[i]);

Jednak nie jestem pewien, czy o to chodziło.

1

Pisałem o tablicy zainicjalizowanej zerami, nie o tablicy o rozmiarze 0.

int indivisible[ROZMIAR] = { 0 };

Poza tym ten if:

if(x[i]=niep)

zastąp ifem który sprawdza czy i jest podzielne przez 7, jeżeli tak to przypisz i do tablicy.

I formatuj ładnie kod.

0

Wyszło mi coś takiego, ale pokazuje mi 0 w printf.

  int nie[30]={0},k=0;

   for(i=0; i<n; i++)
   {  
       if(x[i]%7 !=0)
       {
          niep++;
          nie[k]=x[i];
          k++;
       }
   }
   printf("\n Ilosc elementow niepodzielnych w nowej tablicy: %i",nie[k]);

Gdzie tu jest błąd?(Mam nadzieję, że chociaż kod ładnie sformatowany)

1

Odczytujesz k-ty element tablicy nie co po zinkrementowaniu jego w if'ie oznacza że wartość tego elementu to 0.
Jeżeli potrzebujesz ilość to wynosi ona k, jeżeli maksymalny indeks to k - 1.

0

Okej chyba teraz nareszcie zrozumiałem o co chodzi.

for(i=0; i<n; i++)
{  
     if(x[i]%7 !=0)
     {
          nie[k]=x[i];
          k++;
     }

}

for(i=0;i<k;i++)
{
    printf("\n Ilosc elementow niepodzielnych w nowej tablicy: %i",nie[i]);
}

Wyniki wychodzą okej więc dziękuję za pomoc, choć znając mnie pewnie jeszcze się odezwę w tym temacie.

Pozdrawiam

0

Mam problem z policzeniem sumy elementów mniejszych od 10. Sumuje normalnie tylko bierze też pod uwagę elementy >9, mam błąd w ifie?

    float suma;
    suma=0;

    for(i=0;i<n;i++)
    {
        if(x[i]<='9')
        {
          suma = suma+x[i];
        }
    }
    printf("Suma elementow mniejszych od 10 wynosi: %1f",suma);
2

Dlaczego używasz 9 jako znak a nie liczby?

0

Mam taki dziwny problem z sortowaniem tablicy malejąco. Jeśli np. podam do tablicy o rozmiarze 4 następujące liczby x[0]=2.2, x[1]=3.3, x[2]=4.4, x[3]=5.5 to tablica jest sortowana malejąco jednak tylko pierwsza liczba jest pokazana jako 5.5, a reszta 4.0 etc. Ale jeśli wprowadzę te liczby w odwrotnej kolejności do tablicy(x[0]=5.5 etc.) to sortowanie działa jak najbardziej dobrze. Nie bardzo rozumiem skąd ten błąd.

Kod:

    char max;
    int poz;
    poz=0;
    max=nowa[0];

    for(i=1; i<k; i++)
    {
        if(nowa[i]>max)
        {
            max=nowa[i];
            poz=i;
        }
    }
    printf("\n Najwieksza wartosc w tablicy = %.1f",max);
    printf("\n Pozycja najwiekszej wartosci -> %i",poz);

    int j,ch;

    for(i=0; i<k; i++)
    {
        for(j=i+1; j<k; j++)
        {
            if(nowa[i]<nowa[j])
            {
                ch=nowa[i];
                nowa[i]=nowa[j];
                nowa[j]=ch;
            }
        }
    }
    printf("\n Tablica posortowana malejaco:\n");
    for(i=0; i<k; i++)
    {
        printf(" %.1f ",nowa[i]);
    }

Pozdrawiam

1

Zakładam że masz tablicę typu float albo double. W takim razie zmienna tymczasowa ch powinna być tego samego typu a nie int jak w Twoim przypadku.

0

Poradziłem sobie z poprzednimi zadaniami, ale na tym zatrzymałem się już na początku. Muszę wczytać rozmiar tablicy i wartości jej elementów, ale jest to tablica n-elementowa typu całkowitego. Skoro z góry nie znam rozmiaru tablicy to jak mogę to zrobić? Raczej nie mogę korzystać ze wskaźników w tym zadaniu, a już zdecydowanie nie mogę używać funkcji.

2

No to zadeklaruj tablicę o stałym, z góry określonym rozmiarze, a użytkownika poproś o podanie rozmiaru nie większego od tego, który sobie określisz. To co poda użytkownik będziesz później używał np. do indeksowania iteratora pętli.

To mi bardzo przypomina stare zadania ze starego Pascala. Tak starego, że nie wspierał macierzy dynamicznych, więc trzeba było takie cyrki robić. Choć w sumie nie trzeba było – GetMem i do przodu. ;)

2

Albo, jako że w C99 istnieje już VLA możesz poprosić użytkownika o rozmiar i po prostu stworzyć tablicę:

int size;
scanf("%d", &size);
int arr[size];
0

Zrobiłem to sposobem @atmal i działa super. Muszę teraz obliczyć sumę kwadratów elementów tablicy i napisałem coś takiego:

    float licznik, suma;
    licznik=1;
    suma=1;

    for(i=1; i<=n; i++)
    {
       suma += (licznik * licznik);
       licznik++;
    }
    printf("\n Suma kwadratow wynosi = %.1f",suma);

Czy jest to poprawne, bo nie jestem pewien co do wyników w programie?

1

Nigdzie nie widać u Ciebie tablicy, więc rozwiązanie nie może być poprawne :D

Kompiluj z flagami -Wall oraz -pedantic bo używasz niezainicjalizowanej zmiennej licznik i kompilator powinien Cię ostrzec o tym.

2

@Lamash: po co w ogóle ta zmienna licznik, skoro nie używasz cech liczb zmiennoprzecinkowych? Równie dobrze do tego celu mógłbyś użyć iteratora pętli.

0

Dzięki za odpowiedzi. Wprawdzie udało mi się zrobić resztę podpunktów, ale jedna część polecenia brzmi, że muszę zapisać elementy ujemne do nowej tablicy. Nie jest określony rozmiar tej tablicy, więc zrobiłem to sobie tak i wszystko jest ok:

    float nowa[30]={0};
    int k;
    k=0;

Ale jeśli rozmiar nowej tablicy miałby być taki sam jak rozmiar tej pierwszej to jak należałoby to zmienić?

1

To nadal jest kontynuacja tego programu gdzie użytkownik podaje rozmiar tablicy i zapisywane jest to do zmiennej n?
Bo jeśli tak to wystarczy:

float nowa[n];

Niestety tego nie możesz od razu zainicjalizować więc musiałbyś zrobić pętlę i element po elemencie ustawiać wszystko na 0 lub używając memset:

memset(nowa, 0.0f, sizeof(nowa));

Możesz też obliczyć rozmiar tablicy poprzez obliczenie rozmiar całej tablicy (w bajtach) i dzieląc to przez rozmiar jednego elementu. Brzmi strasznie, ale wystarczy użyć sizeof

// Zakładając że x to tablica
size_t size = sizeof(x) / sizeof(x[0])
0

Ponownie dzięki za odpowiedź. Zostało mi już chyba ostatnie zadanie dot. wektorów. Polecenie brzmi
"Dane są dwa n-elementowe wektory

  1. wczytać z klawiatury rozmiar, a wartości do dwóch tablic wybrać losowo (funkcja „rand”) z przedziału <1,100>,
  2. wyświetlić te dwie tablice,
  3. obliczyć iloczyn skalarny tych wektorów,
  4. sprawdzić, czy wektory są różne, jeżeli tak, to na której pozycji występuje pierwsza różnica."

Zrobiłem to zadanie już chyba ostatkiem sił, ale nie jestem pewien, czy na 100% większość jest dobrze. Na pewno coś źle zapisałem w pkt 4. Byłbym wdzięczny jeśli ktoś mógłby sprawdzić jak to wygląda. Kod:

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

int main()
{
    int n,i,b;
    srand(time(NULL));

    printf("\n Podaj rozmiar pierwszego wektora: ");
    scanf("%i",&n);
    int x[n];

    printf("\n Podaj rozmiar drugiego wektora: ");
    scanf("%i",&b);
    int s[b];

    printf("\n Rozmiar pierwszego wektora: %i ",n);
    printf("\n Rozmiar drugiego   wektora: %i \n",b);

    for(i=0; i<n; i++)
    {
        x[i]=rand()%100+1;
    }

    for(i=0; i<n; i++)
    {
        printf("\n Wartosci pierwszego wektora: %i ",x[i]);
    }

    for(i=0; i<b; i++)
    {
        s[i]=rand()%100+1;
    }
    for(i=0; i<b; i++)
    {
        printf("\n Wartosci drugiego   wektora: %i ",s[i]);
    }

    int c[n],suma;
    suma=0;
    for(i=0; i<n; i++)
    {
        if(x[i]>=s[i])
        {
            c[i]=x[i];
        }
        else
        {
            c[i]=s[i];
        }
    }

    for(i=0; i<n; i++)
    {
        c[i]=x[i]+s[i];
    }
    for(i=0; i<n; i++)
    {
        c[i]=x[i]*s[i];
        suma=suma+c[i];
    }
    printf("\n Iloczyn skalarny wektorow x[i] i s[i] wynosi %d \n",suma);

    int poz=0;

    for(i=0; i<n; i++)
    {
        if(x[i]!=s[i])
        {
            poz=i+1;
            i++;
        }
    }
    printf("\n Pierwsza roznica wystepuje na %i pozycji ",poz);


    return 0;
}

Pozdrawiam i dziękuję.

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