Programiranje u C-u - od svega pomalo izdvojena tema

poruka: 1.661
|
čitano: 386.940
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
17 godina
offline
Programiranje u C-u - od svega pomalo

Ako se striktno držimo zadatka koji traži najdulju riječ u rečenici, a mene su nekad davno učili iz hrvatskog da se riječ sastoji od slova, onda to možemo riješiti vrlo jednostavno, sa tri varijable koje prate broj slova, najdulji broj slova i poziciju najduljeg broja slova. Na osnovu te tri pozicije ispišemo riječ slovo po slovo.

 

Što ti je problem sa funkcijama ako znaš u mainu riješiti zadatak? Prenesi broj za prvi zadatak u funkciju po vrijednosti, a ostalo sve slično kao u main funkciji. Za drugi sam prenio niz pokazivačem u funkciju.

 

 

#include<stdio.h>
#include<ctype.h>

void najdulja(char* recenica)
{
   int brojSlovaNajdulja=0, pozicija=0, brojSlova=0;

   for (int i = 0; recenica[i]; i++)
   {
      if (isalpha(recenica[i]))
      {
         brojSlova++;
      }
      else
      {
         if (brojSlovaNajdulja < brojSlova)
         {
            brojSlovaNajdulja = brojSlova;
            pozicija = i - brojSlovaNajdulja;
         }
         brojSlova = 0;
      }
   }
   for (int i = pozicija; i < brojSlovaNajdulja+pozicija ; i++)
      printf_s("%c", recenica[i]);
}

int main()
{
   char recenica[50];
   gets_s(recenica, 50);
   najdulja(recenica);
   return 0;
}

Poruka je uređivana zadnji put sri 26.8.2015 12:36 (Floki).
 
0 0 hvala 0
15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Ja već duže vrijeme pokušavam shvatit jednu jednostavnu stvar u Visual Studiu i Code:Blocks-u a to je kako radit sa više projekata od jedanput. Ono ka, imat više kartica. Valjda znate na šta mislim, tako da zapravo radim više programa odjedanput.

Bia bi nekako i uspia napravit ih ali bi onda stalno buildalo i izvršavalo onaj prvi.

EDIT: Evo uspia sam, ako nekome treba objasnit ću.

 

Sad me zanima kako računat potencije. Ja upišem 2^5 i on to tretira ko 2+5.

EDIT: Rješeno, ne postoji ugrađena funkcija za ovo, tj. postoje neke malo kompliciranije i mora se radit sa floatovima.

Poruka je uređivana zadnji put ned 27.9.2015 2:44 (dr. zlo).
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
dr. zlo kaže...

Ja već duže vrijeme pokušavam shvatit jednu jednostavnu stvar u Visual Studiu i Code:Blocks-u a to je kako radit sa više projekata od jedanput. Ono ka, imat više kartica. Valjda znate na šta mislim, tako da zapravo radim više programa odjedanput.

Bia bi nekako i uspia napravit ih ali bi onda stalno buildalo i izvršavalo onaj prvi.

EDIT: Evo uspia sam, ako nekome treba objasnit ću.

 

Sad me zanima kako računat potencije. Ja upišem 2^5 i on to tretira ko 2+5.

EDIT: Rješeno, ne postoji ugrađena funkcija za ovo, tj. postoje neke malo kompliciranije i mora se radit sa floatovima.

Potencije (bilo kakve) lako izvedeš s funkcijom koja ima jednu for petlju i 2 linije koda unutra.

 

Inače mislim da mat.h library ima pow() funkciju s kojom možeš računat potencije.

--------------------------------------------------------------------------------------------
11 godina
offline
Re: Programiranje u C-u - od svega pomalo
dr. zlo kaže...

Sad me zanima kako računat potencije. Ja upišem 2^5 i on to tretira ko 2+5.

EDIT: Rješeno, ne postoji ugrađena funkcija za ovo, tj. postoje neke malo kompliciranije i mora se radit sa floatovima.

