c# eksperter

#1| 0

Er ved at lave et lille program med noget celcius/fahrenheit i skolen, og har to små problemer.

Har denne del af programmet:
if (s <= e)
{
for (s = s; s <= e; )
{



double f;
f = 9.0 * s / 5.0 + 32.0;

Console.WriteLine(s + "degrees celcius = {0} degrees fahrenheit", f);

s = s + i;
if (s > 36 & s < 38)
{

Console.WriteLine("37 degrees celcius = 98 degrees fahrenheit");
}
}
}

Hvis f.eks s = 10, og e = 30, og i = 5, så burde programmet skrive

10 degrees celcius = x degrees fahrenheit"
15 degrees celcius = x degrees fahrenheit"
20 degrees celcius = x degrees fahrenheit"
osv op til 30 degrees celcius.
Af en eller anden grund fortsætter den til 35. Det mener jeg ikke at den burde gøre pga denne linie:
for (s = s; s <= e; )
som jeg mener betyder, at den kun skal lave loopet så længe at s<=e.

Derudover skal jeg i oversigten have puttet "37 degrees celcius = x fahrenheit" puttet ind på det rigtige sted i tabellen.
Så hvis f.eks s=10 og e=50, så skal den linie puttet ind mellem 35 og 40 degrees celcius.

håber det giver mening

Redigeret af Schackk d. 11-05-2012 18:18
11-05-2012 20:06 #2| 0

Har lige hurtigt compilet det, og ved mig printer den kun ud til 30. Hvordan ser resten af koden ud?

for (s = s; s <= e; )


kan (og bør) erstattes af

while(s <= e)


Derudover vil s aldrig blive 37, når den starter på 10. Du skal tænke på, at du lægger 5 til s for hver omgang. 37 er ikke en del af 5-tabellen :)


if (s > 36 & s < 38)

Erstattes af s == 37.
11-05-2012 20:12 #3| 0

hvor kommer variablen "i" fra?

11-05-2012 20:13 #4| 0

gør du det ikke lidt besværligt for dig selv?

Sry læst forkert.

Skal du bruge noget bestemt for at få det til at virke ( altså øver i noget bedst, som loops) ?

Redigeret af Gomme d. 11-05-2012 20:32
11-05-2012 20:24 #5| 20
11-05-2012 20:29 #6| 1

Tak, nu føler jeg mig ikke længere som en nørd!

11-05-2012 20:33 #7| 0
OP

Jo jeg gør det helt sikkert mere kompliceret, end det er, men er også på første semester, så er stadig lidt ny i faget

Ved godt at min ide omkring"37" ikke virker og det med 5-tabellen. Det var bare mit første udgangspunkt.

Smækker lige hele programmet ind i et indlæg for sig selv. Tak for hjælpen indtil videre.

11-05-2012 20:34 #8| 0
OP

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;



namespace ConsoleApplication1
{
class Program
{
static void Main()
{
Console.Write("Please type a start temperature in celcius: ");
int s;
do
{
s = Convert.ToInt16(Console.ReadLine());

if (s < -279)
{
Console.Write("the lowest possible number is -279. Try again: ");
}
} while (s < -279);


Console.Write("Please type an end temperature in celcius: ");
int e;
do
{
e = Convert.ToInt16(Console.ReadLine());

if (e < -279)
{
Console.Write("the lowest possible number is -279. Try again: ");
}
} while (e < -279);


Console.Write("Please type an increment step value: ");
int i;
do
{
i = Convert.ToInt16(Console.ReadLine());

if (i <= 0)
{
Console.Write("the lowest possible number is 0. Try again: ");
}
} while (i <= 0);

if (s <= e)
{
for (s = s; s <= e;)
{



double f;
f = 9.0 * s / 5.0 + 32.0;

Console.WriteLine(s + "degrees celcius = {0} degrees fahrenheit", f);

s = s + i;
if (s > 36 & s < 38)
{

Console.WriteLine("37 degrees celcius = 98 degrees fahrenheit");
}
}
}






if (s > e)
{
for (s = s; s > e;)
{



double f;
f = 9.0 * s / 5.0 + 32.0;

Console.WriteLine(s + "degrees celcius = {0} degrees fahrenheit", f);

s = s - i;
if (s > 36 & s < 38)
{

Console.WriteLine("37 degrees celcius = 98 degrees fahrenheit");
}
}
}




Console.ReadKey();
}
}
}

