Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 16. 11. 2010 22:25 — Editoval BrozekP (23. 11. 2010 15:55)

trikolorka
Zelenáč
Příspěvky: 23
Reputace:   -2 
 

pascal-pocet slov, setrideni posloupnosti, pocet ruznych cisel

1)Určete počet slov obsažených v textovém souboru vstup.txt. Výsledný počet slov vypište na standardní výstup. Řádky vstupního souboru mají délku maximálně 200 znaků.

Slovem rozumíme maximální souvislý úsek znaků různých od mezery umístěný na jednom řádku souboru. Každá dvě slova na řádku jsou oddělena alespoň jednou mezerou, mezi dvěma slovy ovšem může být i více mezer. Na začátku a na konci řádku mezera být nemusí, ale může (může tam být i více mezer).

Příklad:
vstup.txt

  Když jde     malý bobr
                              spát,

  tak si
    chvíli
       hraje rád.
 
standardní výstup

  10


2)Na vstupu dostanete posloupnost čísel ukončenou -1, která není součástí posloupnosti. Vypište tuto posloupnost setříděnou vzestupně, jednotlivá čísla oddělujte mezerami.


3)Vstupní textový soubor 'vstup.txt' obsahuje celá čísla (z rozsahu typu integer) oddělená mezerami a konci řádků. Počet všech čísel není vyšší než 10000, hodnoty se mohou v souboru libovolně opakovat. Určete, kolik různých hodnot se v souboru vyskytuje. Výsledkem výpočtu bude jedno celé číslo, které program vypíše na standardní výstup.

Příklad:
Pro vstupní soubor 'vstup.txt' ve tvaru
15 999 7 -3 7 1 15 15
bude výsledkem číslo 5, neboť v souboru se vyskytuje pět různých hodnot (jsou to čísla 15, 999, 7, -3 a 1).

Offline

 

#2 19. 11. 2010 19:57

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: pascal-pocet slov, setrideni posloupnosti, pocet ruznych cisel

Priklad 1) by mohl vypadat treba nejak takhle:

Code:

program PocetSlovVSouboru;
  Var Soubor: text;
      Radek:string;
      i, PocetSlov: integer;
      UvnitrSlova: boolean;
begin
  assign (Soubor, 'text.txt');
  reset (Soubor);
  PocetSlov := 0;
  while not eof(Soubor) do begin
    UvnitrSlova := false;
    readln (Soubor, Radek);
    for i := 1 to length(Radek) do begin
      if Radek[i] = ' ' then UvnitrSlova := false
      else begin
        if UvnitrSlova = false then PocetSlov := PocetSlov + 1;
        UvnitrSlova := true;
      end;
    end;
  end;
  close (Soubor);
  writeln (PocetSlov);
end.

Sice bych umel (a nejen ja) napsat reseni vsech prikladu co jsi sem napsala, ale nejspis uz k tvym tematum psat nebudu, protoze na moje (a nejen moje) prispevky moc nereagujes, vypada to (mozna ze to tak jen vypada, ale neni to tak), ze se moc nesnazis, a ani nevim, jestli reseni jeste potrebujes.

Offline

 

#3 19. 11. 2010 21:48

vojta01
Příspěvky: 63
Reputace:   
 

Re: pascal-pocet slov, setrideni posloupnosti, pocet ruznych cisel

Ahoj, pokud tu první úlohu budeš programovat v C++, tak stačí napsat toto (využívám příkazu soubor >> slovo, který do proměnné slovo načte právě 1 slovo = posloupnost znaků končící mezerou nebo koncem řádku -> velmi užitečný příkaz):

ifstream soubor;
soubor1.open("vstup.txt");
string slovo;
int pocet_slov = 0;
while(!soubor.eof())
{
   soubor >> slovo;
   pocet_slov++;
}
cout << pocet_slov;
soubor.close();

U ulohy 2 použij nějaký třídící algoritmus, doporučuji quicksort (zkus si to vygooglit), v céčku ke třídění existuje funkce qsort().

Trik u 3. úlohy zpočívá v setřízení vstupního pole, čímž se ti vedle sebe dostanou stejné hodnoty, pro ukázkový vstup to bude:
-3 1 7 7 15 15 15 999
Nyní už stačí projít pole od druhého čísla po poslední tak, že proměnná pocet bude mít na začátku hodnotu 1 (reprezentuje první čslo v poli) a poté procházím pole od druhého čísla a zkouším, zda je hodnota tohoto prvku pole různá od prvku pole s indexem o jedničku menším. Pokud je různý, pak jsem našel další číslo a zvětším hodnotu proměnné pocet o jedničku (v opačném případě jsem narazil na další výskyt nějakého čísla):

Code:

N : intereg; { počet čísel}
...
pole : array[1..N] of integer;
...
{setřiď pole}
pocet := 1;
index := 1;
while index <= N do {pro všechny prvky pole s indexem od 2 do N}
begin
   if pole[index] <> pole[index-1] then {nové číslo - první výskyt}
      pocet := pocet+1;
   index := index+1;
