[C]Nie działający for

0

Otóż mam program, który wygląda w ten sposób:

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
//Typ strukturalny piramidy
typedef struct
{
	int KLOCEK_a, KLOCEK_h, KLOCEK_m, KLOCEK_v;
	int PIRAMIDA_KLOCKI_a, PIRAMIDA_a, PIRAMIDA_KLOCKI_h, PIRAMIDA_h, PIRAMIDA_KLOCKI_n, PIRAMIDA_m, PIRAMIDA_v;
	int NIEWOLNICY, CZAS;
} s_piramida;
//Typ strukturalny poziomu piramidy
typedef struct
{
	int wysNPM, ilKLOCKOW, objPOZIOM, mPOZIOM;
} s_poziom;
//Funkcja rekurencyjna licząca ilość bloków w piramidzie
int iloscKLOCKOW(int H)
{
	int ilKLOCKOW;
	if(H == 1) return 1;
	ilKLOCKOW = (H*H) + iloscKLOCKOW(H-1);
	return ilKLOCKOW;
}
//Funkcja obliczająca wielkości piramidy
s_piramida piramida_oblicz(s_piramida POBRANE)
{
	s_piramida PIRAMIDA;
	PIRAMIDA.KLOCEK_a = POBRANE.KLOCEK_a;
	PIRAMIDA.KLOCEK_h = POBRANE.KLOCEK_h;
	PIRAMIDA.KLOCEK_m = POBRANE.KLOCEK_m;
	PIRAMIDA.KLOCEK_v = POBRANE.KLOCEK_a*POBRANE.KLOCEK_a*POBRANE.KLOCEK_h;
	PIRAMIDA.NIEWOLNICY = POBRANE.NIEWOLNICY;
	PIRAMIDA.PIRAMIDA_KLOCKI_a = POBRANE.PIRAMIDA_KLOCKI_h;
	PIRAMIDA.PIRAMIDA_KLOCKI_h = POBRANE.PIRAMIDA_KLOCKI_h;
	PIRAMIDA.PIRAMIDA_a = POBRANE.PIRAMIDA_KLOCKI_h*POBRANE.KLOCEK_a;
	PIRAMIDA.PIRAMIDA_h = POBRANE.PIRAMIDA_KLOCKI_h*POBRANE.KLOCEK_h;
	PIRAMIDA.PIRAMIDA_KLOCKI_n = iloscKLOCKOW(POBRANE.PIRAMIDA_KLOCKI_h);
	PIRAMIDA.PIRAMIDA_m = PIRAMIDA.PIRAMIDA_KLOCKI_n*POBRANE.KLOCEK_m;
	PIRAMIDA.PIRAMIDA_v = PIRAMIDA.PIRAMIDA_KLOCKI_n*PIRAMIDA.KLOCEK_v;
	PIRAMIDA.CZAS = (PIRAMIDA.PIRAMIDA_KLOCKI_n/(PIRAMIDA.NIEWOLNICY/10))*3;
	if(PIRAMIDA.CZAS < 1)
	{
		PIRAMIDA.CZAS = 1;
	}
	return PIRAMIDA;
}
//Funkcja obliczająca wielkości poziomu priamidy
s_poziom poziom_oblicz(int H, int H2, s_piramida POBRANE)
{
	s_poziom POZIOM;
	POZIOM.wysNPM = POBRANE.KLOCEK_h * H;
	POZIOM.ilKLOCKOW = H2 * H2;
	POZIOM.mPOZIOM = POZIOM.ilKLOCKOW * POBRANE.KLOCEK_m;
	POZIOM.objPOZIOM = POZIOM.ilKLOCKOW * POBRANE.KLOCEK_v;
	return POZIOM;
}
//Funkcja pobierająca dane odnosnie piramidy
s_piramida pobierz()
{
	s_piramida POBIERANIE;
	printf("Podaj parametry pojedynczego bloku skalnego:\n");
	printf("Szerokosc(w m): ");
	scanf("%i", &POBIERANIE.KLOCEK_a);
	printf("Wysokosc(w m): ");
	scanf("%i", &POBIERANIE.KLOCEK_h);
	printf("Mase(w kg): ");
	scanf("%i", &POBIERANIE.KLOCEK_m);
	printf("Podaj parapmetry piramidy:\n");
	printf("Ilosc pieter: ");
	scanf("%i", &POBIERANIE.PIRAMIDA_KLOCKI_h);
	printf("Ilosc niewolnikow pracujacych przy budowie: ");
	scanf("%i", &POBIERANIE.NIEWOLNICY);
	fflush(stdin);
	return POBIERANIE;
}
//Funkcja zapisująca dane do pliku
void zapis(s_piramida PIRAMIDA)
{
}
//Funkcja odpowiadająca za główną częśc programu
void piramida()
{
	char Faraon[100];
	printf("Podaj imie Faraona: ");
	scanf("%s", Faraon);
	s_piramida POBRANE = pobierz();
	s_piramida PIRAMIDA = piramida_oblicz(POBRANE);
	printf("||WYPISYWANIE DANYCH ODNOSNIE PIRAMIDY||\n");
	printf("Dane piramidy:\nNazwa: Piramida %sa\nIlosc blokow skalnych uzytych do jej budowy: %i\nWysokosc: %im\nWymiar podstawy: %imx%im\nObjetosc: %im^3\nCiezar: %ikg\nNiewolnicy ktorzy przy niej pracowali: %i\nCzas powstawania: %i dni\n\n", Faraon, PIRAMIDA.PIRAMIDA_KLOCKI_n, PIRAMIDA.PIRAMIDA_h, PIRAMIDA.PIRAMIDA_a, PIRAMIDA.PIRAMIDA_a, PIRAMIDA.PIRAMIDA_v, PIRAMIDA.PIRAMIDA_m, PIRAMIDA.NIEWOLNICY, PIRAMIDA.CZAS);
	int H = PIRAMIDA.PIRAMIDA_KLOCKI_h;
	s_poziom *POZIOM;
	POZIOM = (s_poziom*)malloc(sizeof(s_poziom)*H);
	int i;
	int j = H;
	for(i=0;i<H;i++)
	{
		POZIOM[i] = poziom_oblicz(i+1, j, PIRAMIDA);
		j--;
	}
	for(i=0;i<H;i++)
	{
		printf("||WYPISYWANIE DANYCH ODNOSNIE POZIOMU %i PIRAMIDY||\n", i+1);
		printf("Wysokosc nad poziomem moza na ktorej znajduje sie poziom: %i\n", i, POZIOM[i].wysNPM);
        printf("Ilosc klockow z ktorych zbodowany jest poziom: %i\n", i, POZIOM[i].ilKLOCKOW);
        printf("Objetosc poziomu: %i\n", i, POZIOM[i].objPOZIOM);
        printf("Waga poziomu: %i\n\n", i, POZIOM[i].mPOZIOM);
	}
	free(POZIOM);
	zapis(PIRAMIDA);
}
int main()
{
	piramida();
	system("PAUSE");
	return 0;
} 