11-05-2012 20:35 #9| 0

jeg går ud fra du bruger Vstudio ikke?

Det ser fornuftigt ud

Når du når lidt længere frem på dit studie lære du også at korte det meget ned, eller en del i det mindste. bliver meget mere overskue lidt når du skal lave længere kodninger

Redigeret af Gomme d. 11-05-2012 20:41
11-05-2012 20:43 #10| 0

Hvis jeg har forstået dit problem rigtigt, så noget i den her stil:

class Program
{
static void Main(string[] args)
{
PrintCelciusFahrenheitRelation(10, 30, 5);
Console.ReadLine();
}

public static void PrintCelciusFahrenheitRelation(double startDegree, double endDegree, int interval)
{
for (double i = startDegree; i <= endDegree; i = i + interval)
{
var fahrenheit = Math.Round(ConvertCelsiusToFahrenheit(i), 2);
Console.WriteLine(string.Format("{0} degrees celcius = {1} degrees fahrenheit", i, fahrenheit));
}
}

public static double ConvertCelsiusToFahrenheit(double c)
{
return ((9.0 / 5.0) * c) + 32;
}
}

11-05-2012 20:44 #11| 0
OP

Bruger Visual c# Express 2010

Kan jeg næsten forestille mig. Når jeg googler lidt på nettet for at få hjælp, finder jeg ofte kodninger, som udfører den samme opgave og er mere simpel, men som bruger commands, som jeg ikke kender endnu

11-05-2012 20:47 #12| 0
OP

@Heinz

Tja ... der er nogle commands, som jeg ikke lige er bekendt med. Og tror måske også læreren vil kigge lidt, hvis jeg begynder at smække nogle programmer afsted, som vi ikke har lært endnu.
Og jeg vil også gerne prøve at løse opgaven selv, uden at kopiere fra nettet.
Men tak for inputtet

11-05-2012 20:52 #13| 0

schackk hvorfor skriver du s=s i din forløkke?

11-05-2012 20:54 #14| 0
OP

Kan jeg ikke helt huske. Mener at jeg får en fejl, hvis jeg sletter det

11-05-2012 21:01 #15| 0

hmmm prøver lige at lave det

11-05-2012 21:03 #16| 0
OP

Ja, hvis jeg sletter s=s ifr "for" kommer der fejl. Har lige prøvet at rette det.

Error 1 Only assignment, call, increment, decrement, and new object expressions can be used as a statement

Error 3 The name 'f' does not exist in the current context

Error 6 Invalid expression term ')'

11-05-2012 21:09 #17| 0
Schackk skrev:
Ja, hvis jeg sletter s=s ifr "for" kommer der fejl. Har lige prøvet at rette det.

Error 1 Only assignment, call, increment, decrement, and new object expressions can be used as a statement

Error 3 The name 'f' does not exist in the current context

Error 6 Invalid expression term ')'


Tror ikke helt jeg har forstået hvad du vil have hjælp til, men den ovenstående fejl løses ved:

for (; s <= e;)

at sige s=s giver ikke mening og vil blive fjernet af compileren, men hvis du kan lide at se på det har det ingen funktionel betydning :)
11-05-2012 21:23 #18| 0
OP

Ja, den skriver også, om jeg er sikker på, at jeg vil bruge s=s.
Var ikke lige klar over, at man kunne skrive ";" før og så fjerne s=s.
Her med gjort

11-05-2012 21:44 #19| 0

For at putte de 37 grader ind imellem, skal du se på om nuværende i loopet er mindre end 37 og næste iteration er større end 37. Næste iteration må samtidig ikke overstige din max.

if (s <= e)
{
for (; s <= e;)
{
double f;
f = 9.0*s/5.0 + 32.0;

Console.WriteLine(s + " degrees celcius = {0} degrees fahrenheit", f);

if (s < 37 && (s+i>37 && s+i <= e)) // Putter 37 ind imellem
{
Console.WriteLine("37 degrees celcius = 98 degrees fahrenheit");
}
s = s + i;
}
}