2^5 u C-u nema veze s 2+5, iako si naletio na zgodnu koincidenciju. Inace se radi o bitwise ekskluzivno ILI (XOR) operatoru.

 

Koristi math.h (pow()) ili pocni koristiti C++ pa preoptereti "^". :)

http://www.pci-z.com/
15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Evo šta sam ja napravia za potenciranje:

 

int eksponencijalna_funkcija(int baza, int eks){


int a = baza;

while(eks>=2){
baza*=a;
eks--;

}

return baza;

}

 

Ta pow koliko sam vidia ne radi sa integerima.

 

Poruka je uređivana zadnji put ned 27.9.2015 16:16 (dr. zlo).
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
dr. zlo kaže...

Ta pow koliko sam vidia ne radi sa integerima.

 

 Onda mora da ti nešto nije u redu s očima. A ni ova funkcija nije dobra jer pretpostavlja da je eksponent uvijek prirodni broj.

15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
TracerCPP kaže...

 Onda mora da ti nešto nije u redu s očima. A ni ova funkcija nije dobra jer pretpostavlja da je eksponent uvijek prirodni broj.

okej, malo si arogantan ali hvala na pomoći :) 

 

koristim pow() odsad

 

Poruka je uređivana zadnji put ned 27.9.2015 17:45 (dr. zlo).
15 godina
offline
Re: Programiranje u C-u - od svega pomalo
bbanelli kaže...
dr. zlo kaže...

Sad me zanima kako računat potencije. Ja upišem 2^5 i on to tretira ko 2+5.

EDIT: Rješeno, ne postoji ugrađena funkcija za ovo, tj. postoje neke malo kompliciranije i mora se radit sa floatovima.

2^5 u C-u nema veze s 2+5, iako si naletio na zgodnu koincidenciju. Inace se radi o bitwise ekskluzivno ILI (XOR) operatoru.

 

Koristi math.h (pow()) ili pocni koristiti C++ pa preoptereti "^". :)

 

Dva potencijalna problema s drugim savjetom, barem koliko znam. Ne možeš preopteretiti operator da radi s ugrađenim tipovima, a drugo ne bi trebao taj operator preopterećivati da uopće radi potenciranje. Operator ima smisla preopterećivati samo kada je potpuno jasno kako on djeluje u kontekstu onoga s čime radiš, inače je puno bolje napisati funkciju/metodu sa smislenim imenom, a pogotovo mu ne bi trebalo mijenjati značenje. To što << i >> rade je priča za sebe...

14 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
Arto kaže...

 

Dva potencijalna problema s drugim savjetom, barem koliko znam. Ne možeš preopteretiti operator da radi s ugrađenim tipovima, a drugo ne bi trebao taj operator preopterećivati da uopće radi potenciranje.

 Točno! To je i jedan od razloga zašto ljudi pišu svoje klase u C++u. Primjerice za ovaj slučaj (C++ code):

 

#include <iostream>
using namespace std;

template<class T>
class Broj{
public:
   T broj;
   Broj(T n) : broj(n){}
   Broj operator ^(double n){
      return Broj(pow(broj, n));
   }
};
template<class T> ostream& operator << (ostream& izlaz, const Broj<T>& br){
   izlaz << br.broj;
   return izlaz;
}
int main(){
   Broj<int> i(2);
   Broj<float> f(2.5);

   cout << (i ^ 5) << endl; // 2^5 = 32
   cout << (f ^ 2) << endl; // 2.5^2 = 6.25
   return 0;
}

 

Taman da se malo zagrijem prije početka semestra

 

Arto kaže...

 Operator ima smisla preopterećivati samo kada je potpuno jasno kako on djeluje u kontekstu onoga s čime radiš, inače je puno bolje napisati funkciju/metodu sa smislenim imenom, a pogotovo mu ne bi trebalo mijenjati značenje. To što << i >> rade je priča za sebe...

 

 Nažalost, to je uvijek tako s operatorima. Upravo imaš primjer operatora << i >> koji služe i za bitovno pomicanje i za iostream. Kao da ih je premalo u samom jeziku da bi imai samo jednu svrhu i značenje.

