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

Tablice statyczne

Aruba Cloud - Virtual Private Server VPS
0 głosów
647 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 Mentor (352,580 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,340 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,340 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 671 wizyt
pytanie zadane 26 stycznia 2021 w C i C++ przez szylvvia Początkujący (300 p.)
0 głosów
2 odpowiedzi 882 wizyt
0 głosów
5 odpowiedzi 5,638 wizyt

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,663 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...