• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pierwsze kroczki w strukturach

VPS Starter Arubacloud
0 głosów
204 wizyt
pytanie zadane 9 stycznia 2016 w C i C++ przez Sebastian R Obywatel (1,110 p.)
// ConsoleApplication8.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#include <cmath>
struct Punkt
{
	double x;
	double y;

};
void wypelnienie(Punkt *tab, int rozmiar)
{
	for (int i = 0; i < rozmiar; i++)
	{
		printf("Wpisz punkt X%d", i+1);
		scanf("%f", &tab[i].x);
		printf("Wpisz punkt Y%d", i+1);
		scanf("%f", &tab[i].y);
	}
	for (int i = 0; i < rozmiar; i++)
	{
		printf("\ntablica[%d].x %f", i, tab[i].x);
		printf("\ntablica[%d].y %f", i, tab[i].y);
	}
	getchar();
	getchar();
}
double dwapunkty(Punkt *punkty)
{
	double wynik;
	for (int i = 0; i < 2; i++)
	{
		printf("Wpisz wartosc punktu X%d:", i + 1);
			scanf("%d", &punkty[i].x);
		printf("Wpisz wartosc punktu Y%d:", i + 1);
			scanf("%d", &punkty[i].y);
	}
	wynik = pow(pow(punkty[0].x - punkty[1].x, 2.) + pow(punkty[0].y - punkty[1].y, 2.), (1 / 2.));
	return wynik;
}
int main()
{
	srand(time(NULL));
	int  rozmiar;
	char wybor;
	Punkt *tab;
	Punkt *punkty;
	printf("wpiszcie tutaj rozmiar tablicy: ");
	scanf("%d", &rozmiar);
	tab = (Punkt*)calloc(rozmiar, sizeof(Punkt));
	punkty = (Punkt*)calloc(2, sizeof(Punkt));
	printf("\nKtore wybierasz?\n1. Wybor losowy\n2.Wpisuj sam kazda komorke.\n");
	wybor = _getch();
	
	switch (wybor)
	{
	case '2':
	{
		wypelnienie(tab, rozmiar);
		break;
	}
	default:
	{
		printf("cos zle wpisales/as.");
		break;
	}
	}
	getchar();
	system("cls");
	printf("Wszystko zostalo wyczyszczone.\nTablica zaalokowana.");
	Sleep(2000);
	system("cls");
	printf("Wybierz jedna z opcji.\n1.f. zwraca odległość między zadanymi jako argumenty dwoma punktami\n2. f. sortuje zadaną jako argument tablicę wg odległości punktów od punktu(0.0): ");
	wybor = _getch();

	switch (wybor)
	{
	case '1':
	{
		printf("Wynik to: %6.2f",dwapunkty(punkty));
		break;
	}
	case '2':
	{
		break;
	}
	}
	Punkt free(*tab);
	system("pause");
    return 0;
}


Witajcie, mam do stworzenia program, który będzie obliczał odległość między dwoma punktami.
Skorzystałem oczywiscie ze wzoru matematycznego na obliczanie długosci:
( (x2-x1)^2 + (y2-y1)2) ^ (1/2)
Coś nie działa - Przypisanie wartości do komorek tab[i].x oraz tab[i].y zawsze wynosi 0
natomiast spierwiastkowaną sumę kwadratów podaje jako BARDZO DUŻĄ LICZBĘ

 

1 odpowiedź

+2 głosów
odpowiedź 9 stycznia 2016 przez drek Gaduła (4,980 p.)

Mam pytanie. Dlaczego w funkcji

wypelnienie

pobierasz dane w ten sposób:

scanf("%f", &tab[i].x);

a w funkcji

dwapunkty

w ten sposób?

scanf("%d", &punkty[i].x);

Innego formatu używasz w pierwszym scanfie, a w drugim innego formatu. Pytam tak z czystej ciekawości.

komentarz 10 stycznia 2016 przez Sebastian R Obywatel (1,110 p.)
racja, to jest pierwszy błąd, taka literówka czy coś :D
komentarz 10 stycznia 2016 przez drek Gaduła (4,980 p.)
edycja 10 stycznia 2016 przez drek

Poprawiłem nieco ten kod do stanu w którym można go skompilować... Działa ok. Tak mi się przynajmniej wydaje....

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cstdio>

using namespace std;