for(; s <= e;) svarer til while(s <= e), som det nok er mere "rigtigt" at bruge..

11-05-2012 21:56 #20| 0
OP

Tusind tak, Heinz
37-funktionen virker nu.

Så er det bare det med, at den går 5 over værdien er e, selvom den ikke burde gøre det, når s<e

Men vis s>e (fx s=10 og e=-50), så stopper den 5 før den bør. F.eks ved 45, hvis e=50

12-05-2012 11:11 #21| 0

@Schackk
Det burde virke. Kan du c/p hele din kode? Så kan jeg lige prøve at gå den igennem

12-05-2012 13:48 #22| 0
OP

@Hans Peter

Hele koden er c/p ind i indlæg #8

23-05-2012 11:47 #23| 0
OP

Har et andet lille problem:

static void Main()
{

int a=1;
Console.Write("please type in a sentence :");
string w = Console.ReadLine();

foreach (char letter in w)
{
if (char= " ")
a = a + 1;
}

Console.WriteLine("There are {0} words in the sentence.", b);
Console.ReadKey();

Jeg vil gerne have programmet til at tælle hvor mange ord der er i sætningen, ved at programmet tæller hvor mange mellemrum der er.
SÅ hver gang ´foreach´ loop'en kører igennem, skal den tjekke om bogstavet er et mellemrum vha. 'if' kommandoen.
Men den vil ikke godkende if-kommandoen, som den er nu, da den ikke vil godkende brugen af "char" eller "letter".
Andre løsninger til, hvordan jeg får den til at tjekke, om et bogstav er et mellemrum " ".

Jeg ved godt, at der er smartere løsninger, men da vi er på første semester, er vores c# viden begrænset, og programmeringen kan derfor heller ikke være for avanceret.

Redigeret af Schackk d. 23-05-2012 11:48
23-05-2012 12:15 #24| 0

Ikke til c# men skal du ikke bruge == istedet for =?

Altså: if (char == " ")

23-05-2012 12:16 #25| 0

I andre sprog gælder ihvertfald at "==" er sammenligning, mens "=" er tildeling.

23-05-2012 12:25 #26| 0
OP

Har prøvet det.

I begge tilfælde skriver den "Invalid expression term char", og så er der en rød streg under "=" / "=="

23-05-2012 12:48 #27| 0

char er typen og letter er variablen, så du skal sammenligne variablen letter med tegnet ' ' (bemærk der benyttes enkelt anførselstegn som angiver chars, dobbelanførselstegn angiver strings). Håber det er hint nok til at du bør kunne løse opgaven.

23-05-2012 12:52 #28| 0

PNVA

23-05-2012 14:06 #29| 0
OP

@lethan

Går ud fra, at de er sådan her, du mener:

if (letter = ' ')

Så kommer der rød streg under hele if indholdet, samt fejl

Error 1 Cannot assign to 'letter' because it is a 'foreach iteration variable'
Error 2 Cannot implicitly convert type 'char' to 'bool'

23-05-2012 15:03 #30| 0
PBaek skrev:
I andre sprog gælder ihvertfald at "==" er sammenligning, mens "=" er tildeling.


:)
23-05-2012 15:15 #31| 0

@Schackk

= er assignment-operatoren.
== er sammenligningsoperatoren.

23-05-2012 16:20 #32| 0
OP

Super, nu virker det
Thanks

Lige et andet hurtigt spørgsmål

Hvis jeg nu skal indtaste et ord, og derefter udskrive ordet baglæns, kan jeg så på nogen måde, tildele hvert bogstav i ordet til en variabel, så jeg bagefter kan udskrive variablerne i omvendt rækkefølge.
Eller er der en nemmere måde
Kan forestille mig, at jeg skal bruge arrays på en eller anden måde

23-05-2012 17:38 #33| 0

string ord = "ditord";
var list = ord.ToCharArray();
string ordOmvendt = string.Empty;

for (int i = list.Length; i > 0; --i)
{
ordOmvendt += list[i-1];
}

Eller