Poruka je uređivana zadnji put ned 27.9.2015 19:06 (TracerCPP).
9 godina
offline
Programiranje u C-u - od svega pomalo

Poz ljudi.

Trebam pomoc oko izrade programa za racunanje standardne devijacije putem ove formule:

 

Ne znam kako bi formirao program da ne moram pisati formulu za svaku odredenu kolicinu mjerenih vrijednosti(u formuli n) nego da program sam napise formulu(ako uopce postoji nacin). Recimo za 3 vrijednosti formula izgleda ovako:

  

U životu je bitno samo jedno, a to su dvije stvari: red, rad i disciplina
Poruka je uređivana zadnji put ned 4.10.2015 14:10 (RuBiK).
Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Prva for petlja neka ti pozbroji sve vrijednosti (Xi-jeve); neka se varijabla zove sum1. Kad zavrsi ta petlja izracunas aritmeticku sredinu: Xs = sum1/N.
Nakon toga odvrtiš još jednu for petlju gdje ćeš pozbrajati sum2=(Xi - Xs)^2  i -> N. Za računanje kvadrata koristi pow funkciju, pow((Xi-Xs),2).

Nakon toga s= sqrt((1/(N-1))*(sum2));

Prije bilo kakvog koristenja varijabli sum1 i sum2; inicijalizirati ih na vrijednost 0!

I moras ubaciti #include <math.h>.

Nadam se da si shvatio, ako ne javi u PM, pa tokom dana odgovorim.

 

 EDIT: Evo ti ispravan program, meni radi, ali ti provjeri samo da li dobro računa devijaciju, jer moglo bi biti da mi je promakla koja logička greška.

 

#include <stdio.h>
#include <math.h>
#define MAX 100 /* ovih 100 možeš mijenjati po potrebi; ako želiš recimo unijeti više od 100 vrijednosti ubaci cca 200 */

int main(){
int N, i;
double br_polje[MAX];
double Sd, Xs, sum1 = 0.0, sum2 = 0.0;
printf("Upisi N:");
scanf("%d", &N);
printf("\nUpisi brojeve:");
for (i = 0; i < N; i++){
   scanf("%lf", &br_polje[i]);
   sum1 += br_polje[i];
}
Xs = sum1 / N;
for (i = 0; i < N; i++)
   sum2 += pow((br_polje[i] - Xs), 2);
Sd = sqrt(((1 / (double)(N - 1))*(sum2)));
printf("\nStandardna devijacija: %.6lf", Sd);
getch();
return 0;
}

Poruka je uređivana zadnji put ned 4.10.2015 22:09 (Master11).
Moj PC  
1 0 hvala 1
12 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
RuBiK kaže...

Poz ljudi.

Trebam pomoc oko izrade programa za racunanje standardne devijacije putem ove formule: 

Ne znam kako bi formirao program da ne moram pisati formulu za svaku odredenu kolicinu mjerenih vrijednosti(u formuli n) nego da program sam napise formulu(ako uopce postoji nacin). Recimo za 3 vrijednosti formula izgleda ovako:  

Evo ovo bi bio nekakav code za to :P, slobodno PM ako ne radi, nisam previše testirao.

 

#include <stdio.h>
#include <math.h>

using namespace std;

double upis[1000000];

int main(){
    int n;
    scanf("%d",&n);
    for(int i =0;i<n;i++){
        scanf("%lf",&upis[i]);
    }
    double xs=0;
    for(int i =0;i<n;i++){
        xs+=upis[i];
    }
    xs/=n;
    double sum1=0;
    for(int i =0;i<n;i++){
        sum1+=pow(upis[i]-xs,2);
    }
    double sum2=0;
    sum2=sqrt((1/(n-1))*sum1);
    printf("%lf",sum2);
    return 0;
}