Chodzi o to, że funkcja for która ma mi przypisać dane poziomu do tablicy nie działa. No i w tym tkwi mój problem. Proszę pomóżcie.

0

Nie działa to znaczy co się dzieje po wyjściu z pętli?

Tak swoją drogą - więcej caps locka się nie dało? :D

POZIOM[i] = poziom_oblicz(i+1, j, PIRAMIDA);
 j--;

Zamiast tego wystarczyło by:

POZIOM[i] = poziom_oblicz(i+1, H-i, PIRAMIDA);

Ale to jako ciekawostka

0

Program z nieznanych mi przyczyn nawet do pętli nie chce wejść. Przechodziłem program krok po kroku i tą pętlę mi po prostu przeskakiwało. A z tym caps lockiem to tak jakoś.

0

O_o jak to nie chce wejść do pętli? W sensie, że wpisujesz dane, a potem od razu przechodzi do zapisania piramidy?

Jeśli chcesz pisać w C, bo widzę, że próbujesz, to wszystkie zmienne musisz deklarować na początku funkcji. Do tego system("pause") raczej się nie używa do zatrzymania programu. Już prędzej daj tam getch() lub inną, podobną funkcję.

0

Właściwie to program po wykonaniu wygląda w ten sposób:

Podaj imie Faraona: sdf
Podaj parametry pojedynczego bloku skalnego:
Szerokosc(w m): 1
Wysokosc(w m): 1
Mase(w kg): 1
Podaj parapmetry piramidy:
Ilosc pieter: 2
Ilosc niewolnikow pracujacych przy budowie: 12
||WYPISYWANIE DANYCH ODNOSNIE PIRAMIDY||
Dane piramidy:
Nazwa: Piramida sdfa
Ilosc blokow skalnych uzytych do jej budowy: 5
Wysokosc: 2m
Wymiar podstawy: 2mx2m
Objetosc: 5m^3
Ciezar: 5kg
Niewolnicy ktorzy przy niej pracowali: 12
Czas powstawania: 15 dni

