Ahoj, vedel by nekdo jak udelat tento program v Cčku? Má jít o program, který z texťáku načte text a vety z tohoto textu program nejak prehaze.
Fórum › C / C++
Načtení textu z texťáku a přeházení vět (popřípadě slov)
#2 KIIV
Praveze moc nevim jak na to. Tak na zacatek si asi vytvorim textovy soubor, kde napisu text a ulozim ho. Nebo by to asi slo napsat aj primo do programu aby me to vyzvalo k zapisu nejakyho textu, ja bych ho zapsal a ono by ten textak to vytvorilo. Ale staci kdyz ten textak vytvorim manualne. No a potom nejak prijit na to, jak udelat to, aby se prehazely ty vety nejak :(
Tady mam cteni ze souboru, ale nefunguje mi to :(
#include <stdio.h>
#include <stdlib.h>
FILE *soubor;
char jmeno[100];
void cteniZeSouboru()
{
soubor = fopen("data.txt", "r");
while(!(feof(soubor))) {
fscanf(soubor, "%s", &jmeno);
printf("%s\n", jmeno);
}
fclose(soubor);
}
system("PAUSE");
return 0;
}
Nech se inspirovat http://www.daniweb.com/software-development/cpp/threads/74451/reading-in-a-random-line-from-a-file
Tady je program, ktery pri spusteni vyzaduje zapsani textu do 100 znaku. Tento text se prevede na VELKA PISMENA a ulozi se jak zadany text, tak i upraveny text na VELKA pismena. Dalo by se to nejak upravit na to, aby pri zadani textu to prohodilo ty vety nebo slova nejak ? Dekuji za veskere napady a pripominky ;)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char text[100], znak;
FILE *fMala, *fVelka;
printf("Zadejte text do delky 100 pismen: ");
gets(text);
fMala = fopen("data.txt", "w");
fputs(text, fMala);
fclose(fMala);
printf("\nNyni se podivejte do slozky se souborem data.txt\n");
fMala = fopen("data.txt", "r");
fVelka = fopen("VELKE.txt", "w");
while ((znak = fgetc(fMala)) != EOF)
{
if((znak >= 'a') && (znak <= 'z'))
{
znak -= 32;
putchar(znak);
fputc(znak, fVelka);
}
else
{
putchar(znak);
fputc(znak, fVelka);
}
}
fclose(fMala);
fclose(fVelka);
printf("\n");
return 0;
}
zkus si představit, jak to uděláš "ručně". Pak to rozděl na dílčí úlohy, např. otevřít soubor, přečíst z něj větu (čím končí věta?), nahodile vybrat uloženou větu a vypsat ji.
hu
#10 hlucheucho
No jasne, ale co mam pouzit za funkci aby mi to ty vety nejak prehazelo ? Myslis ze by slo osetrit useky, ktere zacinaji velkym pismenem a konci texkou ? Napr.: kdyz tam budu mit treba 5 vet tak se to rozdeli na 5 useku a tyto useky se nahodne preskupi treba do druheho textaku ? nebo jen vypisou, to je jedno.
mám pole řetězců - zatím prázdný. Otevřu vstupní soubor (fopen) pro čtení, čtu ho po znacích (fgetc), ukládám do řetězce a testuji, zda je to ? ! nebo .(if). Pokud ano, jedná se o konec věty (pominu zkratky ukončené tečkou), na konec řetězce jako jeho poslední znak uložím 0x00 a přesunu se na další řetězec. Mezeru ignoruji (oět if) a čtu až další znak. Toto opakuji až po konec souboru (končí znakem EOF). Mám pole přečtených řetězců = vět. Zavřu vst. soubor (fclose). Otevřu výst soubor (zase fopen). Generátorem náhodných čísel vyberu jednotlivé položky tak, aby se neopakovaly (to tu nedávno někde bylo) a celé řetězce ukládám do souboru (asi fprintf). Po skončení práce výst. soubor zavřu.
Výpis na obrazovku jde udělat pomocí printf.
Když vypustíš jména funkcí v závorkách máš obecný algoritmus bez ohledu na programovací jazyk, ve kterém dojde k implementaci algoritmu. V závorkách máš funkce z jazyka C, pro jejich použití musíš použít #include <stdio.h>
hu
začni se statickým polem s tím, že věta bude omezena na max 64 znaků a celý soubor na max 10 vět. Až to rozchodíš, začni bádat na dynamickou alokací řetězců pro uložení vět. Postup od jednoduššího ke složitějšímu.
Je ještě alternativní postup: uložím soubor jako blok dat do bufferu - také po znacích a současně si zapamatuju ukazatel na místa, kde začínají věty - v tomto případě mám pole ukazatelů. Pak generuji nahodile indexy a pomocí takto vybraných ukazatelů přečtu věty a uložím do výst souboru.
Třetí možnost je projet soubor, zapamatovat si, kde v něm začínají jednotlivé věty a jejich délku a nahodile vybírat věty a kopírovat ze souboru do souboru. Soubor musí být otevřen jako binární. Asi menší nároky na paměť, ale asi to bude pomalé.
hu
#13 hlucheucho
Mám zatím tohle: Nevím si rady s tim retezcem atd. :( Muzes to zkouknout a poradit prosim ? Mám to trochu jinak ten program, ze se me zepta co tam chcu napsat a potom to ulozi do souboru data.txt a potom z tohoto souboru to znak po znaku kontrolu zda tam neni .,? nebo !. jak to ale ukladat do pole nevim a jak prehazovat ty vety take ne.
// dalsi pokus.cpp : Defines the entry point for the console application.
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char text[100], znak;
FILE *fvstup, *fvystup;
printf("Zadejte text do delky 100 pismen: ");
gets(text);
fvstup = fopen("data.txt", "w");
fputs(text, fvstup);
fclose(fvstup);
printf("\nNyni se podivejte do slozky se souborem data.txt\n");
fvstup = fopen("data.txt", "r");
fvystup = fopen("vystup.txt", "w");
while(znak = fgetc(fvstup) != EOF)
{
if((znak = '.') && (znak = '?') && (znak = '!'))
{
znak -= 32;
putchar(znak);
fputc(znak, fvystup);
}
else
{
putchar(znak);
fputc(znak, fvystup);
}
}
fclose(fvstup);
fclose(fvystup);
printf("\n");
return 0;
}
Testovací textový soubor si můžeš napsat třeba v Notepadu. Takhle by vypadala funkce, která přečte větu ze souboru (nástřel, není to odladěné):
int CtiVetu(FILE *odkud, char *kam)
{
char znak;
int stav = 0;
int i = 0;
do { //cte po znacich dokud neni konec vety nebo souboru
znak = fgetc(odkud);
switch (znak) {
case EOF: //konec souboru
stav = -1;
break;
case '.': //veta ukoncena teckou
case '?': //veta ukoncena otaznikem
case '!': //veta ukoncena vykricnikem
stav = 1;
kam[i] = znak;
i++;
break
case ' ': //mezera se pred vetou ignoruje, ve vete musi zustat
if (stav == 0) {
kam[i] = znak;
i++;
}
break;
default: //jakykoliv jiny znak
stav = 0;
kam[i] = znak;
i++;
;
}
} while (0 == stav);
kam[i] = 0;
return stav; //vraci -1 pro vetu ukoncenou EOF
}
a její použití:
char veta[128];
FILE *fin; //soubor ze ktereho ctes vety
fin = fopen("soubor.txt", "rb");
if (fin == NULL) {
//nejde otevrit soubor
}
else
{
//soubor otevren
CtiVetu(fin, veta);
fclose(fin);
}
asi by to šlo snadno upravit na čtení souboru do bufferu a pamatování si ukazatelů na začátky vět.
hu
Promin, asi jsem nejakej natvrdlej nebo neco, snazil jsem se to dat dohromady, ale hlava mi to nejak nebere. Myslis kompletni program by mel vypadat takhle ? Asi je mozny ze tam neco posprehazeny nebo tak neco, nebo nevim kam to vlozit, asi tam ma byt jeste int main () nebo ne a misto toho je tam int int CtiVetu(FILE *odkud, char *kam) ? to je asi blbost že ? A jestli to teda spravne chapu tak soubor.txt je soubor pro cteni tech vet, takze ho hodim do slozky s programem a hodim tam napr.: 5 vet a z tohoto to bude cist ? No a pak potrebuju jeste nekam to ukladat a prehazet nejak ze ? Uz jsem z toho nejaky zmateny, promin :(
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
int CtiVetu(FILE *odkud, char *kam)
{
char veta[128];
FILE *fin; //soubor ze ktereho ctes vety
fin = fopen("soubor.txt", "rb");
if (fin == NULL) {
//nejde otevrit soubor
}
else
{
//soubor otevren
CtiVetu(fin, veta);
fclose(fin);
}
char znak;
int stav = 0;
int i = 0;
do { //cte po znacich dokud neni konec vety nebo souboru
znak = fgetc(odkud);
switch (znak) {
case EOF: //konec souboru
stav = -1;
break;
case '.': //veta ukoncena teckou
case '?': //veta ukoncena otaznikem
case '!': //veta ukoncena vykricnikem
stav = 1;
kam[i] = znak;
i++;
break;
case ' ': //mezera se pred vetou ignoruje, ve vete musi zustat
if (stav == 0) {
kam[i] = znak;
i++;
}
break;
default: //jakykoliv jiny znak
stav = 0;
kam[i] = znak;
i++;
;
}
} while (0 == stav);
kam[i] = 0;
return stav; //vraci -1 pro vetu ukoncenou EOF
}
znovu a znovu:
1. podrobně popiš, co chceš udělat
2. rozděl to na dílčí úkoly
3. implementuj dílčí úlohy
4. použij implementaci dílčích úloh jako stavební kameny celého řešení
Kód, který jsem ti sem dal, je ukázkou, jak číst větu ze souboru a uložit do řetězce. Má to omezení - nehlídají se meze pole, tím je omezena délka čtené věty, což s "dobře" připraveným souborem bude fungovat. Místo "soubor.txt" je vhodnější použít full path souboru. Číst věty do řetězců je v podstatě (když pro uložení použiju pole řetězců, což lze pro začátek implementovat jako 2-rozměrné pole):
1. Přečti větu do prvního řetězce
2. Přečti další větu do dalšího řetězce
atd až do přečtení celého souboru.
Obsah testovacího souboru by mohl vypadat třeba takto:
První věta. Co bude druhá věta? Napiš třetí větu! Čtvrtá věta je poslední.
Pozn.: záměrně nepředkládám použití dynamicky alokovaných polí pro ukládání vět.
hu
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Výpis vět s počtem slov větším než je průměr slov ve větě — založil alex
Načtení slov do pole ze souboru — založil Kenvelo
Určení klíčových slov v textu — založil LFS
Vypočítání počtu slov a délky textu. — založil školák
Vypsání počtu určitých slov v textu — založil Nikishek
Moderátoři diskuze