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
c# eksperter
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.
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) ?
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.
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();
}
}
}
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
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;
}
}
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
@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
Kan jeg ikke helt huske. Mener at jeg får en fejl, hvis jeg sletter det
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 ')'
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 :)
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
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..
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
@Schackk
Det burde virke. Kan du c/p hele din kode? Så kan jeg lige prøve at gå den igennem
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.
Ikke til c# men skal du ikke bruge == istedet for =?
Altså: if (char == " ")
I andre sprog gælder ihvertfald at "==" er sammenligning, mens "=" er tildeling.
Har prøvet det.
I begge tilfælde skriver den "Invalid expression term char", og så er der en rød streg under "=" / "=="
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.
PNVA
@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'
PBaek skrev:
I andre sprog gælder ihvertfald at "==" er sammenligning, mens "=" er tildeling.
:)
@Schackk
= er assignment-operatoren.
== er sammenligningsoperatoren.
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
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);
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());
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 :).
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.
Prasd skrev:PBaek skrev:
I andre sprog gælder ihvertfald at "==" er sammenligning, mens "=" er tildeling.
:)
Er det galt det jeg siger? :-)
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"
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.
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 =.