Użycie zmiennej lokalnej gdzie indziej, pętle while i for

0

Witam.

To są moje początki z programowaniem, właściwie dopiero bawię się któryś tydzień a dokładniej to może z siódmą albo ósmą godzinę z racji tego, że mam programowanie w C w programie studiów.

Tutaj stworzyłem mały program liczący silnię aczkolwiek w ramach polecenia na ćwiczeniach były dwa dodatkowe kroki, które niestety nie wiem jak wykonać.

  1. Zmodyfikuj program w taki sposób, aby zmienna n była zadeklarowana jako zmienna lokalna wewnątrz funkcji main.
  2. Zmodyfikuj program aby użyć pętli while zamiast for.
#include <stdio.h>
#include <math.h>
void ReadN();
void Calculate();
void PrintN();
int d, n, fact = 1;
void main()
{
	ReadN();
	Calculate();
	PrintN();
}

void ReadN()
{
	printf("Wprowadz liczbe n: ");
		scanf_s("%d", &n);
}
void Calculate()
{
	for (d = 1; d <= n; d++)
		fact = fact*d;
}
void PrintN()
{
	printf("Twoja silnia to: %d\n:", fact);
}
  1. Nie wiem jak zrobić tak, aby zmienną lokalną można było użyć w innym "przedziale" tego kodu (czyli z main np w Calculate()).

Proszę o pomoc i z góry dziękuję :)

2

Ad. 2

Pętla for działa tak: przed pierwszym przebiegiem pętli wykona się d=1, przed każdym przebiegiem będzie się sprawdzał warunek d <= n, a pod koniec każdego przebiegu wykona się d++.

While pozwala Ci zawrzeć sprawdzanie warunku w instrukcji. Operację d=1 wyrzucasz przed pętlę (by wykonała się na początku), operację d++ zamieszczasz explicite jako ostatnią operację każdego przebiegu. Działa?

Ad. 1

Umiesz przekazywać parametry do funkcji? Jeśli nie, to poczytaj o tym. Choćby w jakimś internetowym tutorialu.

1
  1. Należy przekazać zmienną do funkcji. Przeczytaj dowolny tutorial o funkcji w C++.

  2. Taki kod

for (COS1; COS2; COS3)

jest równoważny

COS1;
while (COS2)
{
    ...
    COS3;
}
0

Dziękuję za szybką odpowiedź i o ile drugie rozumiem tak pierwszy punkt nadal jest dla mnie czarną magią... Widać ciężko mi to będzie szło - patrze na ten --> http://we.pb.edu.pl/~jforenc/2012_2013_02/INF1_08Z.pdf - poradnik. Rozumiem że mam użyć "2.2. Przekazywanie parametrów do funkcji przez wskaźnik" tego podpunktu gdyż poprzedni nic nie zmienia, tak? Czyli co, muszę zmienić kod o tak?

#include <stdio.h>
#include <math.h>
void ReadN();
void Calculate();
void PrintN();
int d, fact = 1;
void main()
{
	int n;
	printf("give n:\n");
		scanf_s("%d", &n);
	Calculate(&n);
	PrintN(&n);
}

void ReadN(int *n)
{
	printf("Wprowadz liczbe n: ");
		scanf_s("%d", &n);
}
void Calculate(int *n)
{
	for (d = 1; d <= n; d++)
		fact = fact*d;
}
void PrintN(int *n)
{
	printf("Twoja silnia to: %d\n:", fact);
}
 

Nie działa, coś mieszam... jakby ktoś mógł mi pomóc wpisując te pare linijek poprawnego kodu do pierwszego to z chęcią bym przeanalizował :/

1
void foo(int bar)
{
    printf("%d\n", bar);
}

int main()
{
    int x = 5;    
    foo(x);
}
0
#include <stdio.h>
#include <math.h>
void Calculate();
void PrintN();
int d, fact = 1;
void main()
{
	int n;
	printf("Give the number n:\n");
		scanf_s("%d", &n);
		Calculate(n);
		PrintN(n);
}

void Calculate(int n)
{
	for (d = 1; d <= n; d++)
		fact = fact*d;
}
void PrintN(int n)
{
	printf("Twoja silnia to: %d\n:", n);
}

Nadal nie działa, heh...
Wyrzuca mi błędy:

Severity Code Description Project File Line
Error C2660 'PrintN': function does not take 1 arguments

Severity Code Description Project File Line
Error C2660 'Calculate': function does not take 1 arguments

Z powyższego postu rozumiem że jeżeli wewnątrz funkcji main zdefiniuję zmienna całkowitą x równą 5 i zadeklaruje foo(x) czyli w funkcji void foo zmienna całkowita b stanie się x'em czyli 5, tak?

0

