C pierwszy program kalkulator

C pierwszy program kalkulator
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

próbowałem robić coś z pętlą FOR, ale nie mogę jej zrozumieć
mam za zadanie zrobić kalkulator liczący potęgi i silnie oraz rysunki typu trójkąty, romby czy kwadraty z gwiazdek

mam jakiś kod na potęgę ale go niemego zrozumieć mógłby mi ktoś to spróbować wytłumaczyć??

Kopiuj
{
        int a, b, c, i;

        printf("podaj liczbe potegowana:");
        scanf("%d", &a);
        fflush(stdin);

        printf("Podaj wykladnik potegi:");
        scanf("%d", &b);
        fflush(stdin);

        c=a;

        for (i=1; i<b; i++)
        {
             c=c*a;

        }
        printf("a^b=%d", c);
        system("pause");
        return 0;
}
aurel
  • Rejestracja: dni
  • Ostatnio: dni
0

Jeżeli liczymy a^b (a do potęgi b) oznacza to tyle, że musimy b razy pomnożyć przez siebie a.
Przykład:
4^3 = 444

Dlatego też w pętli for(i=1; i<b i++) - od jeden, bo pierwszą 4 już mamy, do b, bo jeszcze tyle razy trzeba ją pomnożyć.

c=a aby przechować tą wartość. Gdybyśmy operowali cały czas na a, wartość a by się zmieniała - przez co byśmy uzyskali coś takiego:
416256

zamiast
444

Więc w a przechowujemy wartość przez którą mnożymy, a b - 1 razy trzeba ją pomnożyć.

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

nie mogę tego zrozumieć, w przypadku tej pętli to zawsze muszę używać 'i', bo w tym przypadku to nie wiem po co jest potrzebne??

pomoże mi ktoś z tym??, bo naprawdę nie daje sobie z tym rady

i jeszcze jedno, dalej nie rozumiem dlaczego c=a skoro c to jest wynik, a nie na przykład i=a

LG
  • Rejestracja: dni
  • Ostatnio: dni
0

Ponieważ i kontroluję do której potęgi jest podniesiona podstawa. Czyli ai . i nie może być równo zero ponieważ a0 =1 czyli ciągle będzie 1. Żeby wiedzieć co mnożyć iloczyn tymczasowy zapisujesz w c i mnożysz o kolejny czynnik potęgi, jak długo - to reguluje warunek pętli czyli wykładnik w - czy i już jest tyle równe.

Kopiuj
int power(int a , int w) // zwraca a^w
{

   int c=a;

   for(int i=1;i<w;i++) // jeśli lubisz kombinację to można zrobić for(int i=w;i>0;i--) jest ważne, żeby zrozumieć że 
      c*=a;                   // nie trzeba zwiększać bo przydaje się to w operacji na pamięci
   
   return c;

}
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0
Kopiuj
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int a, b, c, i;

        printf("podaj liczbe potegowana:");
        scanf("%d", &a);
        fflush(stdin);

        printf("Podaj wykladnik potegi:");
        scanf("%d", &b);
        fflush(stdin);

        c=a;

        for (i=1; i<b; i++)
        {
                c=c*a;
        }

        printf("%d do potegi %d = %d \n",a, b, c);
        system("pause");
        return 0;
}

więc a=4, b=2, c=a^b

ale potem jest ze c=a (dalej niemego zrozumieć dlaczego akurat c=a)
w dalszej części c=ca czyli c=aa (nie kumam co do tego wszystkiego ma i)
i skoro c=ca czyli c=aa to po co przypisywać a do c

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6968
0

Narysuj sobie tabelki przebiegu dla obu przypadków to się dowiesz...

a=2, b=3;
c=a; // czyli 2
porównanie c=aa | c=ca

  1. c=22=4 | c=22=4;
  2. c=22=4 | c=42=8;

Przed pętlą jest tylko inicjacja zmiennej c, bo byś mnożył przez co bądź lub zero :D

LG
  • Rejestracja: dni
  • Ostatnio: dni
0