Poruka je uređivana zadnji put ned 4.10.2015 21:40 (MrGman2000).
9 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Lijep pozdrav svima, ne znam jel ovo jos aktivno al svejedno cu postaviti, dakle zanima me jel mozda ima netko da je zainteresiran biti malo cesce na forumu ovdje i biti u kontaktu sa mnom putem privatnih poruka, novi sam u programiranju i upisao sam fakultet, krenuli smo s C programom pa ja malo zapinjem u odnosu na ostale a tako zelim to savladati i nauciti, naravno samom mi bas i ne ide tako dobro a i gubim bodove na faksu dok ostali skupljaju, ukratko :) . Ako ima tko da uskoci u pomoc mozemo se dogovoriti cak i da mi napise svoj racun pa mu ja stogod prebacim, koju kunu ne bi bilo lose, dakle meni trebaju samo savjeti i instrukcije kako ispravno razmisljati i raditi znaci usmjerenje u te vode, ne trazim ja da mi vi rjesavate zadatke a ja samo da prepisem, ako ste me razumjeli i tko ima volje molim vas da mi se javite, hvala 

 
0 0 hvala 0
15 godina
offline
Re: Programiranje u C-u - od svega pomalo
Zašto kada spremim slovo a u int (što zanm da nije ispravno) program izbacuje da je a 4194432?
You have to be odd to be number one
Moj PC  
0 0 hvala 0
15 godina
offline
Re: Programiranje u C-u - od svega pomalo
I ispisem varijablu u %d formatu
You have to be odd to be number one
14 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Napiši code koji koristiš.

Moj PC  
0 0 hvala 0
15 godina
offline
Programiranje u C-u - od svega pomalo

#include <stdio.h>
int main (void) {
int broj;
scanf("%d",&broj);
printf("%d", broj);
return 0;
}

 

I nakon što unesem a pod varijablu broj (za koju znam da treba biti cijeli broj, namjerno pravim grešku!) program mi izbaci 4194432

Što se dogodilo u pozadini da mi je to izbacio?

You have to be odd to be number one
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

scanf nije type-safe funkcija i zato moraš dati adresu varijable onog tipa koji se i očekuje. U protivnom dobiješ ovakav čudan i nepredvidiv rezultat. Zato se u C++u koristi cin umjesto scanf.

Moj PC  
0 0 hvala 0
15 godina
offline
Programiranje u C-u - od svega pomalo

A što se događa u pozadini?

Zašto baš taj broj?

You have to be odd to be number one
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo

To je neko smeće u memoriji koje se trenutno nalazi na adresi varijable 'broj'. Kada se ne uspije zapisati odgovarajuća vrijednost u tu varijablu on zapravo ispiše to smeće.

15 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Pozdrav!

Treba napravit program tj. funkciju koja računa prosjek negativnih i pozitivnih elemenata niza. Evo ja sam nešto napravia, ali ne radi.

Nemože se kompajlirat, ali kad umjesto else-a stavim if, onda se kompajlira al se odma sruši. Imam jedan error i jedan warning, vidi se na slici.

 

Ovako program radi, tj. ovako san ja zamislia da će radit:

Dakle funkciji se proslijedi pointer na niz, veličina niza, i adresa varijabli za prosjek negativnih i pozitivnih brojeva. Sve negativne brojeve zbrojimo u jednu varijablu a pozitivne u drugu, a istovremeno brojimo koliko je negativnih a koliko pozitivnih. I onda te dvije varijable podijelimo sa brojem pozitivnih/negativnih brojeva i dobijemo prosjek pozitivnih i negativnih brojeva. Ili ne? Ne. Zašto ne?? Šta nevalja? Sigurno će bit neka banalna stvar.

 

Šta me živciraju ove glupe crte, neznam kako da maknet, sry, zalipite u vaš editor.

 