end;
writeln(pocet);

Offline

 

#4 23. 11. 2010 09:35

trikolorka
Zelenáč
Příspěvky: 23
Reputace:   -2 
 

Re: pascal-pocet slov, setrideni posloupnosti, pocet ruznych cisel

ja mam jen pascala a ta prvni uloha co napsal lumikodlak mi nejde pise mi to neustale chybu nejakou...

Offline

 

#5 23. 11. 2010 10:26

ondrouchd
Příspěvky: 43
Reputace:   
 

Re: pascal-pocet slov, setrideni posloupnosti, pocet ruznych cisel

Tridici algoritmy, ktere jsem kdysi psal do skoly, treba v tom najdes inspiraci. Psano v C#.

Code:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace elmetrCore.Classes
{
    public class Sort
    {
        /// <summary>
        /// Trideni primym vyberem je zalozeno na opakovanem vybirani 
        /// nejmensiho cisla z doposud nesetridenych cisel. Nalezene cislo
        /// se prohodi s prvkem na zacatku pole a cely postup se opakuje 
        /// tentokrat s nejmensim cislem na indexech 2, ... ,N ktere 
        /// prohodime s druhym prvkem v poli. Pote se postup opakuje s prvky
        /// s indexy 3, ... ,N.
        /// </summary>
        #region SelectSort 
        public static List<int> SelectSort(List<int> A)
        {
            int i, j, k, x;
            int n = A.Count;

            for (i = 1; i < n - 1; i++)
            {
                k = i;

                for (j = i + 1; j < n; j++)
                { 
                    if (A[j]<A[k]) k=j;

                    x=A[k];
                    A[k]=A[i];
                    A[i]=x;
                }
            }
            return A;
        } 
        public static List<int> SelectSort(string filename)
        {
            List <int> A = Mining(filename);
            SelectSort(A);
            return A;
        }
        #endregion SelectSort

        /// <summary>
        /// Trideni primym vkladanim je v podstate podobne. Na zacatku pole
        /// se vytvori spravne utridena posloupnost, kterou postupne 
        /// rozsirujeme. Na zacatku i-teho kroku ma tato utridena pst delku 
        /// i-l. V i-item kroku se urci pozice i-teho cisla v dosud utridene 
        /// posloupnosti a zaradi se do utridene posloupnosti. Zbytek utridene 
        /// posloupnosti se posune o jednu pozici doprava.
        /// </summary>
        #region InsertSort
        public static List<int> InsertSort(List<int> A)
        {
            int i, j, x;
            int n = A.Count;
            for (i = 2; i < n; i++)
            {
                x = A[i];
                j = i - 1;

                while((j>0) && (x<A[j]))
                {
                    A[j + 1] = A[j];
                    j = j - 1;
                }
                A[j + 1] = x;
            }
            return A;
        }

        public static List<int> InsertSort(string filename)
        {
            List <int> A = Mining(filename);
            InsertSort(A);
            return A;
        }
        #endregion InsertSort

        /// <summary>
        /// Bublinkove trideni v podstate jakoby probublava nesetrideny seznam.
        /// Postupne se porovnavaji dvojice sousednich prvku, napr. zleva 
        /// doprava a pokud v porovnane dvojici nasleduje mensi cislo po vetsim,
        /// tak se tato dve cisla prohodi. Cely tento postup se opakuje, dokud
        /// probihaji nejake zmeny. Algoritmus konci tehdy, kdyz jiz nedochazi
        /// k zadne vymene. Tim je pole setridene.
        /// </summary>
        #region BubleSort
        public static List<int> BubleSort(List<int> A)
        {
            int i, x;
            int n = A.Count;
            bool zmena;

            do
            {
                zmena = false;

                for (i = 1; i < n-1; i++)
                {
                    if (A[i] > A[i + 1])
                    {
                        x = A[i];
                        A[i] = A[i + 1];
                        A[i + 1] = x;
                        zmena = true;
                    }
                }
            }
            while(!zmena);
            return A;
        }

        public static List<int> BubleSort(string filename)
        {
            List<int> A = Mining(filename);
            BubleSort(A);
            return A;
        }
        #endregion InsertSort

        /// <summary>
        /// Trideni slevanim neboli Merge Sort je jiz sofistikovanejsi.
        /// Je zalozene na principu spojovani jiz setridenych posloupnosti
        /// dohromady. Pro predstavu, mame-li dve setridene posloupnosti a 
        /// chceme je spojit dohromadz, potom musime porovnat nejmensi prvky
        /// obou posloupnosti a mensi z techto prvku vzdy odstranit a presunout
        /// do nove posloupnosti. Tento algoritmus vyuziva pomocne pole.
        /// </summary>
        #region MergeSort
        public static List<int> MergeSort(List<int> A)
        {
            List<int> Pole = null; // pomocne pole
            /*
             * delka  ... delka setridenych posloupnosti
             *     i  ... index do vytvarene posloupnosti
             * i1, i2 ... index do slevanych posloupnosti
             * k1, k2 ... konce slevanych posloupnosti
             */
            int delka, i, i1, i2, k1, k2;
            int n = A.Count;

            delka = 1;
            while(delka < n)
            {
                i1 = 1;
                i2 = delka + 1;
                i = 1;
                k1 = delka;
                k2 = 2 * delka;

                while(i2<n)
                {
                    // slevani A[i1...k1] a A[i2...k2]
                    if (k2 < n) k2 = n;

                    while((i1<=k1) || (i2<=k2))
                    {
                        
                        if ((i2 > k2) || ((i1 <= k1) && (A[i1] <= A[i2])))
                        {
                            Pole[i] = A[i1];
                            i = i + 1;
                            i1 = i1 + 1;
                        }
                        else
                        {
                            Pole[i] = A[i2];
                            i = i + 1;
                            i2 = i2 + 1;
                        }
                        i1 = k2 + 1;
                        i2 = i1 + delka;
                        k1 = k2 + delka;
                        k2 = k2 + 2 * delka;
                    }
                    A = Pole;
                    delka = 2 * delka;
                }
            }
            return A;
        }

        public static List<int> MergeSort(string filename)
        {
            List<int> A = Mining(filename);
            MergeSort(A);
            return A;
        }
        #endregion MergeSort

        /// <summary>
        /// V case O(N.log N) pracuje také algoritmus QuickSort. Tento algoritmus
        /// je zalozen na metode rozdel a panuj. Nejprve se zvoli pivot (cislo). 
        /// Pak se pole preusporada a rozdeli na dve casti tak, ze zadny prvek
        /// v prvni casti nebude vetsi nez pivot a zadny prvek v druhe casti nebude
        /// mensi nez pivot. Prvky v obou castech se potom rekurzivne setridi. V 
        /// kazdem kroku musi byt obe casti neprazdne, rekurze musi byt konecna.
        /// Pivot se voli nahodne z dosud nesetrideneho useku. Proste se sahne
        /// nekam do pole a nalezeny prvek se prohlasi za pivot. V tomto algoritmu 
        /// se bude za pivot brat prvek uprostred trideneho useku.
        /// </summary>
        #region QuickSort
        public static List<int> QuickSort(List<int> A, int r, int l)
        {
            int i, j, k, x;
            i = 1;
            j = r;
            k=A[(i+j) / 2];
            do
            {
                while(A[i]<k)
                {
                    i=i+1;
                }
                while(A[j]>k)
                {
                    j=j-1;
                }
                if (i<=j)
                {
                    x=A[i];
                    A[i]=A[j];
                    A[j]=x;
                    i=i+1;
                    j=j-1;
                }
            }
            while (i>=j);
            if(j>1) QuickSort(A, 1, j);
            if(i<r) QuickSort(A, i, r);
            return A;
        }

        public static List<int> QuickSort(string filename, int r, int l)
        {
            List<int> A = Mining(filename);
            QuickSort(A, r, l);
            return A;
        }
        #endregion QuickSort

        public static List<int> Mining(string filename)
        {
            List <int> list=null;

            try
            {
                FileStream fs = new FileStream(filename, FileMode.Open);
                StreamReader sr = new StreamReader(fs);
                long pocet = fs.Length;

                list = new List<int>();
                
                string line = "";
                int lineNo = 0;
                
                do
                {
                    line = sr.ReadLine();
                    int line2 = Convert.ToInt32(line);
                    if (line != null)
                    {
                        // zapis udaj do pole
                        list.Add(line2);
                        
                        //Console.WriteLine("{0}: {1}", lineNo, line);
                        lineNo++;
                    }
                } while (line != null);
                sr.Close();
                fs.Close();
            }
            catch (Exception e)
            {
                //Console.WriteLine("Exception in ShowFile: {0}", e);
                MessageBox.Show("Exception in ShowFile: " + e);
            }

            return list;
        } // dolovani z textoveho souboru
    }
}

Jinak na internetu jsou mraky resenych prikladu z algoritmizace (hodne z nich je psano v Pascalu) napr. zkus http://ksp.mff.cuni.cz/tasks/20/cook2.html

Offline

 

#6 23. 11. 2010 11:28

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: pascal-pocet slov, setrideni posloupnosti, pocet ruznych cisel

↑ trikolorka:
Kdyz to zkousim, tak mi to funguje normalne. Ale chyba bude asi v tom, ze jsem tam zadal ten soubor 'text.txt' a ma tam byt 'vstup.txt'. Kdyz ten soubor neexistuje, tak to ohlasi chybu. Tak to muzes zmenit na vstup.txt a zkontrolovat jestli tam ten soubor je, a jestli to porad bude hlasit chybu, tak kdyztak napis co je to presne za chybu (asi to bude nejaky Runtime error a cislo).

Offline

 

#7 23. 11. 2010 14:14

trikolorka
Zelenáč
Příspěvky: 23
Reputace:   -2 
 

Re: pascal-pocet slov, setrideni posloupnosti, pocet ruznych cisel

dobry uz to jde dik moc:)

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson