Ok děkuji za rady, ale na příspěvek č.7 bych sám asi nikdy nepřišel.
Příspěvky odeslané z IP adresy 147.251.213.–
Tak učitel odvolal psání toho největšího znaku, takže už to nemusím dělat, nicméně stejnak jsem nebyl schopen to udělat. Kdyby byl někdo hodný a ukázal mi ten kód měl vypadat; byl by moc hodný.
Dneska jsem odeslal ten úkol učiteli, tak uvidím.
#13 Michal
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int kontrolaPismen;
char pismenoAbecedy;
printf("3.domaci ukol\nKolik chcete pismen z abecedy? (4-7): ");
while((kontrolaPismen < 4) || (kontrolaPismen > 7)){
scanf("%d", &kontrolaPismen);
}
char znaky[kontrolaPismen];
printf("Ted zadejte %d znaku: ", kontrolaPismen);
for(int i = 0; i < kontrolaPismen; i++){
do{
scanf("%c", &pismenoAbecedy);
while((pismenoAbecedy < 'a') || (pismenoAbecedy > 'z')){
scanf("%c", &pismenoAbecedy);
}
}while(NULL != strchr(znaky,pismenoAbecedy));
znaky[i] = pismenoAbecedy;
}
FILE *eng;
eng = fopen("eng.txt", "r");
if(eng == NULL){
printf("Error: Zadany soubor neexistuje.");
return 1;
}
char slovaVSouboru[25], pozpatku[25], opakujiciPismeno;
int shodaPismene = 0;
printf("\nSlovo -> Pocet pismen -> Odzadu -> Nejvic se opakujici pismeno\n\n");
do{
fscanf(eng, "%s", slovaVSouboru);
for(int i = 0; i < kontrolaPismen; i++){
if(strchr(slovaVSouboru,znaky[i]) != NULL)
shodaPismene++;
}
if(shodaPismene == kontrolaPismen){
int pocetPismen = strlen(slovaVSouboru);
for(int i = 0; i < pocetPismen; i++){
pozpatku[i] = slovaVSouboru[pocetPismen-i-1];
}
pozpatku[pocetPismen] = '\0';
printf("%20s -> %2d -> %20s -> %c\n", slovaVSouboru, pocetPismen, pozpatku, opakujiciPismeno);
}
shodaPismene = 0;
}while(feof(eng) == NULL);
fclose(eng);
puts("");
return 0;
}
Ten feof budu muset změnit na eof, bo tam mám warning.
Tak jsem zjistil, že fgets bere i bílý znak do paměti, nebo-li u mě enter, ale místo toho fscanf pracuje stejně, ale bílý znak neuchovává. Takže už mi to vypisuje krásně na řádek.
Teď se poprat s posledním a to spočítat a vyhodnotit nejvíc opakující se písmeno. Kdyby to bylo číslo, tak je
to mnohem jednodušší.
Nějaký nápad, jak na to?
Nene já vím proč anglická abeceda, to už jsem jen ukazoval na fakt, že to správně pracuje.
Díky za vysvětlení těch dvou řádků, ale víc mě trápí ten příspěvek č. 7.
FILE *eng;
eng = fopen("eng.txt", "r");
if(eng == NULL){
printf("Error: Zadany soubor neexistuje.");
return 1;
}
char slovaVSouboru[25], pozpatku[25], opakujiciPismeno;
int shodaPismene = 0;
puts("");
do{
fgets(slovaVSouboru,25,eng);
for(int i = 0; i < kontrolaPismen; i++){
if(strchr(slovaVSouboru,znaky[i]) != NULL)
shodaPismene++;
}
if(shodaPismene == kontrolaPismen){
int pocetPismen = strlen(slovaVSouboru);
for(int i = 0; i < pocetPismen; i++){
pozpatku[i] = slovaVSouboru[pocetPismen-i-1];
}
pozpatku[pocetPismen] = '\0';
printf("Slovo: %s, ma %d pismen, odzadu %s, nejvic opakujici pismeno %c\n", slovaVSouboru, pocetPismen,
pozpatku, opakujiciPismeno);
}
shodaPismene = 0;
}while(feof(eng) == NULL); //TADY MAM WARNING (comparison between pointer and integer [enabled by default])
fclose(eng);
Přitom to má být vše na jednom řádku: slovo, počet, odzadu a opak. písmeno
strlen mi taky počítá o znak navíc až u toho poslední, tam počítá správně
A stím počítáním nejvíc opakujícího písmene zatím taky nějak nevím.
Jinak pokud by šel ten kód nějak z jednodušit, jestli to nemám nějak moc krkolomně složité.
Tak to ověření mám, jen by mě zajímalo načpak tam jsou dva řádky:
znaky[0] = 0x00; a znaky[i+1] = 0; == když jsem je zkoušel zakomentovat, fungovalo mi to stejně.
Bralo mi to jen první znak, který nebyl daný + ignorovalo všechny znaky krom anglické abecedy.
int kontrolaPismen;
char pismenoAbecedy;
printf("3.domaci ukol\nKolik chcete pismen z abecedy? (4-7): ");
while((kontrolaPismen < 4) || (kontrolaPismen > 7)){
scanf("%d", &kontrolaPismen);
}
char znaky[kontrolaPismen];
//znaky[0] = 0x00;
printf("Ted zadejte %d znaku: ", kontrolaPismen);
for(int i = 0; i < kontrolaPismen; i++){
do{
scanf("%c", &pismenoAbecedy);
while((pismenoAbecedy < 'a') || (pismenoAbecedy > 'z')){
scanf("%c", &pismenoAbecedy);
}
}while(NULL != strchr(znaky,pismenoAbecedy));
znaky[i] = pismenoAbecedy;
// znaky[i+1] = 0;
}
for(int i = 0; i < kontrolaPismen; i++){
for(int j = 0; j < i; j++){
if(pismeno[i] != pismeno[j]){
scanf("%c", &pismeno[i]);
while((pismeno[i] < 'a') || (pismeno[i] > 'z')){
scanf("%c", &pismeno[i]);
}
}
}
}
Zkoušel jsem něco takového, ale to pak mi nebere první znak, protože tam je ta podmínka a když dám for j = 1, tak to hází náhodný znak, protože ho ještě nevím.
Těch cyklů je tam tolik, že se v tom pomalu ztrácím. A ukládám to jako znaky a ne řetězec.
V texťáku to je oddělené jen entrem bez teček nebo čárek. Takže ty slova jsou pod sebou.
Mohl bys uvést malý příklad jakto myslíš?
Zdravím, mám úkol do prog. v jazyce C a tentokrát jsem totálně beznadějný.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int kontrolaPismen;
printf("3.domaci ukol\nKolik chcete pismen z abecedy? (4-7): ");
while((kontrolaPismen < 4) || (kontrolaPismen > 7)){
scanf("%d", &kontrolaPismen);
}
char pismeno[kontrolaPismen];
for(int i = 0; i < kontrolaPismen; i++){
scanf("%c", &pismeno[i]);
while((pismeno[i] < 'a') || (pismeno[i] > 'z')){
scanf("%c", &pismeno[i]);
}
}
FILE *eng;
eng = fopen("eng.txt", "r");
if(eng == NULL){
printf("Error: Zadany soubor neexistuje.");
return 1;
}
char slovaVSouboru[50];
while(fscanf(eng,"%49s", slovaVSouboru) != EOF){
printf("%s ", slovaVSouboru);
}
fclose(eng);
puts("");
return 0;
}
Uživatel zadá 4 - 7 pismen abecedy, to mám. Ale za prvé nevím jak to kontrolovat, aby se neopakovali.
Zkoušel jsem to přes 2cykly for, ale bohužel jsem se s tím nepopral. To není ten hlavní problém.
Hlavní je, že mám otevřít soubor(mám) a v tom jsou slova a jsou jich tam stovky slov.
Problém začíná, kdy po mně chtějí, abych bral slovo po slově a kontroloval, jestli obsahuje všechny písmena, které jsme zadali na začátku. Pak s těma slovy, mám dělat další hokusy pokusy, ale to bych snad zvládl už sám.
Abych to zhrnul. Nevím jak vzít to slovo a rozsekat ho na písmena a kontrolovat ty písmena, či obsahuje.
Někdo radil přes dynamické pole. Koukal jsem na net, ale nic moc.
Pokud vám to není jasné, tak tu je zadání:
Užívateľ zadá na štandardný vstup 4 až 7 rôznych písmen abecedy. Program testuje ich počet aj rôznosť.
Následne program určí všetky slová zo súboru, ktoré obsahujú všetky zadané písmena. Pre každé takéto slovo vypíše:
slovo
počet písmen slova
slovo odzadu
písmeno, ktoré je v slove obsiahnuté najviackrát (ak je takýchto písmen viac, vypíše ľubovoľné z nich)
---------------> nechci, abyste to za mě dělali, ale chci nakopnout, jak na to. Děkuji za váš čas.