void f(int *p_niz1, int v1, int *prosjek_n, int *prosjek_p)
{
  int i;
  int broj_n=0;
  int broj_p=0;

 

  for(i=0; i<=v1-1; ++i){
    if(*(p_niz1+i)<0){
      *prosjek_n+=*(p_niz1+i);
      ++broj_n;
      }
    else(*(p_niz1+i)>0){
      *prosjek_n+=*(p_niz1+i);
      ++broj_p;
      }
    }
    *prosjek_n/=broj_n;
    *prosjek_p/=broj_p;
}

int main(void)

{
   int niz1[] = {-20, -50, 1, 54, -524, 876, -96, 85, 74, -6, 8};
   int prosjek_n=0;
   int prosjek_p=0;

   int v1=sizeof(niz1)/4;

 

   f(niz1, v1, &prosjek_n, &prosjek_p);

 

   printf("Prosjek negativnih je: %d", prosjek_n);
   printf("Prosjek pozitivnih je: %d", prosjek_p);

 

return 0;
}

Poruka je uređivana zadnji put ned 15.11.2015 2:06 (dr. zlo).
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

@dr_zlo

Prva greska je sto ne koristis ispravno if else .

Uz if ili else if uvijek dolazi uvjet u oblim zagradama ().  Uz else ne dolazi uvjet, jer else je "default" blok, to je dio koda koji ce se izvesti ako i samo ako nista prije nije bilo zadovoljeno. Kako else ne ocekuje uvjet, on je ovaj tvoj dio:

else(*(p_niz1+i)>0){
      *prosjek_n+=*(p_niz1+i);
      ++broj_p;
      }

 

protumacio kao:

 

else (*(p_niz1+i)>0)

{
      *prosjek_n+=*(p_niz1+i);
      ++broj_p;
}

 

Primjecujes gresku? C je tvoj "uvjet" interpretirao kao obicnu naredbu, a svaka naredba zahtjeva ";" na kraju iste. Zato ti je javio tu sintaksnu gresku. Ovaj blok u koji bi se trebalo uci ce on gledati kao neovisni dio koda, koji ne ulazi u "if-else" grananje.
U tvom konkretnom slucaju imas 2 opcije da to ispravis, ili promjeniti ovaj else u else if, ili ces samo izbrisati uvjet i koristit obicni else. 

Imas i dvije semanticku greske.

U ovom else opet povecavas sumu negativnih brojeva, gdje zapravo hoces povecavat sumu pozitvnih tj prosjek_p umjesto prosjek_n. To ti uzrokuje neocekivani rad programa pa ispravi. Inace to je tipicna copy-paste greska, pa u buducnosti budi oprezan s c/p ako nemas na umu sve varijable koje ces izmijenit.

Druga je da spremas prosjeke u int, sto nije bas pametno jer radis cjelobrojno djeljenje. Ti ne mozes znati da ce ti prosjek uvijek biti cjelobrojni broj,a prosjeci najcesce nisu cjelobrojni brojevi, tako da bi bilo bolje ih definirat kao double.

Moj PC  
1 0 hvala 1
15 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
Neutral kaže...

 

 Hvala! Isprvia san, sad je dobro.

9 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

Učitavati u polje maksimalne duljine 20 brojeve s tipkovnice sve dok se ne upiše -1 (sentinel - ne spremiti u polje). Ispisati poruku je li to polje palindrom. Npr. polja {1,5,6,5,1} i {2,3,3,2} su palindromi.

 

Anyone???

 
0 0 hvala 0
16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
frankopan123 kaže...

Učitavati u polje maksimalne duljine 20 brojeve s tipkovnice sve dok se ne upiše -1 (sentinel - ne spremiti u polje). Ispisati poruku je li to polje palindrom. Npr. polja {1,5,6,5,1} i {2,3,3,2} su palindromi.

 

Anyone???

 Koji dio te muči točno? Znaš li unositi brojeve i provjeriti je li unešeni broj -1? Znaš li provjeriti je li niz palindrom?

9 godina
neaktivan
offline
Programiranje u C-u - od svega pomalo

ovaj zadnjii dio kako provjeriti jeli palindrom i kako da mi -1 ne spremi u polje? :/

 
0 0 hvala 0
16 godina
neaktivan
offline
Re: Programiranje u C-u - od svega pomalo
frankopan123 kaže...

