Skocz do zawartości

  •  
  • Mini kompendium
  • MimeTeX
  • Regulamin

Zdjęcie
        LICEUM        

Wskaźniki w C++



  • Nie możesz napisać tematu
  • Zaloguj się aby odpowiedzieć
20 odpowiedzi w tym temacie

#1 RSWT

RSWT

    Druga pochodna

  • Użytkownik
  • 132 postów
1
Neutralny
  • Płeć:Mężczyzna

Napisano 21.02.2016 - 15:38

Jak napisać program który wypełni tablice jednowymiarową liczbami losowymi z zakresu 0-10 używając wskaźników?


  • 0

Afroman

    Kombinator

  • Użytkownik
3
  • Płeć:Kobieta

Napisano 25.09.2011 - 17:55

#2 Mariusz M

Mariusz M

    Wielki Analityk

  • Użytkownik
  • Redaktor
  • 901 postów
414
Instruktor II
  • Płeć:Mężczyzna

Napisano 21.02.2016 - 22:26

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

 

int main()

{

int k,n

int* t;

printf("n=");

scanf("%d",&n); //w C++ masz strumień wejścia

t=(int*)malloc(n*sizeof(int)); // w C++ masz new

srand(time(NULL));

for(k=0;k<n;k++)

t[k]=rand()%11;

//wypisanie tablicy

for(k=0;k<n;k++)

printf("%d\n ",t[k]); //w C++ masz strumień wyjścia

free(t); // w C++ masz delete[]

return 0;

}
 

Napisany w stylu C ale ci skompiluje bo C++ jest nadzbiorem C


  • 1

#3 RSWT

RSWT

    Druga pochodna

  • Użytkownik
  • 132 postów
1
Neutralny
  • Płeć:Mężczyzna

Napisano 21.02.2016 - 23:13

dzięki, a mógłbyś powiedzieć co jest nie tak z tym  programem ?

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

int main()
{
    srand(time(NULL));
    int tab[100];
    int *w;
    *w=rand()%5+3;
    for(int i=1; i<=100; i++)
    {
        tab[i]=*w;
        }
    cout<<"tab = ";
    for(int i=1; i<=100; i++)
    {
        cout<<tab[i]<<" ";
        }    

   
    
   return 0;    
}


  • 0

#4 Ereinion

Ereinion

    Mega Rozkminiacz z Marsa

  • $Jr Admin
  • 2104 postów
1008
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 22.02.2016 - 21:07

Masz w ostatnim obrocie pętli i = 100, a tablica tab ma indeksy 0, \ldots, 99 , więc wychodzisz poza zakres :)


  • 1

#5 RSWT

RSWT

    Druga pochodna

  • Użytkownik
  • 132 postów
1
Neutralny
  • Płeć:Mężczyzna

Napisano 25.02.2016 - 15:58

Ok.dzięki


A gdybym chciał co drugą liczbę teraz chciał zamienić na inną ?


  • 0

#6 Ereinion

Ereinion

    Mega Rozkminiacz z Marsa

  • $Jr Admin
  • 2104 postów
1008
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 25.02.2016 - 17:34

To w pętli for zrób i+=2 zamiast i++ i będziesz odwiedzał co drugi element tablicy.


  • 1

#7 RSWT

RSWT

    Druga pochodna

  • Użytkownik
  • 132 postów
1
Neutralny
  • Płeć:Mężczyzna

Napisano 25.02.2016 - 17:44

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
using namespace std;

int main()
{
    srand(time(NULL));
    int tab[10];
    int *w;
    w=&tab[0];
    for(int i=0; i<10; i++)
    {
        *w=rand()%6+1;
        cout<<" "<<*w;
        w++;
        }
      cout<<endl;
      for(int i=0; i<10; i+=2)
      {
            *w=7;
            w+=2;
            cout<<" "<<*w;
            
            
            }
 
   return 0;    
}


zrobiłem coś takiego ale nie działa


  • 0

#8 Ereinion

Ereinion

    Mega Rozkminiacz z Marsa

  • $Jr Admin
  • 2104 postów
1008
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 25.02.2016 - 18:49

Po wykonaniu pierwszej pętli w wskazuje na komórkę pamięci "za" tablicą tab. W drugiej pętli próbujesz coś zapisać w to miejsce i stąd błąd naruszenia ochrony pamięci.


  • 1

#9 RSWT

RSWT

    Druga pochodna

  • Użytkownik
  • 132 postów
1
Neutralny
  • Płeć:Mężczyzna

Napisano 25.02.2016 - 19:04

Co oznacza że "za" tablicą tab ?


  • 0

#10 Ereinion

Ereinion

    Mega Rozkminiacz z Marsa

  • $Jr Admin
  • 2104 postów
1008
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 25.02.2016 - 23:13

Tablica tab w pamięci to po prostu zaalokowane miejsce na 10 intów (z reguły to jest ciągły obszar pamięci, ale nie ma gwarancji, pewnie to zależy od kompilatora). Wykonanie w++ powoduje, że w pokazuje na kolejny element tablicy, a wykonanie tej instrukcji w momencie, gdy w pokazuje już na ostatni element, powoduje "wyjście" w poza zaalokowany obszar pamięci.


  • 1

