Nauka programowania w C - analiza programu.

Nauka programowania w C - analiza programu.
rincewind
  • Rejestracja: dni
  • Ostatnio: dni
0

Zmienna p określa ci, kiedy pojawia się linia pozioma — przed nią masz p pojedynczych gwiazdek (linia pionowa) i po linii poziomej również masz pionową długości p. Najprostszym rozwiązaniem byłoby:

  1. wypisanie linii pionowej długości p (p linii, w każdej p spacji i gwiazdka),
  2. wypisanie linii poziomej krzyża (x gwiazdek)
  3. wypisanie reszty krzyża (to samo, co w punkcie 1.).
P9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Dzięki kolega Shalom :). Widzę że jeszcze sporo nauki przede mną :(. Ale przynajmniej dziś rozumiem już kod. Faktycznie, rozwiązanie było banalnie proste. Widocznie jeszcze mam za mało takiego wyczucia i analitycznego myślenia. Miejmy nadzieje że to przyjdzie jeszcze z czasem.

rincewind
  • Rejestracja: dni
  • Ostatnio: dni
0

Jeszcze kod:

Kopiuj
#include <stdio.h>
#include <conio.h>

void print_series(char c, int n)
{
    int i;
    for (i = 0; i < n; ++i)
        printf("%c", c);
}

void print_vertical_line(int n)
{
    print_series(' ', n);
    printf("*\n");
}

int main()
{
    int i, x, p;
 
    printf("Ile gwiazdek? ");
    scanf("%d", &x);

    if (x % 2 == 0)
    {
        printf("Podaj nieparzysta liczbe gwiazdek.\n");
        return 1;
    }
    
    p = x / 2;
    
    /* wypisanie przed poziomą linią */
    print_vertical_line(p);
    
    /* wypisanie poziomej linii */
    print_series('*', x);
    printf("\n");
    
    /* wypisanie reszty (po poziomej linii) */
    print_vertical_line(p);
    
    fflush(stdin);
    getch();
    return 0;
}
P9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

A skoro jesteśmy już przy temacie to pozwolę sobie zapytać. Jak to właściwie jest z tym dzieleniem liczby nieparzystej przez 2? Faktycznie wtedy z automatu jest brana podłoga takiego dzielenia? Sorki że pytam ale chcę po prostu to na przyszłość wiedzieć.

I jeszcze jedno pytanko. Słuchajcie, czy warto porywać się na początek na rysowanie deltoidu czy to może być dla mnie za bardzo skomplikowane? Powiem szczerze że tak myślę na razie teoretycznie jakby to można napisać i nie mam pojęcia. Dlatego chciałem Was zapytać czy ta figura faktycznie może okazać się skomplikowana czy nie ma w niej nic trudnego i wystarczy pomyśleć :)

P9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Mam panowie kolejny problem. Tym razem porzuciłem już rysowanie i postanowiłem zająć się operacjami na liczbach. Wymyśliłem sobie program który wyświetli mi maximum z "k" podanych liczb. Wygląda to tak że po uruchomieniu programu, podaję ile licz chcę wpisać a następnie rozpoczynam wpisywanie liczb po kolei: liczba 1, liczba 2 etc aż ilość tych liczb będzie równa ilości którą wcześniej wpisałem. Do tej pory program wygląda tak:

Kopiuj
 
#include <stdio.h>
#include <conio.h>

int main ()
{
   int i,x,k,p,max;
   printf("Sume ile liczb chcesz policzyc?: ");
   scanf("%d",&k);
   i=1;
   p=0;
   while (i<=k) {
	   printf("Podaj liczbe numer %d :",i);
	   scanf("%d",&x);
	   i++;
	  }
   i=1;

           fflush(stdin);
           getch();
           return 0;
           }

To działa bez problemu. Co teraz chcę zrobić? A więc pomysł oczywiście mam. Po zakończeniu tej pętli while służącej do podawania liczb chcę zrobić ponownie i=1 i wykonać pętle while dopóki i<=k następnie za max przypisać pierwszą z liczb, zwiększyć i o jeden i przejść do następnej liczby, porównać ją z moim maxem i załóżmy że ta liczba druga jest większa więc podstawiam ją pod zmienną max, zwiększam licznik o 1, biorę 3 liczbę porównuję ją z tym moim maxem, jeśli jest mniejsza pozostawiam bez zmian, jeśli większa to ta liczba staje się maxem itd. Wydaje mi się że sam pomysł może być dobry tylko pojawia się problem, w jaki sposób mam się dobrać do tych liczb, szczególnie do tych 2 pierwszych. Gdybyście mogli podpowiedzieć to byłbym wdzięczny.

---EDIT---
Zrobiłem słuchajcie coś takiego:

Kopiuj
 
#include <stdio.h>
#include <conio.h>

