functie in C

0 views
Skip to first unread message

Rares Vernica

unread,
May 7, 2007, 7:45:03 PM5/7/07
to mens...@googlegroups.com
Salut,

Scuze daca nu reusesc sa explic calumea problema.

-----

Trebuie sa scieti o functie in C (nu C++) care ia ca argument un
numar, n (intreg si pozitiv). Functia trebuie sa afiseze toate
numerele de la 0 la n. De exemplu, daca n = 5, functia afisaza "0 1 2
3 4 5".

Restrictii:
- nu aveti voie sa folositi bucle: FOR, WHILE, sau DO
- nu aveti voie sa folositi IF, sau "? :"
- nu aveti voie sa folositi SWITCH, sau GOTO

-----

Nu trebuie sa scrieti toata functia, ideea principlala ajunge.

Bafta,
Rares

Cosmin Marian

unread,
May 8, 2007, 3:39:02 AM5/8/07
to mens...@googlegroups.com
pai folosesti operatorii logici:

void fun (int n) {
n > 0 && fun (n-1);
printf ("%d ", n);
}


Salut,

-----

-----

Bafta,
Rares


__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com

Cosmin Marian

unread,
May 8, 2007, 3:42:26 AM5/8/07
to mens...@googlegroups.com
in fine, o mica scapare

int fun (int n) {


n > 0 && fun (n-1);

return printf ("%d ", n);

Razvan Rotaru

unread,
May 8, 2007, 4:17:27 AM5/8/07
to mens...@googlegroups.com
Nu cumva depinde de implementare, daca evaluarea expresiei logice se face in
ordine sau nu? Imi garanteaza limbajul ca n>0 este evaluat primul si
fun(n-1) nu se mai evalueaza daca primul e fals?

Dar si asa, frumoasa idee.

Razvan

-----Original Message-----
From: mens...@googlegroups.com [mailto:mens...@googlegroups.com] On
Behalf Of Cosmin Marian
Sent: Tuesday, May 08, 2007 10:39 AM
To: mens...@googlegroups.com
Subject: [mens sana] Re: functie in C

Cosmin Marian

unread,
May 8, 2007, 5:38:51 AM5/8/07
to mens...@googlegroups.com
Nu la prima intrebare, Da la a doua

A se vedea si Kernighan si Ritchie, editia a II-a, p. 39 ;)

Cosmin

Razvan


pai folosesti operatorii logici:


Salut,

-----

-----

Bafta,
Rares



____________________________________________________________________________________
Never miss an email again!
Yahoo! Toolbar alerts you the instant new Mail arrives.
http://tools.search.yahoo.com/toolbar/features/mail/

Rares Vernica

unread,
May 8, 2007, 12:49:21 PM5/8/07
to mens...@googlegroups.com
Da, asta e solutia.

Rares

Radu Cornea

unread,
May 8, 2007, 1:22:12 PM5/8/07
to mens...@googlegroups.com
On 5/8/07, Rares Vernica <rver...@gmail.com> wrote:
>
> Da, asta e solutia.
>

Hai sa o facem ceva mai complicata: nu sunt permise nici un fel de
expresii sau blocuri conditionale (if, switch, ?:, scurtcircuit),
bucle (for, while, do) sau salturi (goto, longjmp, setjmp).
Se pot folosi functii ajutatoare, dar nu functii sistem sau de
biblioteca (in afara de printf).

Pentru cei aventurosi niste conditii suplimentare: nu se pot folosi
manipulari de biti, expresii booleene.

--
Radu

Cosmin Marian

unread,
May 8, 2007, 3:37:58 PM5/8/07
to mens...@googlegroups.com
Exercitiu pur teoretic?

Sau vrei practic? :D


Cosmin

----- Original Message ----
From: Radu Cornea <em...@radu.net>
To: mens...@googlegroups.com
Sent: Tuesday, May 8, 2007 8:22:12 PM
Subject: [mens sana] Re: functie in C

--
Radu


____________________________________________________________________________________
Food fight? Enjoy some healthy debate
in the Yahoo! Answers Food & Drink Q&A.
http://answers.yahoo.com/dir/?link=list&sid=396545367

Cosmin Marian

unread,
May 8, 2007, 3:56:52 PM5/8/07
to mens...@googlegroups.com
O solutie care are la baza o functie de tipul:

f(n)= p daca n == 0 si q daca n > 0


typedef unsigned int uint;
typedef void (*continuare)(uint);

void zero(uint);
void nonzero(uint);
void fun(uint);

continuare continuari[] = {
0, // ;)
nonzero,
zero
};

void zero(uint n) {
}

void nonzero(uint n) {
fun(n-1);
}

void fun(uint n) {
continuari[(n+2)/(n+1)](n);
printf("%d ", n);
}

----- Original Message ----
From: Radu Cornea <em...@radu.net>
To: mens...@googlegroups.com
Sent: Tuesday, May 8, 2007 8:22:12 PM
Subject: [mens sana] Re: functie in C


On 5/8/07, Rares Vernica <rver...@gmail.com> wrote:
>
> Da, asta e solutia.
>

Hai sa o facem ceva mai complicata: nu sunt permise nici un fel de
expresii sau blocuri conditionale (if, switch, ?:, scurtcircuit),
bucle (for, while, do) sau salturi (goto, longjmp, setjmp).
Se pot folosi functii ajutatoare, dar nu functii sistem sau de
biblioteca (in afara de printf).

Pentru cei aventurosi niste conditii suplimentare: nu se pot folosi
manipulari de biti, expresii booleene.

--
Radu


Radu Cornea

unread,
May 8, 2007, 4:48:37 PM5/8/07
to mens...@googlegroups.com
On 5/8/07, Cosmin Marian <cosm...@yahoo.com> wrote:
>
> O solutie care are la baza o functie de tipul:
>
> f(n)= p daca n == 0 si q daca n > 0
>
>
> typedef unsigned int uint;
> typedef void (*continuare)(uint);
>
> void zero(uint);
> void nonzero(uint);
> void fun(uint);
>
> continuare continuari[] = {
> 0, // ;)
> nonzero,
> zero
> };
>
> void zero(uint n) {
> }
>
> void nonzero(uint n) {
> fun(n-1);
> }
>
> void fun(uint n) {
> continuari[(n+2)/(n+1)](n);
> printf("%d ", n);
> }
>

Foarte bine! La asa ceva ma refeream. Astea erau solutiile mele:

1) Cu operatori booleeni:

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

void doreturn(int n);
void doprint(int n);

int iszero(int n) {
return !n;
}

void (*funcp[2])(int n) = {doprint, doreturn};

void doreturn(int n) {
return;
}

void doprint(int n) {
funcp[iszero(n)](n-1);
printf("%d ", n);
}

int main (int argc, char **argv) {
doprint(atoi(argv[1]));
printf("\n");
}


2) Fara operatori booleeni:

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

void doreturn(int i, int n);
void doprint(int i, int n);

int isequal(int i, int n) {
return (i + 1) / (n + 1);
}

void (*funcp[2])(int i, int n) = {doprint, doreturn};

void doreturn(int i, int n) {
return;
}

void doprint(int i, int n) {
printf("%d ", i);
funcp[isequal(i, n)](i + 1, n);
}

int main (int argc, char **argv) {
doprint(0, atoi(argv[1]));
printf("\n");
}

Le-am testat pe amandoua cu gcc sub Linux.

--
Radu

Rares Vernica

unread,
May 8, 2007, 5:27:07 PM5/8/07
to mens...@googlegroups.com
Tare solutia!

Rares

Radu Cornea

unread,
May 8, 2007, 6:44:01 PM5/8/07
to mens...@googlegroups.com
On 5/7/07, Rares Vernica <rver...@gmail.com> wrote:
>
> Salut,
>
> Scuze daca nu reusesc sa explic calumea problema.
>
> -----
>
> Trebuie sa scieti o functie in C (nu C++) care ia ca argument un
> numar, n (intreg si pozitiv). Functia trebuie sa afiseze toate
> numerele de la 0 la n. De exemplu, daca n = 5, functia afisaza "0 1 2
> 3 4 5".
>
> Restrictii:
> - nu aveti voie sa folositi bucle: FOR, WHILE, sau DO
> - nu aveti voie sa folositi IF, sau "? :"
> - nu aveti voie sa folositi SWITCH, sau GOTO
>

Inca o problema asemanatoare:

Implementati operatorul x ? y : z intr-o functie int cond(int x, int
y, int z); folosind doar ~, !, ^, &, +, |, <<, >> fara if , bucle sau
altceva, folosind doar operatorii de mai sus. Functia returneaza fie y
fie z, depinzand de valoarea lui x.

Extra puncte pentru o solutie pe o singura linie, fara a folosi
variabile suplimentare.


--
Radu

Rares Vernica

unread,
May 8, 2007, 7:04:45 PM5/8/07
to mens...@googlegroups.com
Pot folosi && si ||?

Rares

On 5/8/07, Radu Cornea <em...@radu.net> wrote:
>

Radu Cornea

unread,
May 8, 2007, 7:08:03 PM5/8/07
to mens...@googlegroups.com
On 5/8/07, Rares Vernica <rver...@gmail.com> wrote:
>
> Pot folosi && si ||?
>

Nu, altfel e prea usor :)

--
Radu

Reply all
Reply to author
Forward
0 new messages