14. december 1999 - 17:47Der er
33 kommentarer og 1 løsning
Hjælp hurtigt, please
Nu har jeg fået min opgave, et program som kan indholde oplysninger i to forskellige varegrupper herunder forskellige varetyper uden begrænsning. Det skal være så generel, at det kan bruges til hvad som helst, men to sortimenter.
menu(); (Valg af Første_vare_gruppe eller Anden_vare_gruppe)
indtast(); (varenavn,indkøbspris pr. stk,salgspris pr. stk,solgt antal)
sammenlig_varenavn(); if(varenavn==varenavn)
sum_antal_solgte(); (læg solgte til sum_antal_solgte)
samlet_fortjeneste();gerne rekursis beregning sum_antal_solgte*(salgspris pr. stk - indkøbspris pr. stk.)
vis(); (Varenavn og samlet fortjeneste) Evt. med sortering med bedste fortjeneste øverst o.s.v. men ikke ved brug af boblesortering. visningen skal automatisk ske umiddelbart efter indtastningen
Det er sikkert ikke så svært, men for mig er det, måske skal det gøres på en anden måde, det er sådan jeg har forestillet mig det. Er det ikke medlemsfunktionerne?: samlet_fortjeneste+sum_antal_solgte+sammenlig_varenavn Skal der en superklasse og to afledte klasse til eller hvad? Er der nogen, som kunne komme med et godt simpelt eksempel for begynder???? Ingen brug af constuctor og destructor eller bool, har jeg ikke lært og jeg skulle kunne forklarer programmet, men derimod med klasser,template,operator, indkapsling,alias i stedet for pointere, overdefinering af opratorer(this-> og *this) eller med cout og tabeller. Værsgo og spis.
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Undskyld jeg ikke svarer før, det havde jeg vist nærmest lovet ?
Jeg forstår ikke lige umiddelbart din opgave. Jeg kunne godt tænke mig at du prøver at forklare din opgave lidt bedre, og så måske skrive lidt om hvad det er du har problemer med. Hvis du fx. vil have et skelet til en klasse, så vil jeg meget gerne hjælpe dig med det, og selvfølgelig også gerne se lidt på noget af den kode der skal skrives. Men det kræver at jeg forstår hvad det er du skal lave...
Hej dmk. Jeg prøver.En mand åbner en butik, men ved ikke præcis hvad, han vil handle med, men han vil kun handle med to forskellige varegrupper eks. cykler og knallerter.Under hver af disse grupper skal der indeholde oplysninger: Der skal kunne indtastes Varenavn Købspris/stk Salgspris/stk Solgt antal Men der er flere forskellige varenavne under eks. cykel, det kunne være SCO med tilhørende købspris osv. og et andet mærke med tilhørende købspris. Hver gang han sælger et antal skal det kunne registreres og samtidig efter indtastningen skal de vises alle under eks. cykler:(Hvis det var cykler han indtastede oplysninger på) Varenavn Samlet fortjeneste SCO 5000.00 Svinger 10000.00 D.V.S at der skal hele tiden lægges nye indtastet solgte til en sum af solgte. Fortjenesten beregnes ved salgspris - købspris og ganges derefter med ialt antal solgte.
class Vare { private: VareData* first; // pointer til første post public: int operator == (Vare vare2); // Sammenlign void indsaet(); // indsætter ny post i listen - kan enten være sorteret eller ikke void indlaes(); void udskriv(); };
Det vil dog nok være en fordel hvis du selv starter med at gøre dig nogle tanker om hvorvidt listen skal være dynamisk og hvilken funktionalitet du vil have at listen skal have.
Beklager, jeg havde ikke læst dit spørgsmål ordentligt, men hvis datatyper for de to sortimenter er ens, så kan jeg ikke se nogen grund til at bruge forskellige klasser til de to sortimenter.
Templates....hmmm....jeg kan ikke lige se nogen oplagt grund til at bruge det.
Med hensyn til sum af antal solgte: er det antal varer eller samlet pengesum? Uanset, så kan du jo lave en static variabel i klassen til at holde styr på det. Den skal så bare opdateres hver gang der bliver indlæst en ny post.
Jeg ved ikke om jeg helt har forstået hvad det er du vil have, men hvis du selv laver et udkast, så er det meget nemmere at hjælpe med/kommentere det du har lavet.
Kopier lige hele din opgave tekst ind, så vi ved hvad der kræves af opgavens løsning: Der er jo ingen grund til at opfinde dybe tallerkner, hvis opgaven tillader engangsbestik, vel !
Læs mere nedenfor om een måde man kunne håndetere detail varer på, hvis du gider.
I detailkæden opererer man ofte med varegrupper (svarende til f.eks. cykler og knallerter men også hvad som helt andet) og indenfor hver af disse, med varenumre. (Svarende f.eks. til de forskellige cykelfabrikater.) For varer hvor der er flere varianter af samme "slags" opererer man derudover ofte med et såkaldt SCU-nummer, dvs. Size-Colour-Unit nummer, der udtrykker hvilken variant der er tale om - f.eks. Vare = Ecco Citywalker sko, SCU = størrelse (39-46), farve (sort eller brun), design (med eller uden golfmønster). Det endelige varenummer (svarende til EAN-stregkoden på varen) er oftest en kombination af varenr & SCU-nr. Hermed kunne 5712340460101 og 5712340390201 være samme vare - den første en sko i størrelse 46/sort, den anden samme type sko blot i størrelse 39/brun.
Sine lagerbeholdninger har man så på fire niveauer: antal stk. pr. varenummer, antal pr. S-nr (første del af SCU-nummeret), antal pr. C-nr (anden del af SCU-nummeret) og endelig antal stk. pr.U-nr. (Sidste del af SCU-nummeret.)
Da antal varianter som udgangspunkt er ukendt, duer det efter min mening IKKE med statiske tabeller - du skal lave en eller andet form for dynamisk tabel, som du f.eks. kan starte med at indlæse fra en fil - og afslutte med at lægge tilbage i filen.
En mulig datastruktur kunne være:
typedef struct { int Supplier; /* 4 cifre til fabrikant af varen - f.eks. 5711 = Ecco */ int CommNo; /* 3 cifre til hovedvarenumemr - f.eks. 013= City Walker */ int Sno; /* 2 cifre til 'Size' - f.eks. 39=størrelse 39 */ int Cno; /* 2 cifre til 'Color' - f.eks. 01=sort */ int Uno; /* 2 cifre til 'Unit' - f.eks. 01=Glat model, 02=Golf model */ int EANno; /* 13 cifret kode som kombination af d.o. - f.eks. 5711013390101 '/ int CommGrp; /* Varegrupper - f.eks. 01=Herresko, 02=Damesko, 03=Støvler osv. */ int SoldQty; /* Antal stk. (par) solgt */ int StockQty; /* Antal stk (par) tilbage på lager */ double SalesPrice; /* Aktuelle salgspris for varen. */ double SalesAmount; /* Samlet beløb der er solgt for indtil videre. */ double BuyAmount; /* Samlet købspris indtil videre. */ } defCommInfo;
Du skal så sørge for at EANno hele tiden er = CommNo * 1000000L + Sno * 10000L + Cno * 100 + Uno. Ligeledes skal SalesAmount indeholde det TOTALE beløb der er solgt for, og BuyAmount det TOTAL beløb der er indkøbt for. (Det sidste for at tage højde for skiftende slags- og/eller købspriser.)
Du kan så ved at lave forskellige sorteringer (de fleste C-compilere indeholder en funktion der hedder qsort(), som du kan bruge) udskrive både den efterlyste "statistik" over antal solgte stk. og fortjeneste pr. "fulde" varenummer, såvel som for hovedvaren og alle SCU-varianterne. Hermed ville "butikken" kunnde se både hvor mange Ecco-sko de har solgt i alt, hvormange de har solgt i størrelse 46, hvormange brune sko osv.
Hej Bjarke og tak. Jeg har ikke helt styr på hvordan jeg vil gribe det an' endnu, jeg synes det er svært at overskue, husk jeg har kun haft programmering i 4 måneder. Templates, fordi han ikke endnu ved hvilket han vil handle med eks. en attribut i hver klasse(sortiment) kaldet beskrivelse eller andet her kan disse bruges med alle datatyper,(eks. 45 liter eller 70 cm) så er der ikke så meget omprogrammering, det er en af de ting, vi skal i opgaven tage hensyn til, fordi han ikke har bestemt sig endnu. Dynamisk lagring har vi kun kort fået undervisning i og jeg må indrømme, at det er ikke helt gået op for mig hvad det drejer sig om???? Med hensyn til sum osv. Hver gang han har solgt nogle varer eks.10 SCO cykler skal der opdateres i det antal af SCO'er han har solgt i forvejen, og fortjenesten skal også opdateres. Det jeg ikke rigtig kan se, er hvordan jeg gør det nemmest, kan man sammenligne to tabeller(F.eks varenavnet)med hinanden og derefter når de er ens skal der opdateres i både antal og fortjeneste og hvordan kommer jeg til de enklte elementer i klassen for at opdaterer.Jeg forestiller mig at der er en superklasse(Vare) og to subklasser(Eksemplar 0g Artikel)som generel betegnelser. Lige nu køre det rundt inde i hovedet. Der jeg ser problemmet er ved at der er flere forskelige varer under hvert sortiment og det er kun det varenavn som indtastes der skal arbejdes med. Det er smadder svært at kommunikere på denne måde jeg ville ønske i kunne se hele opgaven. Nogen foreslag
Forslag: - Læg opgaveteksten her op - LAV SÅ MEGET DU SELV KAN og læg det så her op
Statisk: void main() { char tekst[20000]; }
Dynamisk: void main() { cout << "Vil du indtaste en lang streng"; if( getch()=='j' ) char* tekst = new char[20000]; // syntaksen er nok ikke rigtig }
Ved dynamisk hukommelsesallokering bruger du KUN pladsen hvis du vælger at allokere (optage) den (det behøver selvfølgelig ikke være noget brugeren bliver spurgt om).
Hvis du f.eks. laver et kartotek, så vil du ved statisk hukommelsesallokering være nødt til på forhånd at lægge dig fast på max antal poster (afhængig af hvor stor hukommelsen er). Det betyder at uanset om der er indtastet en eller 2000 personer, så optager programmet lige meget hukommelse. Ved dynamisk hukommelsesallokering vil pladsen kun blive optaget efterhånden som man indtaster nye poster, og der vil således ikke blive brugt unødig plads
Hmm, det kunne vist være besvaret smartere og kortere, men jeg håber du forstod det...
Hej bjarke, dynamisk lagring har ikke noget med fysisk lagring at gøre men midlertidigt mens man arbejder eller hvad, Jeg føler mig lidt dum. Jeg prøver at lave noget og vender tilbage lidt senere, håber jeg stadig kan få kontakt. Det med at kopier opgaven ind ville jeg gerne men kan ikke få det til at fungere, har prøvet at scanne det ind, det gik ikke.
Jeg ville også meget gerne se opgaven, da jeg heller ikke helt har forstået opgavens omfang og sværhedsgrad endnu. Du har den ikke som et word-dokument eller noget i den stil? Du har den kun på papir?
Men jeg har prøvet at strikke dette lille eksempel sammen, og så kan du måske kommentere det? Jeg ved ikke om det er noget i den stil du har brug for, så du må gerne sige hvad der er galt med det, og hvor jeg har misforstået opgaven.
Fx. har jeg problemer med at se hvor du har brug for en rekursiv funktion. Jeg kunne da godt finde på et-eller-andet med min sammentælning, men det ville da også kun være for rekursivitetens skyld, og ikke fordi det på nogen måde er oplagt at gøre det! Noget andet er dine varegrupper. Hvad er forskellen på de to varegrupper, som gør at det skal repræsenteres forskelligt i programmet? Hvis begge varegrupper kan beskrives med de samme variabler, så der vel ingen grund til at skelne imellem dem (eg. lave to structs/klasser)?
I øvrigt: Du skal ikke begynde at føle dig dum fordi du ikke forstår vores svar og kommentarer. Hvis ikke du forstår må du endelig sige til, så kan vi føle os dumme fordi vi åbenbart ikke magter at forklare det ordentligt :-)
Hej dmk. Det du har lavet ser virkelig godt ud, jeg printer det ud og kigger nærmere på det, jeg tror du kan hjælpe mig, men kig lige på det jeg indtil nu har lavet, der mangler selvfølgelig de vigtigeste funktioner og der er sikkert fejl, men det kan compiles og køre. Kom med nogle gode ideer.I er virkelig søde alle sammen. #include"get.h" #include<stdio.h> #include<conio.h> #include<iostream.h> #include<string.h>
class vare { private: char varenavn[20]; long indkoebspris; long salgspris; public: void indtast(); void vis(); void samlet_fortjeneste(); void sum_solgte(); };
void vare::indtast() { cout<<"Indtast varenavn: "; cout<<gets(varenavn); cout<<"Indtast indk›bspris pr. stk.: "; indkoebspris=getlong(); cout<<"Indtast salgspris pr. stk.: "; salgspris=getlong(); }
blackie >> når du loader/runner et program, ligger det sig i memory. Alle erklærede variable (statiske) får også en plads uanset om du bruger dem eller ej.
Hvis du imidlertid (jvf eksemplet med et kartotek) får lyst til at oprette ekstra poster i løbet af program-afviklingen, så kan du gøre det løbende ved hjælp af dynamisk inddragelse af ledig hukommelse så længe der er ledig plads.
Var det mere forståeligt?
NB: Statisk og dynamisk har med afviklingen af programmet i memory at gøre. Det har intet at gøre med eventuelle filer du måtte oprette eller slette undervejs. De ligger på harddisken (eller diskdrev eller whatever).
Der er et væsentligt større programmerings arbejde i at lave dynamisk hukommelses allokering, og det introducerer mange fejl-muligheder. Så hvis man kan undgå det, så kan det til enhver tid anbefales at gøre det! Men som Bjarke også rigtigt siger, så bliver man nødt til at sætte størrelsen på det statiske allokerede til det absolut maksimale tænkelig, for at man er sikker på at man har nok.
Hvis vi fx. skal gemme nogle navne, og vil gøre det i statisk allokerede buffere, så kan vi gøre sådan her:
struct Person { char Name[MAX_NAME_LEN]; };
og så kan vi lave et array af disse ved at gøre følgende:
Person PersonArray[MAX_ARRAY_LEN];
Så er spørgsmålet hvad MAX_NAME_LEN og MAX_ARRAY_LEN skal sættes til. Hvis vi siger at et gennemsnit navn er 6 karakterer langt, og at vi i gennemsnit har 100 personer, så ville den dynamiske hukommelses strategi give et hukommelses forbrug på 100*7=700 bytes (7 bytes på grund af null-termineringen af strengen). Men med statisk hukommelses allokering skal vi sætte MAX værdierne til det maksimale tænkelige, og det kunne fx. være 50 for navnet og 10.000 for arrayets størrelse. Det vil give et hukommelses forbrug på 50*10.000=50.000 bytes, selv om vi i gennemsnit kun har brug for 700...
Hej dmk. Det er virkeligt godt, nu mangler jeg bare en indtastfunktion, kan du hurtigt strikke den til det du har lavet får du de 100 point. Men jeg kommer igen med et nyt spørgsmål jeg ville gerne have sortering med(det må bare ikke være bubble-sort), hvor den vare, som har den støreste fortjeneste vises først og derefter kommer næststøreste osv. Det skal vises lige efter indtastningen. Jeg føler mig lidt uartig, da det ikke er mig der har lavet opgaven, men hvad gør man ikke for at skulle undgå at gå et semester om. Jeg er jo også nødt til at sætte mig ind i programmet da det skal beskrives og det kan man vel ikke undgå at lære noget af. Jeg har tilmeldt mig et fjernundervisningskursus som tidligere er blevet nævnt her på siden, det må vel også give noget.Men det er først senere og det er jo nu det gælder eksamen. Der kommer sikkert også nogle spørgsmål når jeg skal til at beskrive programmet.
jeg er glad for du kunne bruge det. Jeg har skrevet de 3 funktioner til indtastning af varer, køb og salg. De er lavet i al hast, men de skulle vist virke...
Hej dmk, Jeg skriver opgaven af, måske kan du bedre forstå den.
Olsen har besluttet sig for at åbne en butik. Olsen vil vide, hvor mange penge der er tjent indtil nu på de forskellige varer(egentlig varetyper/varemodeller).
Inden han åbner butikken og bestiller de første varepartier hos grossisterne, skal han have et edb-system parat. Han vil kun beskæftige sig med to slags varer(fyrværkeriartikler og festartikler), og i de to sortimenter er der "en del" varer (han ved ikke hvor mange, for det svinger lidt) Meningen er, at systemet skal håndtere de to sortimenter, det vil sige varene i det ene sortiment og varerne i det andet sortiment. For hver vare (varetype/varemodel) skal der i det mindetse holdes oplysninger om stykpris ved indkøb, stykpris ved salg, samt antal solgte eksemplarer indtil nu. Andre beskrivende oplysninger kan også være relevante. Han er lydhør for ideer! Indtast eksempel for festsartikler.
Når alle oplysningerne om et' sortiment er indtastet, skal maskinen automatisk vise hele sortimentet igen, men kun med varenavn og fortjeneste Visning eksempel for festartikler.
Varenavn Samlet fortjeneste Napoleons 73.75 papirser 9450.00 slips 11.45
Der er lige en ting, olsen ikke er helt sikker på. Måske er det slet ikke fyrværkeri og festartikler, der er penge i. Faktisk kan han godt finde på at beslutte, at han hellere vil åbne en værktøjshandel og sælge elektrisk værktøj og manuelt værktøj eller noget andet, men stadig med to sortimenter. Det vil være smart at lave programmet sådan, at dit arbejde bliver mindst muligt, når han endelig beslutter sig for, hvilken branche han vil gå ind i.
1. På den ene side aner olsen overhovedet ikke, hvilken af de nævnte brancher han vil gå in i, og trods det skal man som programmør lave en løsning, hvor ændringen skal være så lille så muligt, når han en dag får bestemt sig. Forklar meget kort med ord, hvordan du mener, det kan hænge sammen. 2. Vis et design for din løsning, så du på en enkel måde får formidlet et overblik over det samlede program.
3. Vis de teknikker fra programmeringens område, som du mener kan være relevante at bruge 4. Fortæl, hvilke teknikker der kan bruges for at løse problemstillingen i spørgsmål 1. og i hvilke sammenhænge. 5. Lav et program, der kan løse opgaven. 6. Forklar, hvad der skal gøres, hvis/når olsen beslutter sig for at skifte branche. 6. Udvidet løsningsmulighed Sortering af varedata med en anden sorteringsalgoritme end bubblesortering 7. Superudvidet løsningsmulighed Vis designet for en løsning, hvor data lagres i filer.
Undskyld. Du skal #include <stdlib.h> for at kunne bruge funktionerne.
atof tager en streng (char*) som input, og konverterer den til en float, eller 0 hvis ikke strengen kunne konverteres. Atol konverterer til en long (int). Hvis du fx. har en streng der står "2342alæskjf" i, vil atol returnerer 2342. Hvis der står sdf2342" vil den returnerer 0, fordi det første tegn i strengen ikke er et tal.
Hej DMK, Ja, det med stdlib.h fandt jeg ud af, men jeg har stadig 5 stk expression syntax fejl og de ligger sig i main ved VareId og VareNavn, så retter jeg det til Id og Navn og lige fedt er det.øv. Hvad gør jeg galt. Jeg ved godt, at jeg er krævende, men vil du være sød at give mig en main, hvor jeg kalder dine funktioner.Og hvordan deklareer jeg den i klassen bool IndtastKob(int Id, char* Navn); eller hvad??? Du har fortjent dine point og du får dem også. men hvis jeg accepterer nu forsvinder alt det vi har skrevet så?? Eller er det først når et nyt spørgsmål oprettes??
Spørgsmålet med kommentarer forsvinder ikke selvom du accepterer og der vil fortsat kunne kommenteres - det gælder også selv om du opretter et nyt spørgsmål eller flytter til månen...
Den eneste risiko ved at acceptere er, at der måske lige pludselig ikke er så mange, der er interesserede i at svare/hjælpe. Men dmk lyder jo som om, at han har tænkt sig at bistå dig indtil det hele bare kører ;-)
Desuden ville jeg istedet for hele tiden at skrive:
cout<<"*******************************"<<endl;
Vælge at lave enten en funktion eller en #define (det kan godt være, at jeg husker lidt galt med syntaksen):
#define LINE cout<<"*******************************"<<endl;
Og så bare skrive "LINE;" i programmet. Hvis du så beslutter dig for, at der skal være 5 stjerner mere eller der skal stå "Tryk en tast for at fortsætte", så behøver du kun at rette ét sted.
Hej Bjarke, Jeg er altid imødekomne for gode tips. Den med #define LINE vil jeg huske. Den opgave, du har fundet frem her, er min og ikke særlig god, er skippet. Hvorfor du måske ikke kan få det til at hænge sammen er fordi at der er #include <get.h> som ikke kan ses her, en min lærer har lavet. Jeg vil heller have hjælp til den opgave, jeg sidder med nu, som er DMKs Du kan måske se det, udfra det der skrevet.Det hænger ikke sammen med VareId og Varenavn. Du må også gerne forklarer mig om struct, det er vi i vores klasse ikke blevet præsenteret for. Jeg håber DMK vender tilbage hertil
Undskyld jeg har været væk i noget tid, og ikke svaret på dine nødråb. Jeg har haft problemer med at kontakte www.eksperten.dk, og tit og ofte får jeg simpelthen en timeout ? Det er temmelig frustrerende, og så glemmer jeg måske lige at få prøvet igen, da jeg også har mange ting der skal gøres på mit arbejde inden jul.
Jeg kigger lige på det, og paster hele mit program (incl. mainfil) ind efter frokost. Håber du kan vente så længe!
Her er hele programmet som det ser ud hos mig. Hvis ikke det kan køre hos dig, så er der vist noget galt??
Du kan prøve at bygge dit menu-system i main funktionen hvis du har lyst. Det skulle ikke være så svært at lave noget i stil med det du lavede i dit eget eksempel. Mine 3 indtastningsfunktioner er lavet uden for klassen, men hvis du gerne vil have det, kan de jo godt flyttes ind i klassen. Jeg foretrækker bare at holde brugergrænseflade ting uden for mine data-klasser.
Og jeg vil selvfølgelig ikke holde op med at svare på spørgsmål hvis du accepterer mit svar. Men du skal ikke acceptere det, før du syntes du har fået hvad du bad om. :-)
Jeg kommenterede ikke så meget for at lave din opgave - det klarer dmk jo udmærket.
Jeg kan bare godt selv lide at få gode idéer til de ting jeg selv laver - specielt hvis jeg har lavet noget, som kan laves (en del) smartere.
Om structs??? Tja, kort fortalt. I en "int tal;" kan du gemme en talværdi (heltal -32767 til 32768, eller noget i den retning) i "int tal[ANTAL]" kan du gemme ANTAL heltal. Hvis du derimod gerne vil gemme forskellige typer data i én variabel kan du ikke klare dig med et array, men til gengæld kan du bruge en struct.
struct Data { int Alder; char Navn[30]; };
Nu kan du erklære en variabel: Data person; fuldstændig som du erklærer en int: int tal;
Dataene får du adgang til sådan: person.Alder = 35; // indlæsning cout << person.Alder; // udlæsning
---------------------------
På mange måder svarer en struct og en class meget til hinanden. Data i en klasse er default private, mens de default er public i en struct.
dmk >> Du er ikke den eneste, som har haft problemer med at komme ind på eksperten. LAN-opkoblingen her har flere gange brugt over et minut på at indlæse denne side.
Du spurgte tidligere om jeg bruger statisk allokerede buffere i mit eksempel, og ja, det gør jeg.
En statisk allokerede buffer er en hvor man ikke bruger malloc eller new for at oprette hukommelse til bufferen. Hvis man bruger enten malloc eller delete, så er bufferen dynamisk oprettet, og så skal man huske selv at slette den igen.
Statisk buffere oprettes ved blot at lave [] efter variablens navn, og inden for klammerne skrive hvor mange elementer man gerne vil have.
Min statiske buffer er lavet således: char VareNavn[MAX_NAVN_LAENGDE];
Hvis jeg ville have lavet den dynamisk, havde jeg skrevet: char* VareNavn= new char[MAX_NAVN_LAENGDE]; eller: char* VareNavn=(char*)malloc(MAX_NAVN_LAENGDE);
og når jeg var færdig med at bruge bufferen, og gerne ville slette den igen, skulle jeg skrive: delete[] VareNavn; eller: free(VareNavn);
DMK
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.