Wątek zablokowany 2013-10-31 11:20 przez Rev.

Podstawy-fortran

0

Witam.
Zaczynam poznawać jezyk Fortrana i jest to <ort>w ogóle</ort> mój pierwszy język, który poznaje.Mam więc elementarne pytanie.W prostym programie:

      program ifelse
      implicit none
      integer :: a,b,c
1010  write (*,*) "podaj A"
       read (*,*) a
      write (*,*) "Podaj B"
       read (*,*) b
       IF (a>b) THEN
       write (*,*) "Wieksza liczba A"
       read (*,*) a
       ELSE IF (a<b) THEN
       write (*,*) "Wieksza liczba B"
       read (*,*) b
       ELSE IF (a==b) THEN
       write (*,*) "Liczba A rownia sie licznie B"
       read (*,*) 
       END IF 
      GOTO 1010
      END PROGRAM

wszystko działa poprawnie oprócz polecenia GOTO 1010 tzn. po wykonaniu instrukcji porównania liczb ze sobą program nie wraca od razu do linii 1010.Zanim to się stanie muszę wcześniej podać jakąś liczbę.
Np.
Podaj liczbe A
2
Podaj liczbe B
1
Liczba A wielsza od liczby B
! Teraz nic się nie dzieje. Dopiero gdy wprowadzę jakąś liczbę program skacze do linii 1010 i wówczas prosi mnie o podanie liczby A.
Co zrobić aby od razu pytał o liczbę A?
Dzięki za odpowiedź.Pozdrawiam

0

8-O Fortrana? Przecież to jeden z najstarszych istniejących języków. Zastanów się czy nie lepiej byłoby zmienić język (aczkolwiek to twoja decyzja)

Co do problemu - wypróbuj taki kod:

    program ifelse
      implicit none
      integer :: a,b,c
1010  write (*,*) "podaj A"
       read (*,*) a
      write (*,*) "Podaj B"
       read (*,*) b
       IF (a>b) THEN
       write (*,*) "Wieksza liczba A"
       ELSE IF (a<b) THEN
       write (*,*) "Wieksza liczba B"
       ELSE IF (a==b) THEN
       write (*,*) "Liczba A rownia sie licznie B"
       END IF
      GOTO 1010
      END PROGRAM
0

Dzięki, działa :-) chociaż nie rozumiem dlaczego usunięcie zapisu read (,) zmieniło w takim stopniu działanie kodu.
Natomiast co do fortrana to nie mam wyjścia i muszę się go nauczyć. Odgórny wymóg:/

0

instrukcja read(,) powoduje, że program czeka na podanie danych wejściowych. Zatem ostatnie wywołanie tej instrukcji "zawiesza" działanie programu do momentu, aż nie zostanie podana liczba.
Swoją droga po co trzeci if?

0
MSM napisał(a)

8-O Fortrana? Przecież to jeden z najstarszych istniejących języków.

BTW, podobno języki mumii egipskich są młodsze.

0

No nie mam pojęcia jak napisać program [???], który zliczałby ilość wyrazen typu PP,RR,TW itp. z pliku na dysku.Wiem, że należy plikowi takiemu należy nadać rozszerzenie dat. lub txt. i wiem jak taki plik otworzyć.Natomiast co potem to nie mam pojęcia.Przyklad pliku:

dane.dat
PP
RR
TW
TW
RR

Chciałbym aby wynik działania programu wyglądał tak:
TW wystąpiło 2x
PP wystąpiło 1x
RR wystąpiło 2x.

Ktoś jakieś pomysły i jest gotów się nimi podzielić??Pozdrawiam

0

Nie pomogę ci z Fortranem, ale że leżę dzisiaj chory to proszę, gotowiec w czterech innych językach ;-)

using System;
using System.IO;

class Program
{
   public static void Main()
   {
      var plik=new StreamReader("data.dat");
      int PP=0, RR=0, TW=0;
      while (!plik.EndOfStream)
      {
         string linia=plik.ReadLine();
         if (linia=="PP") PP++;
         else if (linia=="RR") RR++;
         else if (linia=="TW") TW++;
      }
      plik.Close();
      Console.WriteLine("PP wystąpiło {0}x",PP);
      Console.WriteLine("RR wystąpiło {0}x",RR);
      Console.WriteLine("TW wystąpiło {0}x.",TW);
   }
}
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
   int PP=0, RR=0, TW=0;
   ifstream plik("data.dat",ios::in);
   while (!plik.eof())
   {
      string linia;
      getline(plik,linia);
      if (linia=="PP") PP++;
      else if (linia=="RR") RR++;
      else if (linia=="TW") TW++;
   }
   plik.close();
   cout << "PP wystąpiło " << PP << "x\n";
   cout << "RR wystąpiło " << RR << "x\n";
   cout << "TW wystąpiło " << TW << "x." << endl;
}
#include <stdio.h>
#include <string.h>

int main()
{
   int PP=0, RR=0, TW=0;
   char linia[256];
   FILE *plik=fopen("data.dat","rt");
   while(fgets(linia,sizeof(linia),plik)!=NULL)
   {
      int last;
      last=strlen(linia)-1;
      if (linia[last]=='\n') linia[last]='\0';
      if (strcmp(linia,"PP")==0) PP++;
      else if (strcmp(linia,"RR")==0) RR++;
      else if (strcmp(linia,"TW")==0) TW++;
   }
   fclose(plik);
   printf("PP wystąpiło %ix\n",PP);
   printf("RR wystąpiło %ix\n",RR);
   printf("TW wystąpiło %ix.\n",TW);
}
var
   plik:text;
   linia:string;
   PP,RR,TW:integer;
begin
   assign(plik,'data.dat');
   reset(plik);
   while not eof(plik) do
   begin
      readln(plik,linia);
      if linia='PP' then inc(PP)
      else if linia='RR' then inc(RR)
      else if linia='TW' then inc(TW);
   end;
   close(plik);
   writeln('PP wystąpiło ',PP,'x');
   writeln('RR wystąpiło ',RR,'x');
   writeln('TW wystąpiło ',TW,'x.');
end.
0

@up - mogłeś jeszcze przetłumaczyć translatorem online z C# na VB. Miałbyś pięć. ;)

0

Dzięki bardzo za odpowiedź.
W poniedziałek w pracy sprawdzę czy uda mi się przenieść te instrukcję na fortrana.
Pozdrawiam serdecznie

0
somekind napisał(a)

@up - mogłeś jeszcze przetłumaczyć translatorem online z C# na VB. Miałbyś pięć. ;)

Oxygene ciekawsze ;-)

{pisane na sucho, nie wiem czy się kompiluje }
namespace zadanie;

interface
uses System, System.IO;

type Program=class
  class method Main;
end;

implementation

class method Program.Main;
var
  PP:integer:=0;
  RR:integer:=0;
  TW:integer:=0;
begin
  var plik:=new StreamReader('data.dat');
  while not plik.EndOfStream do
  begin
    var linia:string:=plik.ReadLine;
    if linia='PP' then inc(PP)
    else if linia='RR' then inc(RR)
    else if linia='TW' then inc(TW);
  end;
  plik.Close;
  Console.WriteLine('PP wystąpiło {0}x',PP);
  Console.WriteLine('RR wystąpiło {0}x',RR);
  Console.WriteLine('TW wystąpiło {0}x.',TW);
end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0