int main ()
{
   int i,x,k,max;
   printf("Sume ile liczb chcesz policzyc?: ");
   scanf("%d",&k);
   i=1;
   
   while (i<=k) {
	   printf("Podaj liczbe numer %d :",i);
	   scanf("%d",&x);
	   i++;
	  }
   i=1;
 
   while (i<=k) {
	   max=x;
	   i++;
	   if (max<x) {
		   max=x;
	   
	   }
   }
printf("\n\nMax z %d liczb wynosi %d",k,max);
           fflush(stdin);
           getch();
           return 0;
           }

Ale mimo wszystko to nie działa. Wziąłem debugowanie i w momencie gdy przypisuję pod zmienną max, x to przypisywana zostaje ostatnia liczba jaką wpisuję i ona się nie zmienia i później jako maxa na końcu wyrzuca mi ostatnią wpisaną liczbę. Problem mam wyłącznie z tym że nie wiem w jaki sposób mam się odwołać np do pierwszej wpisanej liczby którą następnie dam jako max i będę porównywał za każdą kolejną wpisaną liczbą. Jeśli Ktoś potrafi pomóc to bardzo bym prosił o wskazówkę.

ST
  • Rejestracja: dni
  • Ostatnio: dni
0

To chcesz liczyć sumę tych liczb, czy chcesz znaleźć maksimum? ;)

Potrzebujesz skorzystać z tablicy, gdzie zapiszesz sobie poszczególne liczby podane z klawiatury i iterując po tej tablicy będziesz mógł sobie porównywać i szukać swojego maxa. Jednak można też nie korzystać z tablicy i porównywać od razu podczas wpisywania liczb z klawiatury, czyli bez tej drugiej pętli.

P9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Nie nie, chcę policzyć maksimum z podanych liczb. A czy bardzo musiał bym zmodyfikować swój program aby można było robić to porównywanie przy pomocy tablicy?

EDIT
Na razie kombinuję jakby to zrobić podczas wpisywania ale niestety mi nie wychodzi. Próbuję dalej, nie poddaję się :). Jakbym naprawdę nie dał rady to dam tu swój kod to zerkniecie :).

adf88
  • Rejestracja: dni
  • Ostatnio: dni
0

Dzieje się źle dlatego, że wczytujesz kolejne wartości ciągle do jednej i tej samej zmiennej (x). Wczytując kolejną liczbę nadpisujesz wartość poprzedniej, poprzednia wartość jest tracona bezpowrotnie. Rozwiązaniem będzie połączenie tych dwóch pętli w jedną. W środku jednej pętli zrób obydwie rzeczy - wczytaj zmienną i sprawdź czy jest największa z dotychczas wprowadzonych.

Dla ułatwienia na początku możesz za maksimum przyjąć INT_MIN (nagłówek limits.h). Jako że ta wartość jest najmniejszą z możliwych zostanie ona podmieniona już przez pierwszą z wprowadzonych liczb.

