Gå til innhold

Programmeringsutfordringer i C/C++


Anbefalte innlegg

Hei,

 

Tenkte å spiffe opp denne gruppen litt ved å lage en tråd hvor noen poster programmeringsutfordringer i C eller C++, og så kan vi se hvem som får til beste løsning, evt kjappeste løsning i algoritmer. Ikke lag noe alt for avansert, som skriv et spill, eller lignende, men helst noe enkelt og trivielt så mange får prøve seg!

 

printf("Husk å putt koden din i kodeblokker sånn som denne.");

printf("Evt monotype skrift %s", "sånn som denne.");

Endret av LostOblivion
Lenke til kommentar
Videoannonse
Annonse

Nice! Min ble

#define BUFSZ 256

int main()
{
int bytes;
char buf[BUFSZ];

while (bytes = read(0, buf, BUFSZ))
	write(1, buf, bytes);

return 0;
}

Hvis programfilen heter cat kan det brukes i Unix på måten du gir programmet stdin og stdout ved å kjøre det som -

$ ./cat <innfil >utfil

Det kan også brukes som en (ikke redigerbar) plain text skriver ved bare å oppgi utfilen.

$ ./cat >utfil
Dette kommer i den
nye fila...
<ctrl c>
$

Dette er jo en fin måte for nye å lære seg C/C++ for å forstå enkle problemer. (Og for meg, spesielt til C++. :D) Noen andres tur!

Endret av LostOblivion
Lenke til kommentar
#include <fstream>

using namespace std;

int main(int argc, char* argv[])
{
ifstream src(argv[1], ios::binary);
ofstream dst(argv[2], ios::binary);

while(!src.eof())
	dst.put(src.get());

return 0;
}

 

Fungerer med tekstfiler og binære filer.

 

Nei, det gjør den ikke:

 

$ g++ -Wall copy.cpp 
$ od -c source1.txt
0000000   1
0000001
$ ./a.out source1.txt fjas.txt
$ od -c fjas.txt
0000000   1 377
0000002
$

 

Utfordringen da blir -- hvorfor ikke?

Lenke til kommentar

Det var merkelig. Jeg prøvde å kopiere selve programmet og et bilde jeg hadde liggende. Det fungerte, men det ser ut til at det blir skrevet ett ekstra tegn til filen. Fikk det til å fungere med koden nedenfor, men spørsmålet blir jo - som zotbar123 sier - hvorfor ikke?

 

#include <fstream>

using namespace std;

int main(int argc, char* argv[])
{
ifstream src(argv[1], ios::binary);
ofstream dst(argv[2], ios::binary);

char c;
while(src.get(c))
	dst.put(c);

return 0;
}

Lenke til kommentar
Det var merkelig. Jeg prøvde å kopiere selve programmet og et bilde jeg hadde liggende. Det fungerte, men det ser ut til at det blir skrevet ett ekstra tegn til filen. Fikk det til å fungere med koden nedenfor, men spørsmålet blir jo - som zotbar123 sier - hvorfor ikke?

 

Det har noe å gjøre med måten stream-tilstanden blir endret på. Opprinnelig sjekket du på eof, og hvis det flagget ikke var satt, antok du at leseoperasjonen lyktes (ville lykkes?). Saken er bare at eof-flagget kan godt være først satt *etter* at man forsøkte å lese seg forbi slutten av filen. Mao. kommer det en ekstra iterasjon i løkken og et eller annet tilfeldig søppel havner i filen.

Lenke til kommentar
  • 3 uker senere...

Tja, si det.

 

I C# så er det standard syntaks

T MyFunction<T>()

 

Men så kan du få den til å begrense det til forskjellige typer, struct for eksempel for å bruke valuetypes istedet for reference types.

 

T MyFunction<T where T : struct)

 

Eller et interface.

 

Men nå er det ganske stor forskjell mellom generics i C# og templates i C++

 

Men du kan vel også skrive

 

template<class T> i C++ også, forskjellen blir kanskje at en ikke kan bruke primitive datatyper lenger?

Men jeg aner egentlig ikke, jeg har alltid bare brukt typename :p

Lenke til kommentar
Hmm. Lurer på hvorfor templates i C++ krever typename eller class når man deklarerer en type. Hvorfor template<typename T> ... og ikke bare template<T> ... :S

 

Jeg antar at det er fordi man også skal kunne skrive ting som:

#include <iostream>
#include <string>

using namespace std;

template<class T>
class Foo {
public:
	Foo(T t) : object(t) { }
	void print();
private:
	T object;
};

template<class T>
void Foo<T>::print() { cout << "general: " << object << endl; }

template<>
void Foo<int>::print() { cout << "specialized: " << object << endl; }

 

Hvis du skriver template<T> istedenfor template<class T>, så er det en template specialization.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...