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

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):

 #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:

#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

0

Ad.1. to jest źle

for(i=0; i<*p2; i++)
*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ć:

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

1
void zeruj(unsigned int *p, unsigned int *k)
  {
   while(p<k) *(p++)=0;
  }
if(!(losowa[N-1]%2)) zeruj(losowa, losowa+N/2);
else zeruj(losowa+N/2, losowa+N);
void losuj(unsigned int tablica[], int A)
  { 
   ...
   *(tablica+i)=-10+rand()%20;  // ujemną wartość do unsigned int próbujesz wpisać ?
  }
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.

#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;	
}

1

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

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

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