Wątek przeniesiony 2018-05-22 07:56 z C/C++ przez ŁF.

Wskaźniki – niezrozumiały błąd

0

Cześć,
Mam napisać program który znajduje największą wartość w tablicy oraz jej wartość i adres.
Mój program wygląda tak:

#include <stdio.h>

int main()
{
	int n=10, j, i=10, a;
	printf ("podaj liczbe elementow tablicy \n");
	scanf("%d", n);
	int tabA[n], *wska=tabA[i];
	for(i=0; i!=n; i++)
	{
		printf ("podaj wartosc numer %d \n", i+1);
		scanf("%d", a);
		tabA[i]=a;
	}
	a=tabA[0];
	j=0;
	for(i=0; i!=n; i++)
	{
		if(a<tabA[i])
		{
			a=*wska;
			j=&(*wska);
		}
	}
	printf("w tablicy A wartosc najwieksza to %d i ma ona numer%d \n", a, j);
	getch();
	return 0;
}

Nie mam zielonego pojęcia czemu nie działa

0
  1. jak masz już 1 element, to po co znowu a z nim porównujesz
  2. co chcesz uzyskać tym kodem a=wska; bo chyba nie za bardzo wiesz...
0

Tym a=wska, to bym chciał przypisać wartość w danej komórce macierzy, bo ten program musi być przy użyciu wskaźników, a w pierwszym to wybacz, ale nie za bardzo Cię zrozumiałem.

0

Potrzebujesz jednej zmiennej, która będzie przechowywała indeks elementu z największą wartością. Nie potrzebujesz dwóch pętli.

int index = -1;
for( int i = 0; i < n; ++i ) {
  printf( "Podaj wartosc elementu nr %d: ", i );
  scanf( "%d", &tabA[ i ] );
  if ( index == -1 || tabA[ i ] > tabA[ index ] ) {
    index = i;
  }
}
printf( "W tablicy A najwieksza wartosc to %d znajdujaca sie na pozycji %d\n", tabA[ index ], index );
0

Dzięki, ale nie widzę tam nigdzie wskaźników, a to zadanie musi na nich być. Ale wykorzystam to co zrobiłeś do zmienienia a jedną pętlę.

0
#include <stdio.h>
#include <stdlib.h>

int main() {
   int size;
   scanf("%d", &size);
   int *arr_ptr = (int*)malloc(sizeof *arr_ptr * size);
   if(!arr_ptr){
       return -1;
   }
   for (int i = 0; i < size; ++i) {
      scanf("%d", (arr_ptr + i));
   }
   printf("\n");

   for (int i = 0; i < size; ++i) {
      printf("%d ", *(arr_ptr + i));
   }
   printf("\n");

   int *max = arr_ptr;
   for (int i = 1; i < size; ++i) {
      if (*(arr_ptr + i) > *max) {
         max = (arr_ptr + i);
      }
   }
   printf("max = %d i jej adres to %#x \n", *max, (unsigned int)max);
   free(arr_ptr);

   return 0;
}

1

Serio, jedna pętla w zupełności wystarczy ;)
Swoją drogą wątek otagowany jako C++ :>

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>


int main(void)
{
   int size;
   printf( "Podaj liczbe elementow: " );
   scanf( "%d", &size );
   int* tab = malloc( size * sizeof( int ) );
   if (tab == NULL) {
      return 1;
   }
   int* max = NULL;
   for ( int* ptr = tab; ptr < tab + size; ++ptr) {
      printf( "Podaj wartosc elementu %u: ", (unsigned int)(ptr-tab));
      scanf( "%d", ptr );
      if (max == NULL || *ptr > *max) {
         max = ptr;
      }
   }
   printf( "W tablicy A najwieksza wartosc to %d znajdujaca sie na pozycji %u\n", *max, (unsigned int)(max-tab));
   return 0;
}
0

Ok, już działa, dzięki :)

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