string ord = "ditord";
var list = ord.ToCharArray().Reverse();
string ordOmvendt = string.Empty;

foreach (var c in list)
{
ordOmvendt += c;
}

Console.WriteLine(ordOmvendt);

Redigeret af Spurn d. 23-05-2012 17:42
23-05-2012 17:46 #34| 0

Spurn har sikker fat i det rigtige ifht. 1. semester :)
Men ellers findes reverse som extension metode i System.Linq.

Noget ala:
string word = "Heinz";
var reversedString = new string(word.Reverse().ToArray());

23-05-2012 17:55 #35| 0

Og hvis man vil et semester yderligere end Heinz :), så vælger man selvfølgelig at lave det som extension.

static class StringExtensions
{
public static string Reverse(this string word)
{
return new string(word.Reverse().ToArray());
}
}

Så kan du nøjes med "ditord".Reverse() på dine strings :).

23-05-2012 18:04 #36| 0
OP

Rolig nu ;)

Der er en del kommandoer i dit program, jeg ikke kender. Tror desværre at vores lærer vil gruble lidt, hvis jeg uploader den .cs
Desuden så læser jeg det, som om at det er et fast ord, der skrives omvendt. Man skal kunne taste et hvilket som helst ord ind, og få det skrevet omvendt

Jeg prøver lige at paste mit version ind senere, hvis jeg ikke kan få den til at virke

MEn tusind tak indtil videre.

Redigeret af Schackk d. 23-05-2012 18:05
23-05-2012 18:22 #37| 0
Prasd skrev:
PBaek skrev:
I andre sprog gælder ihvertfald at "==" er sammenligning, mens "=" er tildeling.


:)


Er det galt det jeg siger? :-)
23-05-2012 18:23 #38| 0
OP

Jeg havde tænkt noget i stil med dette:

int a = 0;
Console.Write("please type in a word :");
string w[] = Console.ReadLine();
{
foreach (char letter in w)
a = a + 1;

}
while(a>0);
Console.Write("{0}", w[a]);
a = a-1;

Det ord, er tastes ind, skal laves om til en string array.
Foreach lægger så 1 til a for hvert bogstav, der er i ordet. Er der f.eks 7 bogstaver, bliver a= 7
While loopen skriver så et bogstav så længe a>0, og og da a vil starte med at være 7, skal den skrive bogstav nr 7 i w array'en ( w[a])
SÅ bliver der trukket 1 fra a, så a bliver 6, og loopen derefter skriver bogstav nr 6.

Men ...
programmet vil ikke gå med at til min "string w[].Console readline"

23-05-2012 18:44 #39| 0
Schackk skrev:
Rolig nu ;)

Der er en del kommandoer i dit program, jeg ikke kender. Tror desværre at vores lærer vil gruble lidt, hvis jeg uploader den .cs
Desuden så læser jeg det, som om at det er et fast ord, der skrives omvendt. Man skal kunne taste et hvilket som helst ord ind, og få det skrevet omvendt

Jeg prøver lige at paste mit version ind senere, hvis jeg ikke kan få den til at virke

MEn tusind tak indtil videre.


Jeres lærer har vel ikke noget imod at I selv opsøger viden selvom det er foran undervisningen? :-)

Mht til at det skal virke på et hvilket som helst ord: Gem svaret i en variabel og kald variabel.reverse() ud fra Spurns eksempel.

Istedet for a = a+1 er det vist bedre at skrive a++ eller a += 1.
23-05-2012 19:11 #40| 0
PBaek skrev:
Prasd skrev:
PBaek skrev:
I andre sprog gælder ihvertfald at "==" er sammenligning, mens "=" er tildeling.


:)


Er det galt det jeg siger? :-)


Nej, det er korrekt :)
Var et fingerpeg til OP, om at han skulle bruge == istedet for =.
23-05-2012 19:15 #41| 0

@ OP

Brug Spurns første ex. Det er let læseligt, og den korrekte måde at gøre det på i øvelsessammenæng.

De andre ex. lærer du ikke noget af, andet end at .net frameworket har en masse smarte string funktioner indbygget. Det kan tids nok komme.

← Gå til forumoversigtenGå til toppen ↑
Skriv et svar