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

Pomoc przy nauce wskaźników; C

Object Storage Arubacloud
+1 głos
1,320 wizyt
pytanie zadane 20 maja 2015 w C i C++ przez Mateep Użytkownik (850 p.)
Witam,

zgłaszam się z ogromną prośbą do wszystkich którzy rozumieją i chcieliby się podzielić wiedzą o wskaźnikach. Jakoś nie idzie mi ich przyswojenie, niby rozumiem ich ideę ale jak przychodzi do pisania konkretnych zadań to jakoś nie wychodzi. Zamieszczam więc kilka przykładowych zadań zwizanych z wskaźnikami. Jeśli ktoś miałby chwilkę czasu, żeby je zobaczyć i podzielić się kodem byłbym bardzo wdzięczny. Mam nadzieję, że pomoże mi to lepsze zrozumienie wskaźników właśnie w ten sposób analizując kod :) Pozdrawiam i z góry dziękuję :)

Miło by było w C.

Zadanie 1: Napisać program, który wczytuje do tablicy dwuwymiarowej wyłącznie liczby pierwsze. Wydrukować liczby znajdujące się w polach tablicy o obu indeksach całkowicie podzielnych przez 3. Do przemieszczania się po elementach tablicy wykorzystać wskaźniki.

Zadanie 2: Napisać program wczytujący do tablicy jednowymiarowej ciąg liczb całkowitych. Wydrukować na ekranie kolejno te liczby, które mają wszystkie cyfry parzyste. Do przemieszczania się po elementach tablicy wykorzystać wskaźniki.

Zadanie 3: Napisać własny odpowiednik funkcji strcpy() z pliku nagłówkowego Do przemieszczania się po kolejnych elementach tablicy wykorzystać wskaźniki.

Zadanie 4: Napisz funkcję, która znajduje w tablicy element minimalny. Parametrami funkcji mają być tablica oraz liczba elementów tablicy. Wartością funkcji ma być element minimalny.

Zadanie 5: Napisać funkcję do odwracania kolejności elementów tablicy względem elementu środkowego. Do przemieszczania się po kolejnych elementach tablicy wykorzystać wskaźniki.

Zadanie 6: Napisać funkcję Znajdź(), która w tablicy wyszukuje dany element i zwraca jego indeks (o ile element zostanie znaleziony). W przypadku kilku elementów o wartości równej wartości wyszukiwanej, funkcja powinna zwracać indeks ostatniego znalezionego elementu. Argumentami funkcji powinny być: tablica oraz poszukiwany element. Do przemieszczania się po kolejnych elementach tablicy wykorzystać wskaźniki.

Zadanie 7: Napisz program, który dla każdej kolumny tablicy znajdzie wartość minimalną, maksymalną oraz wyznaczy wartość średnią. Do przemieszczania się po tablicy, zarówno w pionie jak i poziomie, wykorzystać wskaźniki. Argumentami funkcji powinny być: tablica oraz liczba wierszy i kolumn.

5 odpowiedzi

+3 głosów
odpowiedź 20 maja 2015 przez MrWeb Stary wyjadacz (10,200 p.)

Zadanie 2!

Czy ilość komentarzy Ci wystarcza ? Starałem się opisać wszystko co się dało :)

Postaram się codziennie wrzucać rozwiązanie następnego zadania.

