Avatar billede brixz Nybegynder
09. august 2003 - 17:01 Der er 15 kommentarer og
3 løsninger

Ohm's lov

Hej
Jeg er lige begyndt at lære noget om c++ og er stødt på problemmer.

Jeg har en formel for at lave ohm's lov (U=R*I) og det er også lykkedes for mig at lave et program der kan finde U, men det er også det eneste, Det jeg så gerne ville have den til at gøre er at man skal kunne vælge hvilken værdi man vil finde i stedet for det kun er U man kan finde!

i kan lige være med på en kikker i source'en
--------------------------------------------------#include<stdio.h>
#include<conio.h>

void main(){

int U,R,I;

clrscr();
printf("\n\n\n\n\n\t\t\t  Indtast din Modstand: ");
scanf("%d",&R);
clrscr();
printf("\n\n\n\n\n\t\t\t  Indtast dine Amperer: ");
scanf("%d",&I);
U=R*I;
clrscr();
printf("\n\n\n\n\n\t\t\t  Sp‘ndingen er nu: %d",U);
getch();

}
--------------------------------------------------

Den eneste løsning jeg kan se på det er hvis jeg laver en menu i en bat fil og laver 3 c++ programmer der kan beregne I,U og R
og fra batch filen starte den man vil finde!

men det er nemmest hvis alle 4 filer er i samme mappe!
er der en måde man kan lave alt dette i blot en C++ fil?

som sagt er jeg ret meget newbie til c++ så de eneste commandoer jeg kender lidt til er:
clrscr()  printf()  scanf()  getch()

på forhånd tak
Avatar billede repsak Nybegynder
09. august 2003 - 17:15 #1
Vil du lave 3 selvstændige programmer: finrU.exe, findR.exe, findI.exe? I så fald bør du lægge dem i samme mappe
Avatar billede brixz Nybegynder
09. august 2003 - 17:19 #2
Det er det jeg gerne ville undgå ved at lægge det hele sammen i en stor c++ fil
men det er den eneste metode jeg kan finde på da jeg ikke er så meget inde i c++
Avatar billede repsak Nybegynder
09. august 2003 - 17:22 #3
Du kan jo teoretisk set lave en menu i C++. Modtage brugerens valg og derefter agere efter det. Hvad du hvad jeg mener?
Avatar billede nicklasb Nybegynder
09. august 2003 - 17:26 #4
du kan også bare stille nogle simple if-sætnigner op. Altså først spørge hvilken af de tre brugeren vil have regnet, og så efterfølgende spørge ud fra dette valg, og til sidst beregne den manglende!
Avatar billede repsak Nybegynder
09. august 2003 - 17:30 #5
1) vis brugermuligheder (glem ikke afslut)
2) fang brugers input med f.eks. std::cin >> i
3) test input med f.eks. if-sætninger
4) hvis brugeren ønsker at finde U, så spørg efter R og I
5) foretag den/de nødvendige beregninger og udskriv resultatet.
6) start forfra (eller afslut)
Avatar billede bertelbrander Novice
09. august 2003 - 17:40 #6
Du skal starte med at spørge brugeren hvilken variabel han vil beregne:

char valg;
printf("Hvad vil du beregne [uri]: ");
valg = getchar(); /* evt getch() */

Så beder du brugeren intaste de værdier der ønskes:

if(valg == 'u || valg == 'i')
{
  /* Bed brugeren om r */
}
etc
Og til slut beregner du det der skal beregnes og udskriver det.

PS: Du skal indsætte en fflush(stdout) efter printf hvis denne ikke afsluttes med en \n ellers er det ikke sikket at brugeren kan se det udskrevne før han har tastet enter.

PPS: main() skal retunere en int
Avatar billede repsak Nybegynder
09. august 2003 - 17:42 #7
"main() skal retunere en int" -> main() SKAL ikke returnere int, men det ses gerne? Der er dog nogle compilere som kræver at main() returnerer en værdi.
Avatar billede tosssen Nybegynder
09. august 2003 - 20:01 #8
Læs her hvorfor du bør returnere en int

http://www.eksperten.dk/spm/350098
Avatar billede tosssen Nybegynder
09. august 2003 - 20:22 #9
Forslag: Smid nedenstående ind i main og husk at inkludere <iostream>

double U, R, I;
char valg = '\0'; //'\0' står valg ikke er truffet

cout << "Indtast vædier for U, R og I" << endl;
cout << "Den ukendte gives værdien x... ";

if (!(cin >> U))) //Hvis bruger indtaster 'x' eller andet ugyldigt
{
  cin.clear();              //Gør cin klar
  while (cin.get() != '\n') //til at køre igen
      continue;
  valg = 'U';
}

if (!(cin >> R)) //Hvis bruger indtaster 'x' eller andet ugyldigt
{
  cin.clear();
  while (cin.get() != '\n')
      continue;
  if (!valg) //Hvis valg ikke er truffet ovenfor
      valg = 'R';
  else
  {
      cout << "Du er nødt til at skive en talværdi!";
      while (!(cin >> R))
      {
        cin.clear();
        while (cin.get() != '\n')
            continue;
        cout << "Du er nødt til at skrive en talværdi!";
      }
  }
}

if (!(cin >> I)) //Hvis bruger indtaster 'x' eller andet ugyldigt
{
  cin.clear();
  while (cin.get() != '\n')
      continue;
  if (!valg) //Hvis valg ikke er truffet ovenfor
      valg = 'I';
  else
  {
      cout << "Du er nødt til at skive en talværdi!";
      while (!(cin >> I))
      {
        cin.clear();
        while (cin.get() != '\n')
            continue;
        cout << "Du er nødt til at skrive en talværdi!";
      }
  }
}

