
Programiranje u C-u - od svega pomalo


Al u tom je slucaju zadatak trivijalan i poprilicno lagan. Ako je n veci, zadatak je 5 minuta za iskodirat.
EDIT: Sad cu krenut kodirat.

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;
}

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.
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š.

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...

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;
}

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.

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.

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

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.

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.

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

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.

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

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...

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.

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.

Pito sam već, ali nitko nije vidio.
Jel ima netko link do neke knjige ili online tutoriala o osnovama C-a?
Ja sam tražio ali uvijek na nešto nerazumljivo naletim.

Nabavi ovu knjigu, provježbaj malo zadatke i položit ćeš vjerojatno
http://www.skolska.com.hr/hrv/page.asp?item=021154&act=add2basket
p.s. nije da nikog hvalim, ali vidim gdje dečko šepa

E svaka čast za ovaj argument sa smjerom, zapamtim to, promjena znaka usporedbe predznakom brojeva uspoređivanja

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...

Nabavi ovu knjigu, provježbaj malo zadatke i položit ćeš vjerojatno
http://www.skolska.com.hr/hrv/page.asp?item=021154&act=add2basket
p.s. nije da nikog hvalim, ali vidim gdje dečko šepa
Eh, problem je što meni to treba za par dana, a i ovo je skupo.
Mislio sam na nešto online.
Rustweaver hvala još jednom, ak ti ikad išta zatreba iz grafičkog područja, javi, to mi je struka.

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;
}

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.

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);

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š).

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

Probaj ovo pa ćeš vidjeti u kom grmu leži zec:
(((2*n)+3 )/(double)((4*n)+7))*CN(n-1);


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;}
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.