[Warning] no newline at end of file

Programovacie jazyky, rady, poradňa...
Jygsaw
Amateur
Amateur
Príspevky: 24
Registrovaný: 06 mar 2009, 14:40

[Warning] no newline at end of file

Príspevok od používateľa Jygsaw »

Prajem pekný deň,
mám ďalší problém...

Mám daný príklad:
Napíšte program, ktoré vypisuje prirodzené čísla od 1. Po každých desiatich číslach vypíše: Mám pokračovať? [A/N]:
a podľa odpovede buď pokračuje alebo skončí.

Tu je môj kôd:

Kód: Vybrať všetko

#include <stdio.h>
int main() {
           int h=1,i;
           int c;
           
           for (i=1; i<=10; i++, h++) {
               printf("%d %i\n", h, i);
               if (i == 10) {
                  printf("Mam pokracovat? [A/N]");
                  if ((c=getchar()) == 'a') {
                     i=0;
                     }
                  else
                     break;
                  }
               }
           }
           
Ale vôbec mi to nefunguje. Probram sa spusti ale vypiše mi to chybu:
[Warning] no newline at end of file

a potom keď sa ma to spyta A/N a dam "a" tak sa vypne program. Neviete ako to mam spravit?

PS: V C začinam.
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

To [Warning] no newline at end of file ti píše kompilátor. Upozorňuje ťa na to, že na konci toho zdrojového kódu nemáš prechod na nový riadok.

Mne ten program funguje (teda robí presne to, čo si tam dal a teda pri zadaní písmena a sa vypíše ďalších 10 číslic a potom sa ukončí).

PS: Tá funkcia main má návratpvú hodnotu typu int a ty tam nemáš žiadne return s nejakým číslom (v tvojom prípade return 0;).
Jygsaw
Amateur
Amateur
Príspevky: 24
Registrovaný: 06 mar 2009, 14:40

Príspevok od používateľa Jygsaw »

chrono napísal:To [Warning] no newline at end of file ti píše kompilátor. Upozorňuje ťa na to, že na konci toho zdrojového kódu nemáš prechod na nový riadok.

Mne ten program funguje (teda robí presne to, čo si tam dal a teda pri zadaní písmena a sa vypíše ďalších 10 číslic a potom sa ukončí).

PS: Tá funkcia main má návratpvú hodnotu typu int a ty tam nemáš žiadne return s nejakým číslom (v tvojom prípade return 0;).
Dík chrono za radu ale aj tak tej chybe nejak nechapem :) aky prechod na novy riadok?? A k tomu return... používam kompilator Dev-Cpp a keď tam napíšem return 0 tak sa mi program hneď vypne,ale aj tak sa mi to zdá divné veď ten program by nemal fungovať dovtedy kym tam nenapišem nejake ine pismeno?? Ak by som pisal vždy 'a' tak by šiel stale a nie len raz.
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Príspevok od používateľa neutronmind »

Znamena to, ze aby si mohol ten zdrojak skompilovat, musis sa nastavit za posledny zatvorku a stlacit enter(teda na konci zdrojaku musi byt prazdny riadok). Ak sa ti program zavrie po return 0, daj pred to getchar();.
Predpokladam, ze takto si to chcel, pouzil som tam pomocnu premennu, ktora nadobudne hodnotu 0 len v pripade stlacenia klavesy 'n'/'N', cim sa podmienka v cykle vyhodnoti ako false a cyklus skonci.

Kód: Vybrať všetko

#include <stdio.h>
#include <ctype.h>

int main(void)
{
    int c, i, h = 1;
    int pokracovat = 1;

    while (pokracovat) {
        for (i = 1; i <= 10; i++, h++) {
            printf("%d %i\n", h, i);
            if (i == 10) {
                printf("Mam pokracovat? [A/N] ");
                c = toupper(getchar());
                while (getchar() != '\n')
                        ;
                if (c == 'N') {
                    pokracovat = 0;
                    break;
                }
            }
        }
    }

    return 0;
}
Jygsaw
Amateur
Amateur
Príspevky: 24
Registrovaný: 06 mar 2009, 14:40

Príspevok od používateľa Jygsaw »

neutronmind ten tvoj program mi funguje tak ako chcem lenže ty si tam použil ctype.h a ja pracujem zatial len so stdio.h

Nedalo by sa to nejak spraviť pomocou stdin alebo stdout alebo ungetc ??? Neviem veľmi načo tie prikazy služia. V mojej knihe je to tak vysvetlene že tomu nemôžem pochopiť :) .
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Mohlo by to vyzerať nejako takto:

Kód: Vybrať všetko

#include <stdio.h>
int main()
{
	int h = 1, i;
	int c;

	while (1) {
		for (i = 1; i <= 10; i++, h++) {
			printf("%d %i\n", h, i);
		}

		printf("Mam pokracovat? [A/N]\n");
		c = getchar();
		if ((c) != 'a')
			break;
	}

	return 0;
}
Problém je ale to, že tá funkcia getchar nerobí presne to, čo si myslíš. Ona funguje tak, že čaká na nejaký vstup ukončený klávesou Enter. Ak teda zadáš znak "a" stlačíš enter, ona načíta dva znaky a ten druhý znak ukončí ten cyklus (keďže to nie je znak "a"). Ak napr. zadáš "aaaaa" tak sa ten cyklus zopakuje 5 krát a potom sa ukončí (kvôli tomu znaku \x0A za tými písmenami "a").
Práve kvôli tomu tam má neutronmind to

Kód: Vybrať všetko

while (getchar() != '\n') ;
(môžeš to pridať do tej mojej verzie a potom to bude fungovať viac-menej tak, ako chceš)
Jygsaw
Amateur
Amateur
Príspevky: 24
Registrovaný: 06 mar 2009, 14:40

Príspevok od používateľa Jygsaw »

Aha.

Maš pravdu, teraz to funguje tak ako som chcel. Ale ešte by ma zaujimalo či by sa to nedalo spraviť s tymi stdout, stdin...
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Stdout sa používa pri printf (tá funkcia vypisuje texty práve do stdout). Stdin sa zase používa pri getchar (tie znaky sa načítavajú zo stdin).
Jygsaw
Amateur
Amateur
Príspevky: 24
Registrovaný: 06 mar 2009, 14:40

Príspevok od používateľa Jygsaw »

Snáď tomu niekedy pochopim. Vďaka za vysvetlenie.
Napísať odpoveď