bo do ku*(...) nędzy c*=a czyli c=a*a jest tylko w pierwszej iteracji !

2^4

Iteracja 0
c=2
a=2
i=1

ai = 21 = 2 = c - true

Iteracja 1
c=4
a=2
i=2

ai = 22 = 4 = c - true

Iteracja 2
c=8
a=2
i=3

ai = 23 = 8 = c - true

Iteracja 3
c=16
a=2
i=4

ai = 24 = 16 = c - true

Jeśli tego nie rozumiesz to jesteś chory na chorobę zjadającą 90% społeczeństwa.

Jak byś zrobił a=a*a to byś miał kolejno

a=2 stan początkowy
a=4 iteracja 1
a=16 iteracja 2
a=256 iteracja 3
...

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

a=2, b=3;
c=a; // czyli 2
porównanie c=aa | c=ca

  1. c=22=4 | c=22=4;
  2. c=22=4 | c=42=8;

i coś takiego trzeba było odrazy walić, teraz już rozumiem dlaczego c=a (tylko dlaczego akurat c a nie coś innego np dlaczego nie zrobić np g alb z)

tylko dalej nie wiem dlaczego jest w pętli użyte 'i', skoro w działaniu 'i' nie występuje.

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6968
0

Jakiś musi być iterator dla pętli, licznik obrotów. Może to być dowolna nazwa zmiennej, jednak ludzie najbardziej lubią i, bo się kojarzy z iteratorem, indeksem (tablicy) itp. Zmienna c ma taką nazwę, żeby było a,b,c :D Nazwy nie mają żadnego znaczenia, ważne, żeby były zapisane zgodnie ze składnią języka.

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

Chyba zaczynam rozumieć napisałem kalkulator obliczający silnie (n!)

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

int main(void)
{
        int i, a,  silnia;
        silnia=1;

        printf("Podaj wartosc silni: ");
        scanf("%d", &a);
        fflush(stdin);

        for(i=1; i<=a; i++)
        {
                silnia=silnia*i;
        }

        printf("%d! wynosi: %d \n", a, silnia);

        system("pause");
}
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

mam kolejny problem a mianowicie muszę się nauczyć rysowanie różnych figur z *

mam tu jakiś kod na trójkąt prostokątny, ale pada w nim 2 razy pętla for i już zaczynam się gubić

Kopiuj
{
        int i, j, a;

        printf("Podaj bok a = ");
        scanf("%d",&a);
        fflush(stdin);
        for (i = 0; i < a; i++)
        {
                for (j = 0; j <= i; j++)
                printf("*");
                printf("\n");
        }
                printf("\n");

        system("pause");
}

w zasadzie to nie rozumiem jak już dochodzi do drugiej linijki to czemu daje dwie gwiazdki **, oraz po co dwie pętle

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

no nie wiem jak to mam rozpisać żeby zrozumieć
dla mnie to jest tak że powinny być te gwiazdki w słupku

Kopiuj
 for (i = 0; i < a; i++)
        {
                for (j = 0; j <= i; j++)
                printf("*");
                printf("\n");

próbuje to analizować ale dochodzę do tego samego

np a=5
i=0 0<5 prawda leci dalej
j=0 0<=0 prawda lecimy dalej
dochodzimy do printf więc leci gwiazdka
potem i++ więc
i=1 1<5 prawda lecimy dalej
j=1 1<=1 prawda lecimy dalej
dochodzimy do printf i leci gwiazdka

według mnie wygląda to tak

Kopiuj
*
*

a nie

Kopiuj
*
**
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0
Kopiuj
for (i = 0; i < a; i++)
        {
                for (j = 0; j <= i; j++)
                printf("*");
                printf("\n");

czyli mam to rozumieć tak
dla a=5

i=0; 0<5 prawda lecimy dalej
j=0; 0<=0 prawda lecimy do printf i leci *
j=1; 1<=0 nieprawda wracamy do pierwszej pętli
i=1; 1<5 prawda lecimy dalej
j=0; 0<=1 prawda leci *
j=1; 1<=1 prawda leci *
j=2; 2<=1 nieprawda wracam do pierwszej pętli i tak w kółko
tak to mam rozumieć??

i jeżeli tak jest jeszcze jedna żecz

według tego ca napisałem powinno to iść tak

Kopiuj
*\n
*\n*\n

czyli w rezultacie było by

Kopiuj
*
*
*

a powinno wyglądać tak

Kopiuj
*\n
**\n

nie wiem czy to dobrze wyjaśniłem ale widzę to tak ze jak jest prawda
to idzie do pierwszego printf a potem do drugie i zaczyna pętle od nowa
a w praktyce jest tak ze ten \n działa dopiero jak wychodzi fałsz w pętli

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

jak w pierwszej jak usunąłem printf("\n"); z po tej pętli gdzie jest j (mi to wygląda na druga pętle) to mam gwiazdki w rzędzie

pyzatym chyba mnie źle zrozumiałeś bo jak mam printf("*");a zaraz po tym printf("\n"); więc powinien zrobić \n\n czyli gwiazdki w słupek a w praktyce jest

Kopiuj
**\n ***\n 

a jak usnę ten printf(\n) i zrobię tak printf("*\n") to dopiero układają się w słupek

mi to cały czas wygląda tak że napisze mi * idzie dalej z kodem i dochodzi \n i wraca do pętli sprawdza argumenty i poklei idzie do printfa pisze * idzie dalej i daje \n czyli w słupek ma sie układać

nie odpisujesz więc napisze to jeszcze raz by chyba mnie nie możesz zrozumieć

np a=5
i=0 0<5 prawda leci dalej
j=0 0<=0 prawda lecimy dalej
dochodzimy do printf więc leci * potem jest następny printf więc leci \n
czyli jest tak

Kopiuj
*\n

na razie jest dobrze
potem j=1 1<=0 nieprawda wracamy pętle wyżej
i=1 1<5 prawda lecimy dalej
j=0 0<=1 prawda lecimy dalej
dochodzimy do printf więc leci * potem jest następny printf więc leci \n
potem jest j=1 1<=1 prawda wiec idziemy dalej i mamy
dochodzimy do printf więc leci * potem jest następny printf więc leci \n
czyli wygląda mi to tak

Kopiuj
*\n*\n

i tak wkółko

czy jest to tak

Kopiuj
*\n
*\n*\n

przynajmniej tak rozumiem tan kod po printf(\n) jest ewidentnie pod ta druga pętlą

Kopiuj
 for (i = 0; i < a; i++)
        {
                for (j = 0; j <= i; j++)
                printf("*");
                printf("\n");
        }

a ma być tak

Kopiuj
*\n
**\n

ale coś takiego jest już ok więc czemu ten pierwszy kod też działa jak powinien

Kopiuj
for (i = 0; i < a; i++)
        {
                for (j = 0; j <= i; j++)
                {
                        printf("*");
                }
                printf("\n");
        }
iooi
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 573
0

Oba kody są takie same, ten pierwszy jest tylko źle sformatowany. C to nie Python.

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

chyba zaczynam kapować
zrobiłem sobie program rysujący kwadra i pusty kwadrat potem z prostokątem i trójkątem prostokątnym
ale próbuje teraz zrobić romb i jest problem

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

int main(void)
{
        int a, i, j, k;

        printf("podaj dlugosc boku: ");
        scanf("%d", &a);
        fflush(stdin);

        for(i=0; i<a; i++)
        {
                for(j=0; j<a-1; j++)
                {
                        printf("  ");
                }
                for(k=0; k<a; k++)
                {
                        printf("* ");
                }
                printf("\n");
        }

        system("pause");

        return 0;
}

według mnie ta część przy każdym obiegu powinna wyświetlać o jedną spacje mniej a wyświetla ciągle tyle samo

Kopiuj
 for(j=0; j<a-1; j++)
                {
                        printf("  ");
                }
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

ok mam tu inny problem jak zrobić żeby 'j' przy każdym nowy obiegu pierwszej pętli zaczynało z wartością wyżej

zrobiłem tak że j=i bo i jest zawsze większe przy nowym obiegu, i jest tak jak chciałem, ale czy jest możliwe żeby zapisać to inaczej oraz cały program z wykorzystaniem tylko 2 lub 1 pętli ??

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

napisałem sobie kod który wyświetla trójkąt równo ramienny, i nie mogę go przerobić tak aby wyświetlał ten trójkąt pusty w środku

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

int main(void)
{
        int a, i, j;

        printf("podaj wysokosc: ");
        scanf("%d", &a);
        fflush(stdin);

        for(i=0; i<a; i++)
        {
                for(j=0; j<=a+i; j++ )
                {
                        if(j<a-i)
                        {
                                printf(" ");
                        }
                        else
                        {
                                if(j > a-i && j < a+i)
                                {
                                        printf(" ");
                                }
                                else
                                {
                                        printf("*");
                                }
                        }

                }

                printf("\n");
        }

        system("pause");

        return 0;
}

ostania linijka tez jest pusta a powinna być z gwiazdek

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6968
0
Kopiuj
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
        int a, i, j;
 
        printf("podaj wysokosc: ");
        scanf("%d", &a);
        fflush(stdin);
 
        for(i=0; i<a; i++)
        {
                for(j=0; j<=a+i; j++ )
                {
                        if (((i<a-1)&&((j<a-i) || ((j>a-i) && (j<a+i)))) || (j==0))
                        {
                                printf(" ");
                        }
                        else
                        {
                                printf("*");
                        }
                }
                printf("\n");
        }
        system("pause");
        return 0;
}

Trochę przekombinowany warunek, ale działa :D

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

Po prostu, żeby mieć pewność co do poprawności zapisanych warunków...

nawet jeśli nie wiemy czy najpierw jest porównanie czy operacje logiczne, to spokojnie można założyć że && jest przed ||, tak samo jak mnożenie jest na pewno przed dodawaniem.

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0
Kopiuj
+-----+
|     |
|     |
+-----+

potrzebny i program rysujący cos takiego

ZJ
  • Rejestracja: dni
  • Ostatnio: dni
0

Proszę bardzo, działający kod:

Kopiuj
 
str= "+"+5*"-"+"+\n"
print str+2*("|"+5*" "+"|\n")+str
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

robie to tak jak na razie

Kopiuj
int a, b, i, j;

        printf("podaj dlugosc boku a (wysokosc): ");
        scanf("%d", &a);
        fflush(stdin);

        printf("podaj dlugosc boku b (dlugosc): ");
        scanf("%d", &b);
        fflush(stdin);

        for(i=0; i<a; i++)
        {
                for(j=0; j<b; j++)
                {
                        if(i > 0 && i != a-1 && j != 0 && j != b-1)
                        {
                                printf(" ");
                        }
                        else if(j<=0 && j>=a-1)
                        {
                                printf("|");
                        }
                        else
                        {
                                printf("-");
                        }
                }

                printf("\n");
        }

        system("pause");

return 0;

}
  • Rejestracja: dni
  • Ostatnio: dni
0

co mam dopisać żeby to działało ?
int ab,c
cout<<"Podaj a: " ;
cin>>a;
cout<<"Podaj b: ";
cin>>b;
c=a+b;
cout<<"suma = "<< c<< endl

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0
jaaaa napisał(a):

co mam dopisać żeby to działało ?
int ab,c
cout<<"Podaj a: " ;
cin>>a;
cout<<"Podaj b: ";
cin>>b;
c=a+b;
cout<<"suma = "<< c<< endl

Zacząłbym od przeczytania kursu/książki i nauki czytania ze zrozumieniem, ew.kupna dodatkowo okularów.

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
0
jaaaa napisał(a):

co mam dopisać żeby to działało ?
int ab,c
cout<<"Podaj a: " ;
cin>>a;
cout<<"Podaj b: ";
cin>>b;
c=a+b;
cout<<"suma = "<< c<< endl

Na dobry początek proponuję przeczytać komunikat błędu...

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.