||WYPISYWANIE DANYCH ODNOSNIE POZIOMU 1 PIRAMIDY||
Wysokosc nad poziomem moza na ktorej znajduje sie poziom: 0
Ilosc klockow z ktorych zbodowany jest poziom: 0
Objetosc poziomu: 0
Waga poziomu: 0

||WYPISYWANIE DANYCH ODNOSNIE POZIOMU 2 PIRAMIDY||
Wysokosc nad poziomem moza na ktorej znajduje sie poziom: 1
Ilosc klockow z ktorych zbodowany jest poziom: 1
Objetosc poziomu: 1
Waga poziomu: 1

Z tego można zauważyć, że nie wykonuje tylko tej jednej pętli. Wszystko pozostałe jest ok. Dodam jeszcze że program kompilowałem za pomocą zarówno Deva jak i MS Visuala.

0

A sprawdzałeś jakie jest H przed pętlą?

0

Dobra teraz jest inaczej przerobiłem program do tego stanu jaki jest niżej i teraz wiem już, że do pętli for wchodzi i oblicza dane poprawnie, jednak nadal nie wiem czemu ale wypisuje zły wynik.

void piramida()
{
	char Faraon[100];
	printf("Podaj imie Faraona: ");
	scanf("%s", Faraon);
	s_piramida POBRANE = pobierz();
	s_piramida PIRAMIDA = piramida_oblicz(POBRANE);
	int i;
	int j = PIRAMIDA.PIRAMIDA_KLOCKI_h;
	s_poziom *POZIOM;
	POZIOM = (s_poziom*)malloc(sizeof(s_poziom)*PIRAMIDA.PIRAMIDA_KLOCKI_h);
	printf("||WYPISYWANIE DANYCH ODNOSNIE PIRAMIDY||\n");
	printf("Dane piramidy:\nNazwa: Piramida %sa\nIlosc blokow skalnych uzytych do jej budowy: %i\nWysokosc: %im\nWymiar podstawy: %imx%im\nObjetosc: %im^3\nCiezar: %ikg\nNiewolnicy ktorzy przy niej pracowali: %i\nCzas powstawania: %i dni\n\n", Faraon, PIRAMIDA.PIRAMIDA_KLOCKI_n, PIRAMIDA.PIRAMIDA_h, PIRAMIDA.PIRAMIDA_a, PIRAMIDA.PIRAMIDA_a, PIRAMIDA.PIRAMIDA_v, PIRAMIDA.PIRAMIDA_m, PIRAMIDA.NIEWOLNICY, PIRAMIDA.CZAS);
	for(i=0;i<PIRAMIDA.PIRAMIDA_KLOCKI_h;i++)
	{
		POZIOM[i] = poziom_oblicz(i+1, j, PIRAMIDA);
		j--;
	}
	for(i=0;i<PIRAMIDA.PIRAMIDA_KLOCKI_h;i++)
	{
		printf("||WYPISYWANIE DANYCH ODNOSNIE POZIOMU %i PIRAMIDY||\n", i+1);
		printf("Wysokosc nad poziomem moza na ktorej znajduje sie poziom: %i\n", i, POZIOM[i].wysNPM);
        printf("Ilosc klockow z ktorych zbodowany jest poziom: %i\n", i, POZIOM[i].ilKLOCKOW);
        printf("Objetosc poziomu: %i\n", i, POZIOM[i].objPOZIOM);
        printf("Waga poziomu: %i\n\n", i, POZIOM[i].mPOZIOM);
	}
	free(POZIOM);
	zapis(PIRAMIDA);
} 
0

Źle wypisuje, bo we wszystkich printfach masz tylko jedną zmienną typu integer, a w argumentach dwie. Chodzi mi np o:

printf("Wysokosc nad poziomem moza na ktorej znajduje sie poziom: %i\n", i, POZIOM[i].wysNPM);

na końcu zdania masz %i, więc printf wstawi tam wartość ze zmiennej, która ma być liczbą, więc pobierze sobie wartość 'i'. POZIOM[i].wysNPM zostanie po prostu pominięte.

0

Też już to zauważyłem. I właśnie miałem pisać, że problem rozwiązany. Ale cóż poradzić najgłupsze błędy najtrudniej dostrzec:D

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