Diskuze: Banálne problémy
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 48 zpráv z 48.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
"%X" ti vypíše jen hexadecimální číslo, nevypisuje žádnou koncovku jako 'h', už jen kvůli tomu, že někdo by to chtěl vypsat třeba jako "0x7F". Prostě si tu koncovku napiš do toho printfu.
Nový problém. Keď delím 6 a 3 a potom aj 3 a 6 tak to vyjde na cislo 1. Ak je prve cislo mensie tak sa to ma prehodit. Najdete chybu?
#include <stdio.h>
#include <stdlib.h>
void vymen(float *a, float *b);
void sucet(float *a, float *b);
void rozdiel(float *a, float *b);
void sucin(float *a, float *b);
void podiel(float *a, float *b);
int main() {
float *a,*b;
a=(float*)malloc(sizeof(float));
b=(float*)malloc(sizeof(float));
int operacia,c;
if (a==NULL || b==NULL){
printf("Program prestal pracovat");
}
else {
do{
printf("\nZadaj 1.cislo:");
scanf("%f", a);
printf("Zadaj 2.cislo:");
scanf("%f", b);
printf("Napis cislo operacie ktoru chces vykonat\n1.Sucet\n2.Rozdiel\n3.Sucin\n4.Podiel\n:");
scanf("%d", &operacia);
switch (operacia) {
case 1:
sucet(a, b);
break;
case 2:
rozdiel(a, b);
break;
case 3:
sucin(a, b);
break;
case 4:
podiel(a, b);
break;
default:
printf("Zadal si neplatnu operaciu");
break;
}
}while(c = getchar() != ' ');
}
free(a);
free(b);
return 0;
}
void vymen(float *a, float *b){
float pom;
*a = pom;
*a = *b;
pom = *b;
}
void sucet(float *a, float *b){
printf("%f",*a+ *b);
}
void rozdiel(float *a, float *b){
printf("%f",*a- *b);
}
void sucin(float *a, float *b){
printf("%f",*a* *b);
}
void podiel(float *a, float *b){
if(a<b){
vymen(a,b);
printf("%f",*a/ *b);
}
else
printf("%f",*a/ *b);
}
Premenená pom sa stratí.
To áno ale aj keď som ju dal do globálu nad main ani to nepomohlo. Problém je v tom ze aj keď zadám 6 a potom 3 kedy by funkcia vymen nemala prebehnut sa mi vrati vysledok 1
Aha... to som si ani nevšimol. Ďakujem za radu cením si ju. Aj keď síce tému nezavriem nakoľko sa často vyskytne takýto banálny problém.
Ve funkci podíl porovnáváš adresy místo hodnot. Zkus tam dát if (*a <*b) {...}
Tiež pridám jeden problémik.
Pokladňa má za úlohu vypočítať z výdavkovej sumy koľko akých bankoviek
a kovových drobných má predavačka vydať.
#include <stdio.h>
void vydavok(float suma)
{
int i, vydajEura[8], vydajCenty[6], peniazEura[] = { 500, 100, 50, 20, 10, 5, 2, 1 };
float peniazCenty[] = { 0.5, 0.2, 0.1, 0.05, 0.02, 0.01 }, skuska = 0.0, vstupna_cena = suma;
char *hodnotaEura[] = { "patsto", "sto", "patdesiat", "dvadsat", "desat", "pat", "dve", "jedno" };
char *hodnotaCenty[] = { "patdesiat", "dvadsat", "desat", "pat", "dva", "jeden" };
for (i = 0; i < 8; i++) {
vydajEura[i] = suma / peniazEura[i];
suma -= vydajEura[i] * peniazEura[i];
}
for (i = 0; i < 6; i++){
vydajCenty[i] = suma / peniazCenty[i];
suma -= vydajCenty[i] * peniazCenty[i];
}
for (i = 0; i < 8; i++) {
if (vydajEura[i] != 0)
printf("%s euro - %d ks = %.2f eur\n", hodnotaEura[i], vydajEura[i], (float)(peniazEura[i] * vydajEura[i]));
skuska += (float)(peniazEura[i] * vydajEura[i]);
}
for (i = 0; i < 6; i++) {
if (vydajCenty[i] != 0)
printf("%s cent - %d ks = %.2f eur\n", hodnotaCenty[i], vydajCenty[i], (float)(peniazCenty[i] * vydajCenty[i]));
skuska += (float)(peniazCenty[i] * vydajCenty[i]);
}
printf("\nSkuska spravnosti:\nVstupna cena je %.2f\nSucet vydanych bankoviek a minci je %.2f\nrozdiel je %.2f\n",
vstupna_cena, skuska, vstupna_cena - skuska);
}
int main(void)
{
float suma;
printf("Zadajte sumu vydavku: ");
scanf("%f", &suma);
putchar('\n');
vydavok(suma);
return 0;
}
Pri väčšine výdavkov to vypočíta správne, ale v niektorých prípadoch
nie.
Zadajte napríklad výdavok 1.08
Ten príklad som neuviedol dobrý. Rozpis peňazí vyjde správne. Skúste 1.03 a výjde to o jeden cent menej.
Poznámka.
Tú skúšku som tam pridal pre informáciu programátorovi, aby vedel nájsť
riešenie.
Nie je to zložité, stačí napísať podmienku a rozpis bankviek a kovových
bude správny.
Dobrý den, před několika dny jsem se tu začal učit C++. Po přečtení několika tutoriálů jsem si řekl že své znalosti otestuji a napsal jsem jednoduchou konzolovou aplikaci viz. zde:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main(void)
{
int a;
int b;
int c;
char n = '\n';
char devider[] = "--------------------------------------------------------------------------------";
cout << n;
cout << devider << endl;
cout << n;
cout << "Hello and thanks for using my math test." << endl;
cout << n;
cout << devider << endl;
cout << n;
cout << "First one" << endl;
cout << n;
cout << devider << endl;
cout << n;
cout << "8 x 12" << endl; // = 96
cout << n;
cout << devider << endl;
cout << n;
cin >> a;
cout << n;
if (a != 96) // when a isn´t 96
{
cout << "Wrong" << endl;
}
else // and when it is
{
cout << "That one was easy." << endl;
}
cout << n;
cout << devider << endl;
cout << n;
cout << "12 : 0,5" << endl; // = 24
cout << n;
cout << devider << endl;
cout << n;
cin >> b;
cout << n;
if (b != 24) // if b isn´t 24
{
cout << "Wrong." << endl;
}
else // and when it is
{
cout << "Right, let's move to the next one!" << endl;
}
cout << n;
cout << devider << endl;
cout << n;
cout << "( 2358 : 2 ) x 7 = 4x - 1" << endl; // x = 256
cout << n;
cout << devider << endl;
cout << n;
cin >> c;
if (c != 256) // if c isn´t 256
{
cout << "Wrong." << endl;
}
else // and when it is correct
{
cout << "Very well!" << endl;
}
cout << n;
cout << devider << endl;
cout << n;
cout << "Corect answers: 1. = 96 2. = 24 3. = 256" << endl;
cout << n;
cout << devider << endl;
cout << n;
cout << "Thanks for using my test. Created by Jan Doskocil 2016." << endl;
cout << n;
cout << devider << endl;
cout << n;
cout << "Press any key." << endl;
_getch();
}
Z hlediska kódu je naprosto v pořádku problém ale nastává při spuštění kdy proměnná 'n' před každým příkazem 'cout' odřádkuje dvakrát a ne jednou, za příkazem už je znovu v pořádku. Nevíte někdo čím to je? Jsem naprosto bezradný a i můj o mnoho zkušenější kamarád nenašel chybu. Tak mi prosím napište nějáké řešení jinak to rovnou hodím do Akt X.
Daj preč endl. To odriadkováva samo. Alebo tam nedavaj znak novej riadky. Endl sa pri takýchto jednoduchých appkách tuším, že ani nepoužíva.
Jsi si opravdu jistý že je to tím? Vždyť endline jenom zalomí řádek a když na to koukám tak s tím by neměl být problém... ale stejně zkusím snad to vyjde.
Aaah díky . Už funguje a nejspíš jsem i přišel na to proč předtím nefungoval. Nejsem moc zkušený a tak se radši ptám, ta moje proměnná 'n' řádek zalomí nebo ho přeskočí? Protože kdyby byl řádek zalomeý endlinem a na další řádek by se vypsala moje 'n' dávalo by perfektní smysl proč vynechala dva řádky. Je to tak nebo to má jiné vysvětlení?
n odriadkuje. Cize ak ho das na konci vety tak skoci na novy riadok, ak das endl tak odriadkuje a potom sa pusti iba \n a to spravi tu medzeru.
Zdar. Problém je jednoduchý. Program sa skončí ešte pred začatím cyklu... neviem si dať rady. K C som sa teraz vrátil po práci s assemblerom tak som celkom dezorientovaný.
#include <stdlib.h>
#include <stdio.h>
int main() {
FILE *textfile_w;
int pocet_cisel,i,cislo;
if ((textfile_w=fopen("textfile_get.rtf","w"))==NULL){
printf("Subor sa nepodarilo otvorit v rezime 'write");
}
else{
printf("Kolko cisel si zelas ulozit: ");
scanf("%d",&pocet_cisel);
printf("Mozes zacat zapisovat cisla. Cisla oddel klavesou ENTER.\n");
for (i=0;i<pocet_cisel;i++) {
putc(cislo,textfile_w);
}
}
fclose(textfile_w);
return 0;
}
Ten súbor sa ti neotvorí. Dôvod musíš nájsť sám.
Toto je čo?
printf("Mozes zacat zapisovat cisla. Cisla oddel klavesou ENTER.\n");
Príkaz putc() vypisuje.
Oprava.
Súbor otvoríš na zápis a v cykle sa z neho pokušaš čítať. Ak je
prázdny, neprečítaš nič.
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
FILE *textfile_w;
int pocet_cisel, i, cislo;
if ((textfile_w = fopen("textfile_get.rtf", "w")) == NULL) {
printf("Subor sa nepodarilo otvorit v rezime 'write");
return 1;
}
printf("Kolko cisel si zelas ulozit: ");
scanf("%d", &pocet_cisel);
printf("Mozes zacat zapisovat cisla. Cisla oddel klavesou ENTER.\n");
for (i = 0; i < pocet_cisel; i++) {
scanf("%d", &cislo);
fprintf(textfile_w, "%d ", cislo);
}
fclose(textfile_w);
return 0;
}
Ale podla mojho názoru je stále putc() zápis znaku do súboru.
Ouuu... moja chyba. Už som si to uvedomil.
Zdravím, to som znova ja. Teraz sa snažím napísať kód ktorý keď zadám text o maximálnom počte písmen 40 zistí výskyt jednotlivých malých písmen a ich počet. Vôbec neviem ako to spraviť a teraz som bol schopný napísať len toto:
#include <stdlib.h>
#include <stdio.h>
int main() {
char text[40];
int i;
printf("Zadaj text:\n");
gets(text);
for (i=0;i<40;i++){
if(text[i]>='a' && text[i]<='z'){
}
}
return 0;
}
Nie, ak je to take lahke tak ako? ja viem iba cez switch a to by bolo cele
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char text[40];
int i, pocet = 0;
printf("Zadaj text:\n");
scanf(" %40[^\n]s", text); // načíta vetu (max. 40 znakov vrátane bielych znakov) zadanú z klávesnice ukončenú znakom enter
for (i = 0; i < strlen(text); i++){
if(text[i]>='a' && text[i]<='z'){
pocet++;
}
}
printf("V texte je %d malych pismen.\n", pocet);
return 0;
}
to je v pohode, to viem ale ja potrebujem napísať koľko krát sa tam nachádza a, potom b... a na akych poziciach
Vo vonkajšom cykle budeš prechádzať abecedu, vo vnútornom budeš jednotlivé písmená porovnávať s textom.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char text[40];
int i, j, pocet = 0;
printf("Zadaj text:\n");
scanf(" %40[^\n]s", text); // načíta vetu (max. 40 znakov vrátane bielych znakov) zadanú z klávesnice ukončenú znakom enter
for (j = 'a'; j <= 'z'; j++) {
pocet = 0;
for (i = 0; i < strlen(text); i++){
if(text[i] == j)
pocet++;
}
if (pocet > 0)
printf("V texte je %d pismen %c.\n", pocet, j);
}
return 0;
}
Osobne sa mi nepaci ten vnoreny cyklus, takze by som to skusil takto:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char text[40];
int stat[static_cast<int>('z') - static_cast<int>('a')];
int pocet = 0;
printf("Zadaj text:\n");
scanf(" %40[^\n]s", text); // načíta vetu (max. 40 znakov vrátane bielych znakov) zadanú z klávesnice ukončenú znakom enter
for (int i = 0; i < strlen(text); i++) {
if(text[i] >= 'a' && text[i] <= 'z')
stat[ (static_cast<int>(text[i]) - static_cast<int>('a')) ] ++;
}
printf("V texte sa vyskytuju nasledujuce znaky v poctoch:\n");
for(int i = 0; i < (static_cast<int>('z') - static_cast<int>('a')); i++){
printf("%c znak s vyskytom %d -krat.\n", (i+static_cast<int>('a')), stat[i]);
pocet += stat[i];
}
printf("Celkovy vyskyt malych pismenok v texte je %d.\n", pocet);
return 0;
}
Neviem v ako IDE si to napísal, ale mne to v code::blocks vypisuje toto: obrázok.
Upravil som tvoj kód ako si napísal a tu je výsledok:
static_cast je jen v C++.. Každopádně je to nepravost a až na výjimky bys to neměl používat...
ach ano... zabudol som na inicializovanie pola intov stat[]..
int stat[int('z') - int('a')] = {0};
Jeho řešení je dobré - použití hashovací tabulky je efektivnější než vnořené cykly
Při přepisování jsi tam udělal chybu: (static_cast<int>(text[i])) ti uteklo a máš tam místo toho z, takže většina pole zůstává neiniciovaná..
A jinak poznámka - nejsem si jistý, jestli by překladač nebrblal, ale mělo by být možné indexovat znakovým literálem (uvnitř jen číslo) bez těch castů.. tj. stat[text[i] - 'a'].. A osobně bych na ten převod udělal nějakou inline funkci pro přehlednost
Tak som to inicializoval.
int stat[(int)'z' - (int)'a'] = {0};
Výsledok:
Máš pravdu, špatne som to upravil. Teraz to už funguje.
Martanec, ospravedlňujem sa.
suhlasim s tebou.
Priznam sa, kod som zbuchal v priebehu dvoch minut a netestoval som to. Chcel som len poukazat na moznost efektivnejsieho napisania algoritmu a ze to ide aj bez toho vnoreneho cyklu. Som netusil, ze si tu takto 'zatopim'
Zobrazeno 48 zpráv z 48.