///////////////////////////////////////////////////////////////////////
// main.cpp
//
// Zadanie 2
// Napisać program wczytujący do tablicy jednowymiarowej ciąg liczb całkowitych.
// Wydrukować na ekranie kolejno te liczby, które mają wszystkie cyfry parzyste.
// Do przemieszczania się po elementach tablicy wykorzystać wskaźniki.
///////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
///////////////////////////////////////////////////////////////////////
//funkcja wczytuje liczby typu int do tablicy
//int* tab    - wskaźnik na tablicę typu int
//size_t size - rozmiar tablicy w bajtach (sizeof(tab))
void read_array(int* tab, size_t size);
///////////////////////////////////////////////////////////////////////
//funkcja wypisuje na ekran kolejno te liczby, które mają wszystkie cyfry parzyste
//int* tab    - wskaźnik na tablicę typu int
//size_t size - rozmiar tablicy w bajtach (sizeof(tab))
void print_array(int* tab, size_t size);
///////////////////////////////////////////////////////////////////////
int main(void)
{
  //alokuję tab_size liczb na stosie (w zadaniu nie było określone ile tych liczb
  //będzie wczytywanych więc założyłem że tab_size. Nie było też wspomniane
  //o wczytywaniu liczb z wejścia więc ustawiłem na sztywno.
  const int tab_size = 5;
  int tab[tab_size];

  printf("Podaj liczby do sprawdzenia:\n");

  //przekaż funkcji tablicę (nazwa tablicy to jednocześnie adres jej
  //pierwszego elementu, a funkcja oczekuje właśnie takiego adresu
  //przekaż też jej rozmiar tablicy w bajtach | 5 elementów * 4 bo int = 20 bajtów
  read_array(tab, sizeof(tab));

  printf("Liczby mające wszystkie cyfry parzyste:\n");

  print_array(tab, sizeof(tab));

  return 0;
}
///////////////////////////////////////////////////////////////////////
void read_array(int* tab, size_t size)
{
  //jeśli do funkcji podany jest pusty wskaźnik, wróć
  if(!tab) return;

  //parametr size zawiera rozmiar tablicy tab w bajtach
  //więc żeby obliczyć liczbę komórek należy podzielić rozmiar
  //całej tablicy przez rozmiar pierwszej komórki
  size /= sizeof(&tab[0]);

  //przez wszystkie elementy tablicy...
  for(size_t i = 0; i < size; i++)
  {
    //pobierz liczbę typu int i wpisz do kolejnych komórek tablicy
    scanf("%d", &tab[i]);
  }
}
///////////////////////////////////////////////////////////////////////
void print_array(int* tab, size_t size)
{
  //jeśli do funkcji podany jest pusty wskaźnik, wróć
  if(!tab) return;

  //parametr size zawiera rozmiar tablicy tab w bajtach
  //więc żeby obliczyć liczbę komórek należy podzielić rozmiar
  //całej tablicy przez rozmiar pierwszej komórki
  size /= sizeof(&tab[0]);

  //przez wszystkie elementy tablicy...
  for(size_t i = 0; i < size; i++)
  {
    //liczba do testowania zamieniona na dodatnią!
    //dla poprawności działania operatora modulo
    int var = +tab[i];

    //zawiera liczbę cyfr w zmiennej var (1234 to 4 cyfry)
    int num_digts = 0;

    //zawiera liczbę cyfr parzystych w zmiennej var (1234 z czego 2 cyfry są parzyste)
    int num_parity_digts = 0;

    //dopóki var jest większa od 0 (nadal zostały jakieś cyfry)
    while(var)
    {
      //zwiększ licznik cyfr w zmiennej
      ++num_digts;

      //jeśli ostatnia cyfra ze zmiennej var jest parzysta
      if((var % 10) % 2 == 0)
      {
        //zwiększ licznik cyfr parzystych
        ++num_parity_digts;
      }

      //usuń ostatnią cyfrę
      var /= 10;
    }

    //jeśli wszystkie cyfry były parzyste albo podaną cyfrą było 0 (parzyste!)
    if(num_digts == num_parity_digts || tab[i] == 0)
    {
      //wypisz na ekran komórkę z tablicy
      printf("%d\n", tab[i]);
    }
  }
}

 

komentarz 20 maja 2015 przez Mateep Użytkownik (850 p.)
Wow! Bardzo dziękuję za pomoc! Super zrobione :) na pewno pomoże zrozumieć temat! Wielkie Dzięki!
+3 głosów
odpowiedź 21 maja 2015 przez MrWeb Stary wyjadacz (10,200 p.)

Zadanie 4!

Usunąłem kilka komentarzy które pojawiły się w zadaniu 2 i użyłem napisanej wcześniej funkcji tak, by nie myśleć dwa razy :)

