Problem z zadaniami dot. wskaźników, tablic po kompilacji.

Problem z zadaniami dot. wskaźników, tablic po kompilacji.
VO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Witam, mam problem z dwoma następującymi programami.

1)Muszę wyzerować elementy tablicy od jej początku do jej połowy, jeśli jej ostatni element jest parzysty, lub od połowy do jej końca jeśli ostatni element jest nieparzysty(w poleceniu zadania musiałem jeszcze wykorzystać do tego programu odpowiednie funkcje takie jak drukuj, losuj itp):

Kopiuj
 #include<stdio.h>
 #include<windows.h>
 #include<stdlib.h>
 
 void losuj(unsigned int tablica[], int A);
 void drukuj(unsigned int t[],int B);
 void zeruj(unsigned int *p1,unsigned int *p2);
 int main()
 {
 int N=12;

 unsigned int losowa[12]={};   
 losuj(losowa, N);
 int i;
 drukuj(losowa, N);
 printf("\n");
 if(losowa[N-1]%2==0)
 zeruj(losowa, losowa+(N/2-1));
 else
 zeruj(losowa+(N/2-1), losowa+(N-1));
 drukuj(losowa, N);
 system("pause");
 return 0;
}
 void losuj(unsigned int tablica[], int A)
{
  int i;
 srand(time(0));
 for(i=0;i<A;i++)
 *(tablica+i)=	-10+rand()%20;  	
}
void drukuj(unsigned int t[],int B)
{
int i; 
for(i=0;i<B;i++)
printf("%d ",t[i]);
}
void zeruj(unsigned int *p1, unsigned int *p2)
{
	int i;
	for(i=0; i<*p2; i++)
	*(p1+i)=*(p1+i)*0;
	
}

2)Muszę, obliczyć ile jest elementów w danej tablicy spełniających warunek taki, że
-pomiędzy argumentem pierwszym, a drugim funkcji "licz" jest element równy argumentowi trzeciemu tej funkcji:

Kopiuj
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>

int licz(double *p1, double *p2, double x);

int main()
{
	
double a[]={8.0, 2.0, 1.0, 6.0, 2.0, 7.0, 5.0, 2.0, 9.0};
int n= licz(a+2, a+7, 2.0);
printf("%d\n", n);
	
system("pause");
return 0;
}

int licz(double *p1, double *p2, double x)
{
int i, licznik=0;
	for(i=0;i<*p2;i++)
	{
		if(*(p1+i)==x)
		licznik++;
		
	}
		
return licznik;	
}

Proszę o wyrozumiałość i porady ;)
Pozdrawiam

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Ad.1. to jest źle

Kopiuj
for(i=0; i<*p2; i++)
Kopiuj
*p2 

to jest wartość pod wskaźnikiem p2 przecież a ty chcesz sie przesuwać w tablicy po indeksach od 0 do (p2-p1)/sizeof(int) razy. Wygodniej w ogóle byłoby zrobić:

Kopiuj
for(wskaznik=p1; wskaznik!=p2; wskaznik++){
  *wskaznik = 0;
}

(btw mnożenie przez 0 zamiast przypisania -0 to jakas masakra...)

Ad.2. ten sam problem co wyżej (btw wiesz że zamiast *(wskaznik+i) możesz pisać po prostu wskaznik[i] ?) poza tym tutaj w ogóle nie widzę żebyś zaimplementował to co w poleceniu

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
void zeruj(unsigned int *p, unsigned int *k)
  {
   while(p<k) *(p++)=0;
  }
Kopiuj
if(!(losowa[N-1]%2)) zeruj(losowa, losowa+N/2);
else zeruj(losowa+N/2, losowa+N);
Kopiuj
void losuj(unsigned int tablica[], int A)
  { 
   ...
   *(tablica+i)=-10+rand()%20;  // ujemną wartość do unsigned int próbujesz wpisać ?
  }
VO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Dziękuję za pomoc z wcześniejszymi zadaniami, mam jeszcze jeden problem:

Mam takie zadanie, że
a)funkcję szuka w danej N elementowej tablicy typu int pary sąsiednich elementów, których suma jest największa. Funkcja jest typu void, a indeks pierwszego z elementów spełniających warunek ma być dostępny w miejscu wywołania funkcji.Inna funkcja ma szukać w danej N elementowej tablicy typu double pierwsze dwa takie same elementy. Funkcja zwraca wartość 0, gdy brak jest dwóch jednakowych elementów i 1 w przeciwnym przypadku. Indeksy znalezionych elementów mają być dostępne w miejscu wywołania funkcji. Wykorzystać te funkcję w programie.
Definicji drugiej funkcji jeszcze nie dokonczylem.

Kopiuj
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>

int takie_same(double t[], int *ind1, int *ind2);
void max_suma(int k[], int *wsk);

int main()
{
int i;
int ind_suma=0;
int ind_1=0;
int ind_2=0;
double a[]={8.0, 2.0, 1.0, 6.0, 2.0, 7.0, 5.0, 2.0, 9.0};
int tab[]={3,-4,6,8,9,1,4,7,9,12,34,1,8,0,-9};
for(i=0;i<sizeof tab/sizeof (int);i++)
printf("%d, ", tab[i]);
printf("\n");
max_suma(tab, &ind_suma);
printf("\n");
printf("Indeks 1 el. sumy = %d", ind_suma);
printf("\n");
printf("\n");
for(i=0;i<sizeof a/sizeof (double);i++)
printf("%f\n", a[i]);
printf("\n");
printf("%d", takie_same(a, &ind_1, &ind_2));
printf("\n");
system("pause");
return 0;
}
void max_suma(int k[], int *wsk)
{
int rozmiar=sizeof k/sizeof (int);	
printf("%d", rozmiar);/* Tu myslalem ze wyswietli "15" jako rozmiar tab*/
printf("\n");
int *p1=k;
int *p2=k+14; /* Tu powinno być k+(rozmiar-1) bo nie znam rozmiaru tablicy*/
int max=0;
int indeks=0;
	for(p1;p1<p2-1;p1++)
	{
		if(*p1+*(p1+1)>max)
	      {
		  max=*p1+*(p1+1);
		  *wsk=indeks;
		  }
	indeks++;	  
    }
    printf("Najwieksza suma = %d", max);
}
int takie_same(double t[], int *ind1, int *ind2)
{
double *p1=t;
double *p2=t+1;
double *p3=t+8;
	for(p1;p1<p3-1;p1++)
	{
		
		for(p2;p2<=p3;p2++)
		{
		/*W tym printfie sprawdzam jak wykonuje for*/	
		printf("*p1= %f,*p2= %f\n", *p1, *p2);
		if(*p1==*p2)
		  {
			return 1;   
	      }
	    }
	}
	return 0;	
}

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

sizeof na tablicy zwróci ci jej rozmiar w sensie ilości elementów.

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
1
Shalom napisał(a):

sizeof na tablicy zwróci ci jej rozmiar w sensie ilości elementów.
Tablica utworzona statycznie faktycznie zwroci rozmiar, ale w sensie rozmiaru, a nie ilosci elementow, a tablica dynamiczna zwroci rozmiar wskaznik na dany typ.
user image

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.