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
Stránky: 1
Téma zavřeno
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

Priklad 1) by mohl vypadat treba nejak takhle:
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
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):
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
ja mam jen pascala a ta prvni uloha co napsal lumikodlak mi nejde pise mi to neustale chybu nejakou...
Offline
Tridici algoritmy, ktere jsem kdysi psal do skoly, treba v tom najdes inspiraci. Psano v C#.
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

↑ 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
dobry uz to jde dik moc:)
Offline
Téma zavřeno
Stránky: 1