Gå til innhold

Programmeringsutfordringer i C/C++


Anbefalte innlegg

Skrevet (endret)

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
Videoannonse
Annonse
Skrevet

Min første utfordring: Lag et enklest mulig program som kan kopiere en fil til en annen. (Den enkleste løsningen som nok mange Unix-brukere tenker på, er vel ikke mulig i Windows, eller er det? :O)

Skrevet

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

Skrevet (endret)

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
Skrevet
#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?

Skrevet

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

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

  • 3 uker senere...
Skrevet

Lag et program som runder av til nærmeste hele tall. F eks:

Enter number: 3.654
Rounded number: 4.0
Enter number: 3.21
Rounded number: 3.0
Enter number: 3.999999
Rounded number: 4.0

Skrevet (endret)

syntax error : identifier 'T' :p:D

 

 

Add teh typename?

 

 

Hvorfor ikke bare -

template <typename T> T Round(T value)
{
  return (T)((int)(value + 0.5f));
}

Oo

Endret av LostOblivion
Skrevet (endret)

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

Endret av LostOblivion
Skrevet

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

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

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å
×
×
  • Opprett ny...