Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C]Podstawienie wartości wskaźnikowi typu float

Ostatnio zmodyfikowano 2018-01-17 22:21
Autor Wiadomość
szeejdi
Temat założony przez niniejszego użytkownika
[C]Podstawienie wartości wskaźnikowi typu float
» 2018-01-17 19:28:17
Witam,
Mam za zadanie napisać program, który:
1) Pobiera od użytkownika rozmiar tablicy tworzonej dynamicznie
2) Pobiera wyrazy tablicy
3) Wyświetla je
4) Sumuje ich wartości
Mam problem z podpunktem 4.
Wersja z sumowaniem jako int:
C/C++
#include <stdio.h>
#include <stdlib.h>

void utworz( float * x, int n )
{
   
    int i, j;
   
   
    for( i = 0; i < n; i++ )
    {
        for( j = 0; j < n; j++ )
        {
            printf( "Podaj A[%d,%d]=", i, j );
            scanf( "%f", x++ );
        }
    }
   
}
void czytaj( float * x, int n )
{
    int i, j;
    printf( "Elementy tablicy A\n" );
    for( i = 0; i < n; i++ )
    {
        for( j = 0; j < n; j++ )
        {
            printf( "A[%d,%d]=%2.2f ", i, j, *( x++ ) );
            printf( "\n" );
        }
    }
}
int sumuj( float * x, int n, int * wsuma, int * r )
{
    int i, j;
    int suma = 0;
   
    for( i = 0; i < n; i++ )
    {
        for( j = 0; j < n; j++ )
        {
            suma = suma +( *( x++ ) );
        }
    }
    * wsuma = suma;
    * r =( n * n );
   
}
int main()
{
    float * a;
    int * wsuma;
    int n;
    int * r;
    printf( "Podaj rozmiar tablicy:" );
    scanf( "%d", & n );
    a =( float * ) malloc(( n * n ) * sizeof( float ) );
    utworz( a, n );
    czytaj( a, n );
    sumuj( a, n, & wsuma, & r );
    printf( "Suma  elemenow %d tablicy wynosi: %d", r, wsuma );
    free( a );
    return 0;
}


Nie działająca wersja z sumowaniem zapisywanym jako float:
C/C++
#include <stdio.h>
#include <stdlib.h>

void utworz( float * x, int n )
{
   
    int i, j;
   
   
    for( i = 0; i < n; i++ )
    {
        for( j = 0; j < n; j++ )
        {
            printf( "Podaj A[%d,%d]=", i, j );
            scanf( "%f", x++ );
        }
    }
   
}
void czytaj( float * x, int n )
{
    int i, j;
    printf( "Elementy tablicy A\n" );
    for( i = 0; i < n; i++ )
    {
        for( j = 0; j < n; j++ )
        {
            printf( "A[%d,%d]=%2.2f ", i, j, *( x++ ) );
            printf( "\n" );
        }
    }
}
int sumuj( float * x, int n, float * wsuma, int * r )
{
    int i, j;
    float suma = 0.0;
   
    for( i = 0; i < n; i++ )
    {
        for( j = 0; j < n; j++ )
        {
            suma = suma +( *( x + 1 ) );
        }
    }
    * wsuma = suma;
    * r =( n * n );
   
}
int main()
{
    float * a;
    float * wsuma;
    int n;
    int * r;
    printf( "Podaj rozmiar tablicy:" );
    scanf( "%d", & n );
    a =( float * ) malloc(( n * n ) * sizeof( float ) );
    utworz( a, n );
    czytaj( a, n );
    sumuj( a, n, & wsuma, & r );
    printf( "Suma  elemenow %d tablicy wynosi: %f", r, wsuma );
    free( a );
    return 0;
}


Z góry bardzo dziękuję za pomoc i wytłumaczenie problemu, dopiero co zaczynam przygodę z C na studiach, dlatego nie skreślajcie mnie od razu jak znajdziecie jakies "amatorskie" błędy.
Pozdrawiam
P-168796
YooSy
» 2018-01-17 20:42:31
Funkcja sumuj nic nie zwraca mimo deklaracji, że ma zwrócić.
suma = suma +( *( x + 1 ) );
Dodajesz wciąż ten sam wyraz tablicy.
P-168797
szeejdi
Temat założony przez niniejszego użytkownika
» 2018-01-17 20:55:45
Masz rację,
oczywiście 1 poinno być zamienione na ''i'' albo x++. Jednakże nadal to nie rozwiązuje problemu :/
P-168798
Lora
» 2018-01-17 21:41:34
A return dodałeś?
edit:
Chociaż w sumie jest on niepotrzebny.
P-168799
YooSy
» 2018-01-17 21:44:02
sumuj( a, n, & wsuma, & r );
Przekazujesz do funkcji adres na wskaźniki
* wsuma
 oraz
* r
,
a funkcja przyjmuje wskaźnik, a nie wskaźnik do wskaźnika.
P-168800
szeejdi
Temat założony przez niniejszego użytkownika
» 2018-01-17 21:50:39
hm nie za bardzo rozumiem, skoro podstawienie "r" działa normalnie to czemu podstawienie wartości "suma" za wskaźnik *wsuma nie działa?
P-168801
YooSy
» 2018-01-17 22:01:13
Zadeklaruj zmienne, zamiast wskaźników
C/C++
float * a;
float wsuma;
int n;
int r;

oraz tutaj
suma = suma +( *( x +( i * n ) + j ) );
.
Oczywiście funkcja sumuj powinna mieć zwracany pusty typ
void
.

Żeby używać wskaźnika, trzeba go na coś ustawić.
Używanie nieustawionego wskaźnika jest UB.
P-168803
szeejdi
Temat założony przez niniejszego użytkownika
» 2018-01-17 22:21:38
Teraz jest ok i działa :D Bardzo dziękuję za pomoc :)
C/C++
#include <stdio.h>
#include <stdlib.h>

void utworz( float * x, int n )
{
   
    int i, j;
   
   
    for( i = 0; i < n; i++ )
    {
        for( j = 0; j < n; j++ )
        {
            printf( "Podaj A[%d,%d]=", i, j );
            scanf( "%f", x++ );
        }
    }
   
}
void czytaj( float * x, int n )
{
    int i, j;
    printf( "Elementy tablicy A\n" );
    for( i = 0; i < n; i++ )
    {
        for( j = 0; j < n; j++ )
        {
            printf( "A[%d,%d]=%2.2f ", i, j, *( x++ ) );
            printf( "\n" );
        }
    }
}
void sumuj( float * x, int n, float * wsuma, int * r )
{
    int i, j;
   
    float suma = 0.0;
   
    for( i = 0; i < n; i++ )
    {
        for( j = 0; j < n; j++ )
        {
            suma = suma +( *( x +( i * n ) + j ) );
        }
    }
   
   
    * wsuma = suma;
    * r =( n * n );
   
}
int main()
{
    float * a;
    float wsuma;
    int n;
    int r;
    printf( "Podaj rozmiar tablicy:" );
    scanf( "%d", & n );
    a =( float * ) malloc(( n * n ) * sizeof( float ) );
    utworz( a, n );
    czytaj( a, n );
    sumuj( a, n, & wsuma, & r );
    printf( "Suma  elemenow %d tablicy wynosi: %f", r, wsuma );
    free( a );
    return 0;
}
P-168804
« 1 »
  Strona 1 z 1