#11 RSWT

RSWT

    Druga pochodna

  • Użytkownik
  • 132 postów
1
Neutralny
  • Płeć:Mężczyzna

Napisano 25.02.2016 - 23:36

Okej


więc co tam tam można poprawić?


  • 0

#12 Ereinion

Ereinion

    Mega Rozkminiacz z Marsa

  • $Jr Admin
  • 2104 postów
1008
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 26.02.2016 - 00:06

Np tak można to zrobić

#include <iostream>
#include <cstdlib>
#include <ctime>

int main() {
    srand(time(NULL));
    int tab[10];
    int *w;
    for(w = &tab[0]; w <= &tab[9]; ++w) {
        *w = rand() % 6 + 1;
        std::cout << " " << *w;
    }
    std::cout << std::endl;
    for(w = &tab[0]; w <= &tab[9]; w += 2) *w = 7;
    for(w = &tab[0]; w <= &tab[9]; ++w) std::cout << " " << *w;
    return 0;    
}

Użytkownik Ereinion edytował ten post 26.02.2016 - 00:07

  • 1

#13 RSWT

RSWT

    Druga pochodna

  • Użytkownik
  • 132 postów
1
Neutralny
  • Płeć:Mężczyzna

Napisano 26.02.2016 - 01:18

Dzięki :) , widzę że w pętli for zamiast i użyłeś w


  • 0

#14 Ereinion

Ereinion

    Mega Rozkminiacz z Marsa

  • $Jr Admin
  • 2104 postów
1008
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 26.02.2016 - 09:25

Tak jest, ale jak wolisz z i to można np tak:

#include <iostream>
#include <cstdlib>
#include <ctime>

int main() {
    srand(time(NULL));
    int tab[10];
    for(int i = 0; i < 10; ++i) {
        *(tab + i) = rand() % 6 + 1;
        std::cout << " " << *(tab + i);
    }
    std::cout << std::endl;
    for(int i = 0; i < 10; i += 2) *(tab + i) = 7;
    for(int i = 0; i < 10; ++i) std::cout << " " << *(tab + i);
    return 0;    
}

  • 1

#15 RSWT

RSWT

    Druga pochodna

  • Użytkownik
  • 132 postów
1
Neutralny
  • Płeć:Mężczyzna

Napisano 26.02.2016 - 14:39

To pierwsze rozwiązanie jest chyba lepsze ,dzięki


w trzecim rozwiązaniu użyłeś trzech pętli gdy ja używałem tylko 2


  • 0

#16 Ereinion

Ereinion

    Mega Rozkminiacz z Marsa

  • $Jr Admin
  • 2104 postów
1008
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 26.02.2016 - 15:16

No tak, tylko Twoje rozwiązanie z dwiema pętlami nie działało dobrze, bo wypisywało tylko co drugi element listy :)

Oczywiście można to wszystko zrobić i w jednej pętli, np tak:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <sstream>

int main() {
    srand(time(NULL));
    int tab[10];
    std::stringstream mod_table;
    for(int i = 0; i < 10; ++i) {
        *(tab + i) = rand() % 6 + 1;
        std::cout << " " << *(tab + i);
        if (i % 2 == 0) *(tab + i) = 7;
        mod_table << " " << *(tab + i);
    }
    std::cout << std::endl;
    std::cout << mod_table.str() << std::endl;
    return 0;    
}

  • 1

#17 RSWT

RSWT

    Druga pochodna

  • Użytkownik
  • 132 postów
1
Neutralny
  • Płeć:Mężczyzna

Napisano 26.02.2016 - 15:55

Tego mod table to  nie znam


  • 0

#18 Ereinion

Ereinion

    Mega Rozkminiacz z Marsa

  • $Jr Admin
  • 2104 postów
1008
Starszy Wykładowca I
  • Płeć:Mężczyzna

Napisano 26.02.2016 - 16:06

Tak nazwałem sobie zmienną od "modified table". Chodzi o to, żeby tej zmienionej tablicy nie wypisywać od razu na standardowe wyjście, tylko przechować gdzieś, a wypisać na końcu.


  • 1

#19 RSWT

RSWT

    Druga pochodna

  • Użytkownik
  • 132 postów
1
Neutralny
  • Płeć:Mężczyzna

Napisano 26.02.2016 - 17:48

Ok,dzięki za wszystko ;)


  • 0

#20 RSWT

RSWT

    Druga pochodna

  • Użytkownik
  • 132 postów
1
Neutralny
  • Płeć:Mężczyzna

Napisano 31.08.2016 - 13:13

 Jeszcze zrobiłem to w ten sposób :

 

 

# include <iostream>

# include <cstdlib>

# include <ctime>

using namespace std;

   int main()

{

     srand(time(NULL));

int tab[10];

int *w;

w=&tab[0];

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

{

       w=&tab[i];

*w=rand()%11;

w++;

 

      }

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

{

       cout<<tab[i]<<"   ";

 

      }

return 0;

 

 

     }


  • 0





Tematy podobne do: Wskaźniki w C++     x