///////////////////////////////////////////////////////////////////////
// main.cpp
//
//Zadanie 4: Napisz funkcję, która znajduje w tablicy element minimalny.
//Parametrami funkcji mają być tablica oraz liczba elementów tablicy.
//Wartością funkcji ma być element minimalny.
///////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
///////////////////////////////////////////////////////////////////////
//funkcja wczytuje liczby typu int do tablicy
//int* tab    - wskaźnik na tablicę typu int
//size_t size - rozmiar tablicy w bajtach (sizeof(tab))
void read_array(int* tab, size_t size);
///////////////////////////////////////////////////////////////////////
//funkcja wczytuje liczby typu int do tablicy
//int* tab    - wskaźnik na tablicę typu int
//size_t size - rozmiar tablicy w ELEMENTACH!
int find_array_min(int* tab, size_t size);
///////////////////////////////////////////////////////////////////////
int main(void)
{
  const int tab_size = 5;
  int tab[tab_size];

  printf("Podaj liczby do sprawdzenia:\n");

  read_array(tab, sizeof(tab));

  printf("Najmniejszą liczbą jest:\n");

  //przekaż funkcji tablicę (nazwa tablicy to jednocześnie adres jej
  //pierwszego elementu, a funkcja oczekuje właśnie takiego adresu
  //przekaż też ilość elementów w tablicy!
  printf("%d\n", find_array_min(tab, tab_size));

  return 0;
}
///////////////////////////////////////////////////////////////////////
void read_array(int* tab, size_t size)
{
  if(!tab) return;

  size /= sizeof(&tab[0]);
  for(size_t i = 0; i < size; i++)
    scanf("%d", &tab[i]);
}
///////////////////////////////////////////////////////////////////////
int find_array_min(int* tab, size_t size)
{
  //jeśli do funkcji podany jest pusty wskaźnik, wróć
  if(!tab) return -1;

  //stwórz zmienną do przechowywania aktualnie najmniejszej wartości
  //i załaduj do niej pierwszą wartość z tablicy
  int min = tab[0];

  //przez wszystkie elementy tablicy..
  for(size_t i = 0; i < size; i++)
  {
    //jeśli min nie jest najmniejsze (w porównaniu do tab[i])
    if(min > tab[i])
    {
      //ustaw min na aktualnie najmniejszą wartość
      min = tab[i];
    }
  }

  //zwróć znalezioną wartość
  return min;
}
///////////////////////////////////////////////////////////////////////

 

komentarz 22 maja 2015 przez Mateep Użytkownik (850 p.)
Super, bardzo pomaga wzrozumieniu tematu! Jestem bardzo wdzięczny :)
+3 głosów
odpowiedź 22 maja 2015 przez MrWeb Stary wyjadacz (10,200 p.)

Zadanie 6!

Co mogę powiedzieć o tych zadaniach... Łatwe, ale pouczające, bo było kilka błędów których się nie spodziewałem. Specjalnie zostawiłem Ci zadania nieparzyste, tak byś sam mógł nad nimi popracować. Są trudniejsze od tych które zrobiłem, ale to dobrze bo dzięki temu postawisz sobie wyzwanie, a tylko tak możesz się rozwijać. Pamiętaj, że użytkownicy forum i Ja postaramy Ci pomóc z problemem w kodzie więc nawet jeśli coś nie będzie chciało działać - wal śmiało :)