ovaj zadnjii dio kako provjeriti jeli palindrom i kako da mi -1 ne spremi u polje? :/

 Možeš prekopirati polje unatrag u drugo polje pa uspoređivati prvi član originala i prvi član kopije, drugi član originala...

 

Ili (bolji način) to radiš odmah u jednoj for petlji, usporediš element "i" i "duljina - i - 1" (jer je na početku "i" = 0 pa bi program puknuo), ako se razlikuju članovi, odmah nije palindrom i možeš prekinuti pretraživanje.

 

A za spremanje u polje - prvo spremi u neku varijablu i provjeri je li broj "-1", ako nije - spremiš ga u polje, ako je - prekidaš učitavanje.

Poruka je uređivana zadnji put sub 21.11.2015 12:56 (Looka).
15 godina
offline
Programiranje u C-u - od svega pomalo

Pravim najjednostavniji program i ne znam zašto crasha

Žao mi je ali ne stignem formatirati tekst

U zadatku se traži da se nađu prosti brojevi tako da se novi broj ispituje djeljenjem s ostalim prostim brojevima u nizu

i ako je prost da ga spremi u niz

 

Crash je u while petlji ai ne znam zašto

 

#include <stdio.h>
#include <math.h>

int main (void) {
int niz[10]={2,3}, i=2, p, a,g=1,n;
while(i<10) {
p=1;
g=1;
n=0;
a=niz[i-1]+2*g;
printf("%d",a);
while(niz[n]<a) {
if (a%niz[n]==0) {
p=0;
break;
}
n++;
}

if(p) {
niz [i] = a;
++i;
}
else g++;
}
for(i=0;i<10;++i) printf("%d. %d\n",i+1,niz[i]);
return 0;
}

You have to be odd to be number one
Poruka je uređivana zadnji put sri 25.11.2015 23:21 (Top Bugovac).
Moj PC  
0 0 hvala 0
12 godina
offline
Re: Programiranje u C-u - od svega pomalo

Niz je inicijaliziran tako da prva dva elementa ima 2 i 3, a ostalo je 0. Dijelis s nulom...
Ili testiraj na 0, ili prati koliko ima ispravnih vrijednosti u nizu, ili inicijaliziraj na nesto tipa max_int za sto znas da ce 'niz[n]<a' uvijek biti false...

17 godina
offline
Programiranje u C-u - od svega pomalo

Dakle, tražimo prvih n prostih brojeva

 

Svi prosti brojevi su neparni brojevi izuzev broja 2 jer su svi parni brojevi djeljivi sa 2, to znači da trebamo provjeravati samo neparne brojeve.

Neparni brojevi nisu djeljivi sa 2, to znači da ne trebamo proveravati ima li neparni broj koji provjeravamo prim faktor 2.

I dalje vrijedi odnos da se jedan od mogućih prim faktora broja kojeg provjeravamo nalazi u intervalu do kvadratnog korijena tog broja ukjlučno [3, sqrt(broj)].

 

 

Kad primjenimo te matematičke premise, dobijemo kod u primjeru za prvih n = 1000 prim brojeva

 

 

#include <stdio.h>


int main()
{
   int n = 1000, testBroj = 3, jeliPrim, mjesto = 2;
   int niz[1000] = { 2, 3 };
   for (; mjesto < n; )
   {
      testBroj += 2;
      jeliPrim = 1;
      for (int j = 1; niz[j]*niz[j] <= testBroj; j++)
         if (testBroj % niz[j] == 0)
            jeliPrim = 0;
      if (jeliPrim)
         niz[mjesto++] = testBroj;
   }
   for (int i = 0; i < n; i++)
      printf("%d ", niz[i]);
   return 0;
}

Poruka je uređivana zadnji put čet 26.11.2015 15:39 (Floki).
 
0 0 hvala 0
Nova poruka
E-mail:
Lozinka:
 
vrh stranice