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

Tablice statyczne

Object Storage Arubacloud
0 głosów
367 wizyt
pytanie zadane 3 grudnia 2022 w C i C++ przez Janchess Początkujący (480 p.)
Cześć, czy mógłbym ktoś rozwiązać mi te zadanie ? Chciałbym sprawdzić czy mój kod jest poprawny i go przeanalizować.

Należy zaimplementować funkcję, którą można wywołać następująco:
fill2(tab, n, a, b);
• Funkcja fill2 wypełnia 1-wymiarową tablicę tab wartościami n elementów całkowitych
wylosowanych z przedziału [a,b]=[2,20]. Docelowo elementy tablicy powinny być
uporządkowane niemalejąco (elementy mogą się powtarzać). Do losowania użyj funkcji rand.

Dodam, że zadanie musi być rozwiązane w C zgodnie ze standardem ANSI
1
komentarz 3 grudnia 2022 przez Radfler VIP (101,030 p.)
>Chciałbym sprawdzić czy mój kod jest poprawny

Pokaż swój kod, a my ci powiemy czy jest ok :)
komentarz 3 grudnia 2022 przez Janchess Początkujący (480 p.)

Chodzi mi na razie o same zdefiniowanie funkcji:

prototyp: void fill2(tab, n, a,b );

definicja funkcji:

void fill2(tab,n, a, b) {
	int n, a, b;
	int tab[n];
	srand(time(NULL))
	for (int i = 0; i < n; i++) {
		tab[i] = rand() % (b - 1) + a;
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n - 1; j++) {
			if (tab[j] > tab[j + 1]) {
				int temp = tab[j];
				tab[j] = tab[j + 1];
				tab[j + 1] = temp;
			}
		}
	}
}

czy funkcje srand() muszę zawrzeć w definicji funkcji czy mogę ją napisać w main() zaraz przed wywołaniem funkcji file2 ? Nie rozumiem co zrobić z rozmiarem funkcji.

1
komentarz 3 grudnia 2022 przez adrian17 Ekspert (344,860 p.)

funkcję, którą można wywołać następująco:
fill2(tab, n, a, b);

"sposób wywołania" to co innego niż prototyp/deklaracja funkcji. Brakuje Ci typów. Może najpierw powtórz sobie, jak się ogólnie pisze jakiekolwiek funkcje.

czy funkcje srand() muszę zawrzeć w definicji funkcji czy mogę ją napisać w main() zaraz przed wywołaniem funkcji file2 ? 

O to pytałeś ostatnio i odpowiedziałem:

https://forum.pasja-informatyki.pl/575643/zapelnienie-tablicy-losowi-liczbami?show=575644#a575644

int tab[n];

Ta funkcja ma brać jako argument tablicę i liczbę elementów do wypełnienia, a nie tworzyć nową tablicę.

komentarz 3 grudnia 2022 przez Oscar Nałogowiec (29,320 p.)
Taka forma nagłówka funkcji (argumenty bez typów, niżej zdefiniowane) była dawno temu stosowana. Ale to widziałem tylko we wcześniek stworzonych kodach, sam nie używałem.
komentarz 3 grudnia 2022 przez Janchess Początkujący (480 p.)

@adrian17, Zrobiłem teraz coś takiego. ( w funkcji głównej, przed wywołaniem fill2 znajduje się srand() )

prototyp: 

void fill2( int t[], int n, int a, int b);

definicja funkcji:

void fill2(int t[], int n, int a, int b) {
	for (int i = 0; i < n; i++) {
		t[i] = rand() % (b - 1) + a;
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n - 1; j++) {
			if (t[j] > t[j + 1]) {
				int pom = t[j];
				t[j] = t[j + 1];
				t[j + 1] = pom;
			}
		}
	}
}

 

komentarz 3 grudnia 2022 przez Radfler VIP (101,030 p.)
edycja 3 grudnia 2022 przez Radfler

Źle generujesz liczby z wykorzystaniem `rand`:

 t[i] = rand() % (b - 1) + a; // Źle => generuje [a, b+a-2]
t[i] = (rand() % (b - a + 1)) + a; // Dobrze

 

komentarz 3 grudnia 2022 przez Oscar Nałogowiec (29,320 p.)
Uwaga z zakresem generowanych liczb jest oczywiście słuszna, jednak sam sposób przeliczeń z operatorem modulo do najlepszych też nie należy do zaburza rozkład i mniejsze wyniki moga stać się bardziej prawdopodobne.

1 odpowiedź

+1 głos
odpowiedź 6 grudnia 2022 przez EMUSING Początkujący (270 p.)

Możesz zaimplementować funkcję fill2 w następujący sposób:

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

void fill2(int tab[], int n, int a, int b)
{
  // Zainicjalizuj generator liczb losowych
  srand(time(NULL));

  // Wypełnij tablicę liczbami losowymi z przedziału [a, b]
  for (int i = 0; i < n; i++)
    tab[i] = rand() % (b - a + 1) + a;

  // Posortuj elementy tablicy w kolejności niemalejącej
  for (int i = 0; i < n; i++)
  {
    for (int j = i + 1; j < n; j++)
    {
      if (tab[i] > tab[j])
      {
        // Zamień miejscami elementy tab[i] i tab[j]
        int temp = tab[i];
        tab[i] = tab[j];
        tab[j] = temp;
      }
    }
  }
}

int main()
{
  // Przykładowe użycie funkcji fill2
  int tab[10];
  fill2(tab, 10, 2, 20);

  // Wypisz elementy tablicy
  for (int i = 0; i < 10; i++)
    printf("%d ", tab[i]);
  printf("\n");

  return 0;
}

Powyższy kod używa funkcji rand() z biblioteki standardowej C do losowania liczb całkowitych z przedziału [a, b]. Następnie sortuje elementy tablicy w kolejności niemalejącej przy użyciu prostego algorytmu sortowania bąbelkowego.

Podobne pytania

0 głosów
2 odpowiedzi 336 wizyt
pytanie zadane 26 stycznia 2021 w C i C++ przez szylvvia Początkujący (300 p.)
0 głosów
2 odpowiedzi 572 wizyt
0 głosów
5 odpowiedzi 5,297 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...