Programiranje

Programiranje u C-u - od svega pomalo

mbaksa pon 30.5.2011 21:41

Mislim da bi n trebao biti neke male duljine jer inače te znamenke ne bi mogao pretvoriti u broj i računati s takvim brojem. A program zahtijeva matematičke operacije. Odnosno, trebao bi implementirati i svoj algoritam za zbrajanje brojeva koji su zapisani kao stringovi.

 

Osim toga, traži se da se učita n-znamenkasti broj, a ne niz od n znamenki. Tako da se osoba koja je sastavila ili zadala zadatak nema što buniti. {#}

ja čovjek pon 30.5.2011 21:54

Rjesenje malo prije navedenog zadatka.

 

#include<iostream>

 

#include<cstdio>

#include<cmath>

#include<cstdlib>

#include<cstring>

#include<algorithm>

using namespace std;

char buff[500];

int a[500],b[500];

int main(){

   scanf(" %s", buff);

   sort(buff, buff+strlen(buff));

   for (int i=0; buff[i]; ++i){

     b[strlen(buff)-1-i]=a[i]=buff[i]-'0';

   }

   for (int i=0; buff[i]; ++i){

     a[i]+=b[i];

     a[i+1]+=a[i]/10;

     a[i]%=10;

   }

   for (int i=0; buff[i]; ++i){

     printf("%d", a[i]);

     if (!buff[i+1]&&a[i+1]) printf("%d", a[i+1]);

   }

   printf("\n");

 

   return 0;

}

 

Slash 666 pon 30.5.2011 22:05
mbaksa kaže...

Mislim da bi n trebao biti neke male duljine jer inače te znamenke ne bi mogao pretvoriti u broj i računati s takvim brojem. A program zahtijeva matematičke operacije. Odnosno, trebao bi implementirati i svoj algoritam za zbrajanje brojeva koji su zapisani kao stringovi.

 

Osim toga, traži se da se učita n-znamenkasti broj, a ne niz od n znamenki. Tako da se osoba koja je sastavila ili zadala zadatak nema što buniti. {#}

 

A ne znam, više od 6, 7 znamenaka teško da će imat.

 

ja čovjek kaže...

Rjesenje malo prije navedenog zadatka.

 

#include<iostream>

 

}

 

 

Hvala na ovome Čovječe, ali pola ovih naredbi ne znam, kao što sam već naveo.

Sve što znam su if, for, strlen. Pomalo jadno za treći razred tehničara za računalstvo kad bolje pogledaš.

rustweaver pon 30.5.2011 22:19
Slash 666 kaže...
Hvala na ovome Čovječe, ali pola ovih naredbi ne znam, kao što sam već naveo.

Sve što znam su if, for, strlen. Pomalo jadno za treći razred tehničara za računalstvo kad bolje pogledaš.

Da zato si otkantao i ono moje rijesenje na prosloj stranici :P

Evo ti prosirena verzija, sada vise uopce nije citko, ali se ne koristi nista sto ti nisi ucio, pa neka ti je Bog na pomoci...

Prva petlja - kopira string, kad vec ne smijes koristiti memcpy i strcpy

Druge dvije petlje, sortiraju string

Poslijednje tri petlje, pretvaraju string u broj, u biti slicno sto i atoi samo primitivnije...

 

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

int main()
{
    long broj, brojX, brojY, n, mnozitelj;
    char broj_c[100], brojX_c[100], brojY_c[100], c, temp;
  
    printf("Upisi neki broj: ");
    scanf("%s", broj_c);
   
    n=0;
    while (broj_c[n])
    {
          brojX_c[n]=broj_c[n];
          brojY_c[n]=broj_c[n];
          n++;         
    }
    brojX_c[n]=0;
    brojY_c[n]=0;
   
    c=1;
    while(c)
    {
          c=0;
          n=0;
          while(brojX_c[n+1]!=0)
          {
              if (brojX_c[n]>brojX_c[n+1])
              {
                 temp=brojX_c[n];
                 brojX_c[n]=brojX_c[n+1];
                 brojX_c[n+1]=temp;
                 c=1;
              }
              n++;
          }
    
    }
   
    c=1;
    while (c)
    {
          c=0;
          n=0;
          while(brojY_c[n+1]!=0)
          {
              if (brojY_c[n]<brojY_c[n+1])
              {
                 temp=brojY_c[n];
                 brojY_c[n]=brojY_c[n+1];
                 brojY_c[n+1]=temp;
                 c=1;
              }
              n++;
          }
    
    }
  
    mnozitelj=1;
    broj=0;
    for (n=strlen(broj_c)-1; n>=0; n--)
    {
        broj+=(broj_c[n]-48)*mnozitelj;
        mnozitelj*=10;
    }
   
    mnozitelj=1;
    brojX=0;
    for (n=strlen(brojX_c)-1; n>=0; n--)
    {
        brojX+=(brojX_c[n]-48)*mnozitelj;
        mnozitelj*=10;
    }
   
    mnozitelj=1;
    brojY=0;
    for (n=strlen(brojY_c)-1; n>=0; n--)
    {
        brojY+=(brojY_c[n]-48)*mnozitelj;
        mnozitelj*=10;
    }
  
    printf("\nBroj je: %d\nNajmanji broj je: %d\nNajveci broj je: %d\n", broj, brojX, brojY);
    printf("Zbroj najmanjeg i najveceg broja je: %d\n", brojX+brojY);
  
    system("pause");
    return 0;
}

 

Cak sam malo i for petlje preradio pa sada i mbaksa bude sretan, ali ne sumnjam da ce vec naci neki drugi propust...

Radi dobro do 9 znamenkastih brojeva, sa 10 znamenkastim mi se dogada overflow negdje, ali mi se sada ne da naganjavati ga...

Floki pon 30.5.2011 22:22

Može i ovako, s tim da vrši provjeru je li upisan integer, ako nije traži ponovni upis:

 

 

#include <iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>

void Najmanji(char* niz)
{
    int i, j;
    char pom;
    for(i=0; i < strlen(niz)-1; i++)
    {
       for(j=0; j< strlen(niz)-1-i; j++)
       {
          if(niz[j+1]  < niz[j])
          {
             pom = niz[j];
             niz[j] = niz[j+1];
             niz[j+1] = pom;
          }
       }
    }

}
void Najveci(char* niz)
{
    int i, j;
    char pom;
    for(i=0; i < strlen(niz)-1; i++)
       for(j=0; j< strlen(niz)-1-i; j++)
       {
          if(niz[j+1] > niz[j])
          {
             pom = niz[j];
             niz[j] = niz[j+1];
             niz[j+1] = pom;
          }
       }

}

int main()
{
    char niz[50];
    int najmanji, najveci, i, pom;
    do
    {
    printf("Unesi broj: ");
    scanf("%s", niz);
    pom = 0;
    for(i=0; i< strlen(niz); i++)
    {
       if(!isdigit(niz[i]))
       {
          pom = 1;
       }
    }
    }while(pom);
    Najmanji(niz);
    najmanji = atoi(niz);
    Najveci(niz);
    najveci = atoi(niz);
    printf("Rezultat: %d", najmanji + najveci);
    return 0;
}
  

rustweaver pon 30.5.2011 22:33
Slash 666 kaže...

Hvala vam od srca.

Ne znam ni sam kad bi ovo sam rješio.

A to što ne znam ništa osim if, for i strlen nije moja krivica.

Problem je samo... ti to moras u testu napisati? Ne bi trebao strebati tudji kôd napamet, nego ga znati sâm napisati od nule... tj. moras znati sto program zapravo radi (algoritam), tada ces lagano i sam moci napisati nesto slicno.

Floki pon 30.5.2011 22:34
Slash 666 kaže...

Hvala vam od srca.

Ne znam ni sam kad bi ovo sam rješio.

A to što ne znam ništa osim if, for i strlen nije moja krivica.

to ti je čak dosta za ovo - samo dodati bubble sort metod i foru da koristiš dekadske vrijednosti char znakova + atoi funkcija

Slash 666 pon 30.5.2011 22:34

Znam, nit ne planiram napamet štrebat. Samo pokušavam to shvatit, a pošto nikako ne mogu to sam rješit, od nečega moram krenut.

Ostale zadatke još i kužim. Sve je super dok ne treba to u kod prenijeti. Trebam poraditi na tome.

 

EDIT: @floki

Rado, ali nemam pojma o čemu pričaš. Naime, nismo to UOPĆE učili.

Ako netko ima nekakav link do osnova u C-u, neka slobodno podjeli ovdje.

Ja sam tražio ali uvijek naletim na neke funkcije koje nikad u životu nisam vidio.

rustweaver pon 30.5.2011 22:43
mbaksa kaže...

Ekipa - niste primijetili jednu jako bitnu stvar. Najveći i najmanji broj su "inverzni". Ako otkriješ jednog, drugi je ovaj prvi samo zapisan od kraja prema početki.

xD

 

Sad se osjecam glupo...

Ah dobro, jedno sortiranje manje-vise.

Floki pon 30.5.2011 22:46
mbaksa kaže...

Ekipa - niste primijetili jednu jako bitnu stvar. Najveći i najmanji broj su "inverzni". Ako otkriješ jednog, drugi je ovaj prvi samo zapisan od kraja prema početki.

istina - ali kod bubble sorta što radim - iskopiam metod i obrnem znak < u >, he, he, manje posla nego pisati inverzni metod

rustweaver pon 30.5.2011 22:46
Slash 666 kaže...

E, i sad, ako je taj broj u stringu, kako ga mogu u int izvući, da ga sa %10 pocjepam i obrnem znamenke?

Zasto bi ga u int pretvarao? Pa lakse ti je raditi sa znakovima u stringu, ne?

 

Postupak je jednostavan, uzimas prvi element i zadnji element pa ih zamijenis, pa onda drugi element i predzadnji element pa ih zamijenis, do ne dodes do sredine, pa i taj srednji znak zamijenis sa tim istim srednjim znakom...

 

A mozes i sa dva polja ici, pa drugo polje samo punis unatrag i dobijes inverziju...

Slash 666 pon 30.5.2011 22:49

Ajmo reći da je A[100] prvi string, a B[100] drugi.

Imam broj 123 u stringu A.

Sad da ga učitam u B, B[0]=A[2]...i tako dalje.

Teoriju kužim.

Ali problem je napisati to, da funkcionira za bilo koji n broj.

Dobro, ne sad od 10000000 znamenaka ali, barem do 6, 7 znamenaka.

mbaksa pon 30.5.2011 22:55
Floki kaže...
mbaksa kaže...

Ekipa - niste primijetili jednu jako bitnu stvar. Najveći i najmanji broj su "inverzni". Ako otkriješ jednog, drugi je ovaj prvi samo zapisan od kraja prema početki.

istina - ali kod bubble sorta što radim - iskopiam metod i obrnem znak < u >, he, he, manje posla nego pisati inverzni metod

Ts, ts, ts.

 

Sad kad mi već mozak radi 100 na sat, vidi ovo:

 

void Najmanji(char* niz, char smjer){    int i, j;    char pom;    for(i=0; i < strlen(niz)-1; i++)    {       for(j=0; j< strlen(niz)-1-i; j++)       {          if(niz[j+1]*smjer  < niz[j]*smjer)          {             pom = niz[j];             niz[j] = niz[j+1];             niz[j+1] = pom;          }       }    }}

 

Argument smjer može biti 1 ili -1 - ako je jedan, sortira se od najmanjeg prema najvećem, ako je -1, obratno.

rustweaver pon 30.5.2011 23:01
Slash 666 kaže...

Ajmo reći da je A[100] prvi string, a B[100] drugi.

Imam broj 123 u stringu A.

Sad da ga učitam u B, B[0]=A[2]...i tako dalje.

Teoriju kužim.

Ali problem je napisati to, da funkcionira za bilo koji n broj.

Dobro, ne sad od 10000000 znamenaka ali, barem do 6, 7 znamenaka.

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

int main()
{
    char tekst[10]="Slash 666", temp;
    int n1, n2;
   
    n1=0;
    n2=strlen(tekst)-1;
   
    while (n1<n2)
    {
          temp=tekst[n1];
          tekst[n1]=tekst[n2];
          tekst[n2]=temp;
          n1++;
          n2--;
    }
   
    printf("%s\n", tekst);
    system("pause");  
    return 0;
}

Okrece stringove koliko god hoces duge...

bandito sri 1.6.2011 14:30

Molio bih da mi odgovorite sto mi je krivo jer mi za svaki broj različit od nula vraca nula

evo koda:

 

#include <stdio.h>

double CN (int n){
if (n==0) return 5;
else if (n>0){return (((2*n)+3 )/((4*n)+7))*CN(n-1);}
}

int main()
{
    int n;
    scanf("%d",&n);
    printf("%g\n",CN(n));
    return 0;
}

mbaksa sri 1.6.2011 14:59
bandito kaže...

Molio bih da mi odgovorite sto mi je krivo jer mi za svaki broj različit od nula vraca nula

evo koda:

 

#include <stdio.h>

double CN (int n){
if (n==0) return 5;
else if (n>0){return (((2*n)+3 )/((4*n)+7))*CN(n-1);}
}

int main()
{
    int n;
    scanf("%d",&n);
    printf("%g\n",CN(n));
    return 0;
}

Prvi broj u izrazu ti je tipa int, što znači da će cijeli izraz biti izračunat tako da se rezultat sprema u int. Dakle, prvi broj ti treba biti double - znači, dodaš točku iza dva.

 

else if (n>0){return (((2.*n)+3 )/((4*n)+7))*CN(n-1);}

 

Ili možeš napraviti casting u double.

Zhawk sri 1.6.2011 15:00

Promjeni int n u double.

I neka funkcija prima double.

 

Ili brže rješenje castaj si jedan od argumenata kod returna u double kao npr. :

else if (n>0){return (((double)(2*n)+3 )/((4*n)+7))*CN(n-1);

mbaksa sri 1.6.2011 15:11
Zhawk kaže...
Ili brže rješenje castaj si jedan od argumenata kod returna u double kao npr. :

else if (n>0){return (((double)(2*n)+3 )/((4*n)+7))*CN(n-1);

Jedan -> PRVI. Zašto? Množenje i zbrajanje je OK, ali ako si već došao do dijeljenja i castaš ovo iza znaka za dijeljenje, rezultat će biti 0, jer je djeljenik int, a ne double. Treba jako biti oprezan s tim. Zato uvijek castašprvi pa si siguran (osim ako 100% nisi siguran u to što radiš).

Zhawk sri 1.6.2011 15:29

Zainteresirao si me sa ovime pa sam bacio brzi google. Nažalost nisam našao zadovoljavajuć odgovor.

Meni se čini da je ovo što si ti rekao vezano uz kompajler, koristim gcc koji ovo handla bez problema.

Tj. nisam nigdje našao da se u ANSI C-u govori o ovome. Vjerojatno nisam dovoljno istražio pošto sad nemam vremena ali na par mjesta sam našao info da je svejedno koji se casta.

 

Dodatak: http://stackoverflow.com/questions/2976011/how-do-you-divide-two-integers-and-get-a-decimal-answer

 

bandito sri 1.6.2011 16:39

Evo ja se opet javljam posto ste mi lijepo odgovorili:

imam dva zadatka koja mi ne rade kao ali ja neznam što je problem

edit: ovaj prvi sam sredio

U ovom drugom treba ispisati rijeci naopako i svaku šestu izbrisati a treba ih ispisati tako da idu jedan za drugom sa samo jednim razmakom a meni ovaj verifikator sto provjerava mi javlja gresku..

 

 

 

2.

Zadatak 2.

Napišite program koji učitava jednu liniju teksta s najviše 14826 znakova. Tom tekstu treba izbrisati svaku 6. riječ, a ostalima izokrenuti redoslijed slova (same riječi ostaju u originalnom poretku). Tako dobiveni tekst treba ispisati.
Možete pretpostaviti da tekst sadrži samo slova i razmake.

 

 

2.kod

#include<stdio.h>#include<ctype.h>#include<string.h>#include<stdlib.h>int brojac( char s[], int i ){while(1){    if(s[i]=='\0')    return i;    if(isblank(s[i])==1)    return i;    i++;        }return i;}

void zamjeni(char a[] ,int prvi_clan,int zadnji_clan){char temp;    while(prvi_clan<zadnji_clan){        temp=a[prvi_clan];        a[prvi_clan]=a[zadnji_clan];        a[zadnji_clan]=temp;        prvi_clan+=1;        zadnji_clan-=1;        }}

void makni_rijec(char a[], int prvi_clan, int j ){    while(a[j]!='\0'){    a[prvi_clan-1]=a[j];    prvi_clan++;    j++;    }a[prvi_clan]='\0';}
int main(){int prvi_clan=0, zadnji_clan=0;int i=0, br_rijeci=0, j;char a[14826];gets(a);while ( a[i] != '\0'){if(!isblank(a[i])){    br_rijeci++if(br_rijeci==6){    j=brojac(a, i);    makni_rijec(a , prvi_clan, j );    br_rijeci=0;    i++;                }else{    i=brojac(a, i);    zamjeni(a, prvi_clan, i-1);    prvi_clan=i-1;}}else    i++;prvi_clan++;}    puts(a);    return 0;}