struct Punkt
{
    double x;
    double y;
 
};
void wypelnienie(Punkt *tab, int rozmiar)
{
    for (int i = 0; i < rozmiar; i++)
    {
        printf("Wpisz punkt X%d", i+1);
        scanf("%lf", &(tab[i].x));
        printf("Wpisz punkt Y%d", i+1);
        scanf("%lf", &(tab[i].y));
    }
    for (int i = 0; i < rozmiar; i++)
    {
        printf("\ntablica[%d].x %f", i, tab[i].x);
        printf("\ntablica[%d].y %f", i, tab[i].y);
    }
    getchar();
    getchar();
}
double dwapunkty(Punkt *punkty)
{
    double wynik;
    for (int i = 0; i < 2; i++)
    {
        printf("Wpisz wartosc punktu X%d:", i + 1);
            scanf("%lf", &punkty[i].x);
        printf("Wpisz wartosc punktu Y%d:", i + 1);
            scanf("%lf", &punkty[i].y);
    }
    wynik = pow(pow(punkty[0].x - punkty[1].x, 2.) + pow(punkty[0].y - punkty[1].y, 2.), (1 / 2.));
    cout << "wynik: " << wynik << endl;
    return wynik;
}
int main()
{
    srand(time(NULL));
    int  rozmiar;
    char wybor;
    Punkt *tab;
    Punkt *punkty;
    printf("wpiszcie tutaj rozmiar tablicy: ");
    scanf("%d", &rozmiar);
    tab = (Punkt*)calloc(rozmiar, sizeof(Punkt));
    punkty = (Punkt*)calloc(2, sizeof(Punkt));
    printf("\nKtore wybierasz?\n1. Wybor losowy\n2.Wpisuj sam kazda komorke.\n");
    cin >> wybor;
     
    switch (wybor)
    {
    case '2':
    {
        printf("\nWypelnienie.\n");
        wypelnienie(tab, rozmiar);
        return 0;
        break;
    }
    default:
    {
        printf("cos zle wpisales/as.");
        break;
    }
    }
    getchar();
    printf("Wszystko zostalo wyczyszczone.\nTablica zaalokowana.");
    printf("Wybierz jedna z opcji.\n1.f. zwraca odległość między zadanymi jako argumenty dwoma punktami\n2. f. sortuje zadaną jako argument tablicę wg odległości punktów od punktu(0.0): ");
    cin >> wybor;
 
    switch (wybor)
    {
    case '1':
    {
        printf("Wynik to: %6.2f\n",dwapunkty(punkty));
        break;
    }
    case '2':
    {
        break;
    }
    }
    Punkt free(*tab);
    return 0;
}

 

Moich uwag nie traktuj jako prawdy objawionej - niema dużego doświadczenia w C/C++.

To co zmieniłem to:

  1. Nie wiem dlaczego w C++ używasz nagłówków i bibliotek z C. Np zamiast <cstdlib> używasz <stdlib.h>. Nie jest to błąd, ale jeśli chcesz używać waniliowego C, to po prostu używaj C, a nie C++.
  2. Dodałem using namespace std; aby nie pisać std::cośtam
  3. Znów zamiast C++ strumieni używasz scanf ... Pamiętaj, że jeśli używasz najpierw 'scanf' a później 'getchar' to ten drugi po prostu pobierze znak '\n' bez czekania na wprowadzenie danych przez użytkownika.
  4. Dla typów "double" używa się formatu "lf"np: scanf("%lf", &blabla)
  5. Jeśli chcesz aby Twój kod działał na wielu platformach (np. Windows, Linux etc..) to unikaj konstrukcji typu "system("polecenie");", bo np. na linuksie standardowo niema polecenia "pause", i już Twój program nie będzie działał tak samo jeśli go skompilujesz np. pod linuksem.
  6. Popraw swój kod, bo działanie programu nie odpowiada temu co drukujesz na ekranie. Na pewno nie ułatwi Ci to pracy z takim kodem. Nie warto sobie robić pod górkę i utrudniać sobie zadania - lepiej trzymaj kod czysty i prosty - zaprocentuje Ci to w przyszłości.
  7. Aż wreszcie czytaj co Ci wypluwa kompilator. On jest Twoim przyjacielem i napisze Ci gdzie w której linii i dlaczego masz błąd.
komentarz 10 stycznia 2016 przez Sebastian R Obywatel (1,110 p.)
Bardzo dziękuje za radę, aczkolwiek próbuje pisać w C, a nie C++, piszę w visualu, bo na nim zaczęliśmy pisać na laboratoriach.

Co do conio.h, to po prostu chcę, aby pobierał automatycznie opcję, bez naciskania entera.

Coś co nad czym powinienem popracować to czytelność kodu i znajomość bibliotek.
komentarz 10 stycznia 2016 przez drek Gaduła (4,980 p.)
Co do C powiem krótko. Kompilator C++ nie ułatwi Ci pisania w czystym C. Lepiej abyś skonfigurował Visuala w ten sposób aby był wywoływany kompilator do C a nie C++.

Ale w końcu udało Ci się rozwiązać problem? Bo widzę, że inne pytanie dotyczące tego programu zostało zamknięte z tagiem "rozwiązane".
komentarz 11 stycznia 2016 przez Sebastian R Obywatel (1,110 p.)
Tak, udało mi się rozwiązać problem, również z ograniczeniem bibliotek i przejrzystością kodu. :) Bardzo dziękuje ;)

Podobne pytania

0 głosów
0 odpowiedzi 128 wizyt
pytanie zadane 10 stycznia 2016 w C i C++ przez Sebastian R Obywatel (1,110 p.)
0 głosów
1 odpowiedź 844 wizyt
0 głosów
1 odpowiedź 505 wizyt
pytanie zadane 1 listopada 2016 w C i C++ przez michal121954 Początkujący (260 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...