P9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Panowie, udało się zrobić :). Prześledziłem dokładnie debuggera i okazało się że znaczniki są pozamykane nie w tych miejscach co trzeba i źle się pętle wykonywały to raz a dwa w nieodpowiednim miejscu zwiększałem i. Robiłem to w pętli przez co miałem efekt taki że pomimo iż wpisałem że chcę policzyć max z 5 liczb to mnie prosiło o podanie 6 liczb. Po przejściu debuggerem błąd wykryłem i naprawiłem. Echhh, marny ze mnie programista będzie skoro tak banalne błędy popełniam :(. Poniżej daję kod tego mojego programu:

Kopiuj
 
#include <stdio.h>
#include <conio.h>

int main ()
{
   int i,x,k,max;
   printf("Sume ile liczb chcesz policzyc?: ");
   scanf("%d",&k);
   i=1;
   max=0;
   while (i=1) {
	   printf("Podaj liczbe numer %d :",i);
	   scanf("%d",&x);
   x=max;
   i++;
    
while (i<=k) {
printf("Podaj liczbe numer %d :",i);
	  scanf("%d",&x);
		  if (x>max) {
			  max=x;
		  }
		  i++;
}   
printf("\n\nMax z %d liczb wynosi %d",k,max);
           fflush(stdin);
           getch();
           return 0;
           
   }
}
P9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

A jednak nie działa :(. Gdy maksymalną wartość wpisuję na pierwszej pozycji to mi nie pokazuje jej jako maxa tylko jako max pokazuje maksymalną wartość z tych wpisanych na pozostałych pozycjach. Podpowiecie gdzie tkwi błąd?

adf88
  • Rejestracja: dni
  • Ostatnio: dni
0

okazało się że znaczniki są pozamykane nie w tych miejscach co trzeba
Rób prawidłowe wcięcia. Poprawnie formatuj kod. To na prawdę pomaga.

Jeśli pętla ma się wykonać tylko raz to po co w ogóle pętla?

Kopiuj
/* wczytujemy pierwszą wartość i przyjmujemy ją za maksimum */
puts("Podaj liczbe numer 1 :");
scanf("%d", &max);

/* wczytujemy kolejne wartości i sprawdzamy je */
for (i = 2; i <= k; i++) {
   printf("Podaj liczbe numer %d :", i);
   scanf("%d", &x);
   if (x > max) max = x;
}

Możesz też wykorzystać INT_MIN tak jak sugerowałem, kod się nieco uprości, rozgraniczenie na liczbę pierwszą i liczby pozostałe nie będzie potrzebne:

Kopiuj
max = INT_MIN;
for (i = 1; i <= k; i++) {
   printf("Podaj liczbe numer %d :", i);
   scanf("%d", &x);
   if (x > max) max = x;
}

Alternatywnie możesz sprawdzać, czy "i==1" (pierwsza liczba ma być bezwzględnie przyjęta za maksimum):

Kopiuj
for (i = 1; i <= k; i++) {
   printf("Podaj liczbe numer %d :", i);
   scanf("%d", &x);
   if (i == 1 || x > max) max = x;
}
P9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Błąd naprawiłem!! Okazał się być banalny. Tam jak miałem to pierwsze przypisanie x=max; powinno być na odwrót czyli max=x; Po tej zmianie wszystko działa. Aż dziwne że to ma takie znaczenie ale widać ma. Nawet chyba wiem czemu. Bo wcześniej jak inicjalizował zmienną max to ją zerowałem i w momencie gdy robiłem przypisanie x=max to pod zmienną max wstawiało mi 0 i dlatego nie pokazywało mi maxa gdy był on na pierwej pozycji. Za dużo tych błędów robię :(.

adf88
  • Rejestracja: dni
  • Ostatnio: dni
0
peter90 napisał(a)

Za dużo tych błędów robię :(.
Aj tam, dobrze ci idzie. Tak trzymać ;) .

P9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

No nie wiem. Do maxa jeszcze powrócę przy uczeniu się tablic. Dziś robię przerwę a od jutra męczę algorytmy :). Zacznę od NWD, następnie może Euklides, później może jakieś sortowanie. Dalej pójdzie chyba nauka tablic. W razie jakichś problemów będę pisał choć postaram się aby było ich coraz mniej :).

P9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Witam.
Dziś udało mi się napisać po raz pierwszy program bez żadnego błędu. Na początku sobie go rozplanowałem na kartce i przemyślałem algorytm a następnie przeniosłem to na kod, wklepałem i wszystko od razu bez błędnie działało. Co prawda program bardzo banalny ale od czegoś zacząć trzeba. Jest to program obliczający n-ty wyraz ciągu fibonacciego. Poniżej wklejam kod i chciałem Was prosić o zerknięcie i powiedzenie czy program jest napisany zgodnie ze sztuką programowania bo to również ma jednak znaczenie.

Kopiuj
 
#include <stdio.h>
#include <conio.h>

int main ()
{
   int i,a1,a2,x,n;
   printf("Ktory wyraz ciagu Fibonacci'ego chcesz policzyc?: ");
   scanf("%d",&n);
   i=1;
   a1=1;
   a2=1;
   x=0;
   
   while (i<=n) {
	   x=a2+a1;
	   a1=a2;
	   a2=x;
	   i++;
   }
printf("\n\n%d wyraz ciagu Fibonaccie'go wynosi %d",n,x);
           fflush(stdin);
           getch();
           return 0;
}

-----EDIT-----

A to moje kolejne dzieło:

Kopiuj
 
#include <stdio.h>
#include <conio.h>

int main ()
{
   int i,j,n,m,z,k,l;
   printf("Podaj liczbe linii: ");
   scanf("%d",&n);
   printf("Podaj liczbe galezi: ");
   scanf("%d",&k);
   m=n;
   z=m;

   for(l=1; l<=k; l++) {
	m=n;
   z=m;
   for(i=1; i<m; i++)
	   printf(" ");
   printf("*\n");
   m--;

 for(i=1; i<n; i++) {
	for(j=1; j<m; j++)
		printf(" "); 
   for(j=m; j<=z+1; j++)
				printf("*");
				printf("\n");
	m--;
	z++;
   }
   
   }
   
           fflush(stdin);
           getch();
           return 0;
           
   
}

Efekt działania programu jest taki jak w załączniku. Pewnie dało by radę zrobić to prościej ale ja się cieszę że w ogóle mi się takie zadanie udało wykonać i wszystko działa poprawnie :). Muszę przyznać że już te wszystkie zmienne zaczynam wyczuwać i piszę wszystko z automatu. Ten program również praktycznie wyszedł mi bez większych zmian. Było tam kilka błędów w rysunku ale to były drobne błędy i w sumie to robiłem zaledwie 4 poprawki co również mnie cieszy bo wcześniej napisanie prostego programu zajmowało mi sporo czasu i głowiłem się co i jak a teraz powoli zaczyna iść gładko. Jeszcze jutro trochę popiszę sobie tego typu programów a od soboty chyba zabieram się za tablice :).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.