zadania w jezyku C ( amator)

0

Witam, zaczyna się dopiero uczyć w jezyku C i mam kilka zadan do rozwiązania, z którymi mam problemy (mniejsze lub wieksze), lub też chcę skonfrontować moje wyniki z waszymi.

Przy następującej deklaracji oraz podstawieniach:

   int i=2, t[4]={ 4,3,4,1 };
   *(t+2)=2;
   t[1]=*(t+i);

jaką wartość mają poszczególne elementy tablicy t ?.

Jakie będą wartości zmiennych i,j w wyniku następującego wywołania funkcji.

   long i=1,j=4;
   j= 2*f(&i, (int)j);

zdefiniowanej:

   long f(  long *a , int j )
     {  
      j= 2*j;  *a=j+1;  
      return j;
     } 

Dana jest lista o elementach typu:

   struct element 
        {
        int x,y,z
        struct element *nastepny;
        } 

Zapisz funkcję zwracającą ilość elementów listy. (lista identyfikowana jest przez wskaźnik p do pierwszego elementu).

Dana jest lista o elementach typu:

   struct element 
        {
        int x,y,z
        struct element *nastepny;
        } 

Napisz funkcję zwracającą wskaźnik do ostatniego elementu listy (lista identyfikowana jest przez wskaźnik p do pierwszego elementu).

Nie chcę wrzucać tych zadań w kompilator, chcę je przeanalizować

dodanie znaczników <code class="c"> - fp

0

Wrzuć swoje wyniki, a my powiemy, co ewentualnie zrobiłeś źle.

0

Pierwsze dwa punkty to prosta sprawa nawet bez kompilacji.

Dwa ostatnie są tutaj (nie mogłem się powstrzymać):

#include <iostream>

struct element{
  int x,y,z;
  element *nastepny;
};

void dodaj(element *&w, int x, int y, int z){
  element *t = new element;
  element *b = w;

  t->x = x;
  t->y = y;
  t->z = z;
  t->nastepny = 0;

  if(!w){
    w = t;
  }
  else{
    while(b->nastepny)
      b = b->nastepny;
    b->nastepny = t;
  }
}

int ileElementow(element *&w){
  element *b = w;
  int i = 0;

  if(b){
    while(b->nastepny){
      i++;
      b = b->nastepny;
    }
    i++;
  }
  return i;
}

element *ostatni(element *&w){
  element *b = w;

  if(b){
    while(b->nastepny)
      b = b->nastepny;
  }
  return b;
}

void zniszcz(element *&w){
  element *b = w;
  while(w){
    b = w;
    w = b->nastepny;
    delete b;
  }
}

int main(){
  element *p = 0;
  dodaj(p,1,1,1);
  dodaj(p,2,2,2);
  dodaj(p,3,3,3);
  dodaj(p,4,4,4);

  std::cout << "Ilosc elementow listy: " << std::endl
	        << ileElementow(p) << std::endl;

  element *l = ostatni(p);
  std::cout << "Ostatni element: " << std::endl
	    	<< l->x << std::endl
		    << l->y << std::endl
		    << l->z << std::endl;

  zniszcz(p);

  system("Pause");
}

Kod jest w C++ ale łatwo go do C przerobić.

Pozdrawiam
Grzesiek

0

w pierwszym zadaniu wyszło mi że t[4]= 4 2 2 1

w drugim że i =10, j= 16

0

Pierwsze dobrze, a w drugim masz jedną pomyłkę.

PS: Jak skończysz spróbuj skompilować sobie zadanie drugie - niespodzianka.

0

z tym drugim naprawde nie wiem..

0

To jest typowe przekazywanie argumentu przez wskaźnik.
Wyobraź sobie, ze '*a' to jest '*i' i będzie łatwiej liczyć, ponieważ w tej funkcji '*i' to tak naprawdę wartość 'j' z dodaną cyfrą 1.

long f(long *i, int j){  
	j= 2*j;  
	*i=j+1;  
	return j;
} 

long i=1,j=4;
j= 2*f(&i, (int)j);
0

tak więc poprawcie mnie też w tych zadaniach

Przy deklaracjach i podstawieniach:

   int  *a, *b, i=4, k=1;
   a= &i; 
   b=a;
   *a*= *b;

jaka jest wartość zmiennej i ?. Wyszło mi że i wynosi 16

Przy deklaracjach i podstawieniach:

   int  a[3]={1,2,3}, *b;
   b=a+1;
   b[-1]= *a * *b;
   ++b;
   b[0]= *(a+2);

jaką wartość mają elementy tablicy a? a[3]= (3,1,3)

Jakie będą wartości elementów tablicy z w wyniku następującego wywołania funkcji.

   long z[2],*p;
   z[0]=3; p=z+1;
   f(z, p);

zdefiniowanej:

   void f(  long *a , long *b )
     {  
      *b= *a;
       a=b;
       ++*a;
      }

z[2]= (3,4)

Jakie będą wartości zmiennych x[0], x[1] w wyniku następującego wywołania funkcji.

   long x[2];
   x[0]=3; x[1]=4;
   f(x, x+1);

zdefiniowanej:

   void f(  long *a , long *b )
     {  
      ++a; 
      ++*a;
      }

x[2]= (5,6)

Jakie będą wartości elementów tablicy z w wyniku następującego wywołania funkcji.

   long z[2],p=3;
   z[0]=3;;
   f(z, p);

zdefiniowanej:

   void f(  long *a , long &b )
     {  
      b= *a;
       ++a;
       *a=b;
      }

z[2]= (4,4)

dodanie znaczników <code class="c"> oraz `` - fp

0

Zadanie nr 1
16

Zadanie nr 2
a[3] = {2,2,3};

Dlaczego?

// Tutaj wiadomo o co chodzi
int  a[3]={1,2,3}, *b;

// Ustawiamy wskaźnik 'b' na element 'a[1]'
// więc b[0] = a[1];
b=a+1;

// Skoro b[0] = a[1] tp b[-1] = a[0]
// W a[0] wstawiamy 1*2 czyli 2
b[-1]= *a * *b;

// Przesuwamy wskaźnik 'b' kolejne miejsce
// czyli b[0] = a[2]
++b;

// Skoro nazwa tablicy jest wskaźnikiem na jej pierwszy element
// to a+2 będzie wskaźnikiem na trzeci czyli a[2]
// b[0] to teraz a[2] więc ten wpis niczego nie zmienia i b[0] = 3.
b[0]= *(a+2);

Zadanie nr 3
z[2] = {3,4};

Zadanie nr 4
x[2] = {3,5};

Dlaczego?
Drugi argument funkcji jest dla zmyłki, bo w ogóle nie jest używany, to po pierwsze.

void f(  long *a , long *b )
{
   // Przesunięcie wskaźnika z a[0] na a[1] czyli na x[1].
    ++a;
   // Inkrementacja wartości x[1] czyli cyfry 4 na cyfrę 5
    ++*a;
}

Zadanie nr 5
z[2] = {3,3};

Dlaczego?

void f(  long *a , long &b )
{
    // podstawienie wartości z[0] przez referencję do obiektu p
    // Od teraz p = 3
    b=*a;

    // przesunięcie wskaźnika na element tablicy z[1]..
    ++a;

    // ...i wstawienie tam wartości p czyli tak naprawdę a[0]
    *a=b;
}

Tyle chiba:)

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