Nie wiem jakiego wyniku oczekujesz, skoro w Calculate modyfikujesz fact, a potem wypisujesz n.
Poza tym, nie używaj zmiennych globalnych, przekazuj parametry do funkcji.

void Calculate();
void PrintN();

void Calculate(int n)
void PrintN(int *n)

trochę się różnią, nie sądzisz?
No i coś się uczepił tych wskaźników, zostaw je w spokoju, przekaż argumenty normalnie bo potrzebujesz jedynie wartości.

0
#include <stdio.h>
#include <math.h>
void Calculate();
void PrintN();
void main()
{
	int n,fact,d;
	printf("Give the number n:\n");
	scanf_s("%d", &n);
	Calculate(n);
	PrintN(fact);
}

void Calculate(int abc)
{
	int fact, d;
	for (d = 1; d <= abc; d++)
		fact = fact*d;
}
void PrintN(int fact)
{
	printf("Twoja silnia to: %d\n:", fact);
}

Ech, naprawdę już nie mam pojęcia :/

1

Po pierwsze, koloruj kod: Formatowanie treści postów na forum

void Calculate(int abc)
{
    int fact, d;

fact jest lokalną zmienną funkcji Calculate i nie ma nic wspólnego ze zmienną o tej samej nazwie w main.

int calculate(int n)
{
    int result = 1, i;
    for (i = 1; i <= n; ++i)
        result *= i;

    return result;
}

int main()
{
    ...
    fact = calculate(n);
    print(fact);
}
0
#include <stdio.h>
#include <math.h>
void Calculate();
void PrintN();
void main()
{
	int n, fact;
	printf("Give the number n:\n");
	scanf_s("%d", &n);
	fact = Calculate(n);
	PrintN(fact);
}

void Calculate(int n)
{
	int result = 1, i;
	for (i = 1; i <= n; ++i)
		result *= i;
	return result;
}
void PrintN(int fact)
{
	printf("Twoja silnia to: %d\n:", fact);
}

Mój kod wygląda aktualnie tak i wyrzuca 5 błędów... Nie mam pojęcia czemu, rzekomo Calculate i PrintN przyjmują więcej niż 1 argument ;/

http://iv.pl/images/84297344595436046806.png

2

masz deklaracje funkcji PrintN jako bezargumentowa (4 linijka w kodzie)
a definicje masz ze przyjmuje argument.

Zamiast "pomocy, nie wie mco robic pomozcie" po prostu popatrz i na spokojnie zobacz co moze byc zle. Czytaj bledy kompilacji i je GOOGLUJ

0

Deklaracji z tego co rozumiem usunać nie mogę więc muszę zadeklarować już w 4 linijce że będzie miała argument?

2

komputer Ci nie wybuchnie jak bedziesz probowal to naprawic. To nie jest tykajaca bomba. Nie musisz sie pytac doslownie kazdego kroku...

0

Prosze tylko o pomoc bo grzebię i nie mogę rozwiązać...

1

Proszę: http://bfy.tw/2jfE

0
#include <stdio.h>
int silnia(int n);
int main()
{
	int n;
	/* Wprowadzanie zmiennej n*/
	printf("Wprowadź n:\n");
		scanf_s("%d", &n);
		int wynik = silnia(n);
		printf("Oto wynik:%d\n", wynik);
		return 0;
}
/*Funkcja obliczająca n! (n pobierane z funkcji main)*/
int silnia(int n)
{
	int d, fact=1;
	for (d = 1; d <= n; ++d);
	fact *= d;
	return fact;
}

Popróbowałem, wyszło coś takiego tylko zwraca liczbę n+1, czemu? :/

2

Masz średnik po forze. Z tego powodu inkrementujesz d dopóki d <= n, co przestaje być prawdą gdy d = n + 1. Następnie mnożysz fact (1) przez d (n+1), otrzymując n+1 i to zwracasz jako wynik silni.

0

Rzeczywiście, moje niedoświadczone oko nie wychwyciło. Dzięki!

Wrzucam końcowy kod - dziękuję wszystkim jeszcze raz! :)

#include <stdio.h>
int silnia(int n);
int drukuj(int wynik);
int main()
{
	int n;
	/* Wprowadzanie zmiennej n*/
	printf("Wprowadz n:\n");
		scanf_s("%d", &n);
		int wynik = silnia(n);
		drukuj(wynik);
		return 0;
}
/*Funkcja obliczająca n! (n pobierane z funkcji main)*/
int silnia(int n)
{
	int d, fact=1;
	for (d = 1; d <= n; ++d)
	fact *= d;
	return fact;
}
int drukuj(int wynik)
{
	printf("Oto Twoj wynik:%d\n", wynik);
	return wynik;
}

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