///////////////////////////////////////////////////////////////////////
// main.cpp
//
// Zadanie 6: 
// Napisać funkcję Znajdź(), która w tablicy wyszukuje dany element i zwraca jego indeks
// (o ile element zostanie znaleziony). W przypadku kilku elementów 
// o wartości równej wartości wyszukiwanej, funkcja powinna zwracać 
// indeks ostatniego znalezionego elementu. 
// Argumentami funkcji powinny być: tablica oraz poszukiwany element. 
// Do przemieszczania się po kolejnych elementach tablicy wykorzystać wskaźniki.
///////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
///////////////////////////////////////////////////////////////////////
//wczytuje liczby typu int do tablicy
//int* tab    - wskaźnik na tablicę typu int
//size_t size - rozmiar tablicy w bajtach (sizeof(tab))
void read_array(int* tab, size_t size);
///////////////////////////////////////////////////////////////////////
//wypisuje na ekran kolejno te liczby, które mają wszystkie cyfry parzyste
//int* tab    - wskaźnik na tablicę typu int
//size_t size - rozmiar tablicy w bajtach (sizeof(tab))
void print_array(int* tab, size_t size);
///////////////////////////////////////////////////////////////////////
//zwraca indeks ostatniej znalezionej komórki równej co do wartości zmiennej element
//int* tab    - wskaźnik na tablicę typu int
//size_t size - rozmiar tablicy w bajtach (sizeof(tab))
//int element - wartość poszukiwana w tablicy
size_t find_array(int* tab, size_t size, int element);
///////////////////////////////////////////////////////////////////////
int main(void)
{
  const int tab_size = 5;
  int tab[tab_size];
	int val;
	int idx;
 
  printf("Podaj liczby do sprawdzenia:\n");
 
  read_array(tab, sizeof(tab));
 
  printf("Podaj szukaną cyfrę:\n");
	scanf("%d", val);
 
	idx = find_array(tab, sizeof(tab), val);
	
  if(idx == -1)
	{
		printf("Nie znaleziono takiego elementu");
	}
	else
	{
		printf("Wartość jest pod indeksem: %d", idx);
	}
 
  return 0;
}
///////////////////////////////////////////////////////////////////////
void read_array(int* tab, size_t size)
{
  if(!tab) return;
  size /= sizeof(&tab[0]);
 
  for(size_t i = 0; i < size; i++)
    scanf("%d", &tab[i]);
}
///////////////////////////////////////////////////////////////////////
void print_array(int* tab, size_t size)
{
  if(!tab) return;
  size /= sizeof(&tab[0]);
 
  for(size_t i = 0; i < size; i++)
  {
    int var = +tab[i];
    int num_digts = 0;
    int num_parity_digts = 0;
 
    while(var)
    {
      ++num_digts;
 
      if((var % 10) % 2 == 0)
        ++num_parity_digts;
 
      var /= 10;
    }
 
    if(num_digts == num_parity_digts || tab[i] == 0)
      printf("%d\n", tab[i]);
  }
}
///////////////////////////////////////////////////////////////////////
size_t find_array(int* tab, size_t size, int element)
{
	//jeśli do funkcji podany jest pusty wskaźnik, wróć
  if(!tab) return;
	size /= sizeof(&tab[0]);
 
	//zmienna trzyma indeks komórki zawierającej tą samą wartość co element
	int idx = -1;
	
	//przez wszystkie elementy tablicy
	for(size_t i = 0; i < size; i++)
  {
		//jeśli tablica pod danym indeksem jest równa wartości szukanej
		//ustaw zmienną idx na ten indeks. 
		//Jeśli program później w tablicy znowu znajdzie wartość równą zmiennej element
	  //to poprostu nadpisze ją nowym indeksem w ten sposób zawsze będzie najdalszy indeks
		if(tab[i] == element) idx = i;
	}
	
	//zwróć znaleziony indeks. Jeśli go nie znaleziono to wartość idx pozostała równa -1
	//czyli zwróci błędny indeks, dokładnie tak jak chcemy.
	return idx;
}

 

+1 głos
odpowiedź 20 maja 2015 przez mrcnsct Nałogowiec (36,390 p.)

Może to ci trochę pomoże: https://www.youtube.com/watch?v=KaIFM5d4qds

+1 głos
odpowiedź 20 maja 2015 przez hit02 Nałogowiec (33,970 p.)

Jakoś tych programików mi się pisać nie chce, cheeky ale może pomoże ci ta seria:

https://www.youtube.com/watch?v=bewTJaboGIw&list=PL3B37AA87E119944E&index=11

Podobne pytania

–20 głosów
1 odpowiedź 1,488 wizyt
0 głosów
0 odpowiedzi 253 wizyt
0 głosów
2 odpowiedzi 558 wizyt
pytanie zadane 18 grudnia 2019 w C i C++ przez Lok Nowicjusz (220 p.)

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!

...