cout << valg << " = ";
switch(valg)
{
  case 'U':
      cout << R*I << endl;
      break;
  case 'R':
      cout << U/I << endl;
      break;
  case 'I':
      cout << U/R << endl;
      break;
  default:
      cout << "Ukendt fejl!" << endl;
}
Avatar billede tosssen Nybegynder
09. august 2003 - 20:29 #10
Prøvede lige at compile det og fandt en enkelt fejl, som er en slut parentes for meget i den første if-sætning. Man bør nok også ovenfor stederne med (cin >> RellerUellerI) lave en cout der siger til brugeren hvilken værdi de skal til at indtaste ;-)
Avatar billede tosssen Nybegynder
10. august 2003 - 00:42 #11
Den komplette kode kunne se således ud:

#include <iostream>
#include <cstdlib>
using std::cout;
using std::cin;
using std::endl;

int main()
{
    double U, R, I;
    char valg = '\0'; //'\0' står valg ikke er truffet

    cout << "Indtast værdier for U, R og I" << endl;
    cout << "Den ukendte gives værdien x... " << endl;

    cout << "Indtast U: ";
    if (!(cin >> U)) //Hvis bruger indtaster 'x' eller andet ugyldigt
    {
        cin.clear();              //Gør cin klar
        while (cin.get() != '\n') //til at køre igen
            continue;
        valg = 'U';
    }

    cout << "Indtast R: ";
    if (!(cin >> R)) //Hvis bruger indtaster 'x' eller andet ugyldigt
    {
        cin.clear();
        while (cin.get() != '\n')
            continue;
        if (!valg) //Hvis valg ikke er truffet ovenfor
            valg = 'R';
        else
        {
            cout << "Du er nødt til at skive en talværdi!";
            while (!(cin >> R))
            {
                cin.clear();
                while (cin.get() != '\n')
                    continue;
                cout << "Du er nødt til at skrive en talværdi!";
            }
        }
    }

    if (valg) //Hvis valg er truffet ovenfor
    {
        cout << "Indtast I: ";
        if (!(cin >> I))    //Hvis bruger indtaster 'x' eller andet ugyldigt
        {
            cin.clear();
            while (cin.get() != '\n')
                continue;
            if (!valg) //Hvis valg ikke er truffet ovenfor
                valg = 'I';
            else
            {
                cout << "Du er nødt til at skive en talværdi!";
                while (!(cin >> I))
                {
                    cin.clear();
                    while (cin.get() != '\n')
                        continue;
                    cout << "Du er nødt til at skrive en talværdi!";
                }
            }
        }
    }
    else //Ellers er valget ikke truffet og 'I' må være den ukendte
        valg = 'I';

    cout << valg << " = ";
    switch(valg)
    {
    case 'U':
        cout << R*I << endl;
        break;
    case 'R':
        cout << U/I << endl;
        break;
    case 'I':
        cout << U/R << endl;
        break;
    default:
        cout << "Ukendt fejl!" << endl;
    }
    system("PAUSE");
    return 0;
}
Avatar billede arne_v Ekspert
10. august 2003 - 00:50 #12
Et løsnings forslag som bruger de samme funktioner som din oprindelige kode:

#include <stdio.h>
#include <conio.h>

void prt(char *s)
{
  clrscr();
  printf("\n\n\n\n\n\t\t\t  %s",s);
  return;
}

char read_type()
{
  char t;
  prt("Indtast hvad du vil beregne (S/M/A): ");
  scanf("%c",&t);
  return t;
}

int read_sp()
{
  int U;
  prt("Indtast din Sp‘nding: ");
  scanf("%d",&U);
  return U;
}

int read_mod()
{
  int R;
  prt("Indtast din Modstand: ");
  scanf("%d",&R);
  return R;
}

int read_amp()
{
  int I;
  prt("Indtast din Ampere: ");
  scanf("%d",&I);
  return I;
}

void prt_res(char *s,int v)
{
  char tmp[100];
  sprintf(tmp,"%s%d\n",s,v);
  prt(tmp);
  return;
}

int main()
{
  switch(read_type())
  {
      case 'S':
        prt_res("Sp‘ndingen er nu: ",read_mod()*read_amp());
        break;
      case 'M':
        prt_res("Modstanden er nu: ",read_sp()/read_amp());
        break;
      case 'A':
        prt_res("Amperer er nu: ",read_sp()/read_mod());
        break;
      default:
        prt("Invalid beregning\n");
        break;
  }
  getch();
  return 0;
}
Avatar billede tosssen Nybegynder
10. august 2003 - 00:52 #13
Undskyld! Ser først nu at du ikke kender cout, cin, endl osv... Du skal være meget velkommen til at spørge til ovenstående kode!
Avatar billede bertelbrander Novice
10. august 2003 - 02:27 #14
En lidt kortere version:

#include <conio.h>
#include <stdio.h>

int main(void)
{
  double x = printf("What to calculate [uri]? "), y;
  int idx = (getch() & 0x07) >> 1;
  printf("\nEnter %s: ", idx & 2 ? "R" : "U");
  scanf("%lf", &x);
  printf("Enter %s: ", idx ? "I" : "R");
  scanf("%lf", &y);
  printf("Result: %f\n", idx == 2 ? x*y : x/y);
  return 0;
}
Avatar billede arne_v Ekspert
10. august 2003 - 15:27 #15
:-)
Avatar billede arne_v Ekspert
18. august 2003 - 23:31 #16
brixz>

Tid at lukke spørgsmålet ?
Avatar billede brixz Nybegynder
19. august 2003 - 21:48 #17
Okay takker for jeres tid, nu har jeg fundet ud af det ;)
Avatar billede tosssen Nybegynder
19. august 2003 - 22:42 #18
Det var så lidt
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester