Hirdetés

2014. október 22., szerda

Hozzászólások

(#1001) emvy válasza kicsitomi88 (#48) üzenetére


emvy
(Szakértő)

Regen en is igy gondoltam, de nem feltetlen szukseges a matektudas a programozashoz, ez a helyzet. Rengeteg programozasi feladat van, ahol az uzleti tudas joval fontosabb. (uzleti = domen specifikus)

Szerk.: bazz, beneztem a datumot :)

[ Szerkesztve ]

while (!sleep) sheep++; http://www.xkcd.com/1386/

(#1002) Fire/SOUL/CD válasza blaces (#998) üzenetére


Fire/SOUL/CD
(Szakértő)
LOGOUT blog

Hali!

Na megnéztem a "gyakorlatban". Valóban a CodeBlocks befordítja minden hiba nélkül, még csak warning sincs. Persze ez csak azt jelenti, hogy formailag helyes a kód, de tartalmilag nem.
Szerencsére kék halált nem dobott, de a hibajelentés küldése MS-nek, az befigyelt. Amellett, hogy javítod Jester01 kolléga válaszában található feltárt hibákat, azonkívűl gondoskodsz arról is, hogy ha egy program paraméterezve fut, akkor MINDEN ESETBEN ELLENŐRIZNI KELL A PARAMÉTEREK MEGLÉTÉT!

Különben jön a kékhalaál, meg hibajelentés, meg szegmenshatár túllépés, meg még sok sok minden...

Fire.

[ Szerkesztve ]

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#1003) blaces válasza Jester01 (#1000) üzenetére


blaces
(tag)

Ezeket modósítottam:

char betu,sz[50]={};
int j,i=0;
int h=strlen(sz);
while( (betu=fgetc(f)) !=EOF)
{
if(betu==' ' || betu==',' || betu=='!' || betu=='?' || betu=='.' || betu=='\n')
{
if(h>2)
{
fej=beszur(fej,sz);
for(j=0;j<50;j++)
sz[j]='\0';
i=0;
}

HOgy kell a fejváltozót inicializálni? mert a jegyzetben nem találok róla leírást... Ezt hogy kell inicializálni?

a fordított while feltétel azt takarta, hogy ehelyett: while(!seg->kov) ezt használjam: while(seg->kov)

(#1004) Jester01 válasza blaces (#1003) üzenetére


Jester01
(PH! kedvence)

fej1 = NULL; stb.

Jester

(#1005) blaces válasza Jester01 (#1004) üzenetére


blaces
(tag)

Kijavítva, de ugyanúgy van valami baja :(, ugyanúgy érvénytelen memória hivatkozás

(#1006) Jester01 válasza blaces (#1005) üzenetére


Jester01
(PH! kedvence)

És most akkor hogy néz ki a progi és valgrind milyen hibát ír?

Jester

(#1007) blaces válasza Jester01 (#1006) üzenetére


blaces
(tag)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define IGAZ 1
#define HAMIS !IGAZ


typedef struct listaelem{
char szo[50];
struct listaelem *kov;
}LISTAELEM;

int abszolut(int a,int b)
{ int c;
c=(a-b)>=0 ? (a-b):(a-b)*(-1);
return c;
}

int keres(LISTAELEM *fej,char sz[])
{
LISTAELEM *seged;
for(seged=fej;seged;seged=seged->kov)
{
if(strcmp(sz,seged->szo)!=0)
return IGAZ;
}
return HAMIS;

}

LISTAELEM* beszur(LISTAELEM *fej,char szo[])
{
LISTAELEM *ujelem=(LISTAELEM*)malloc(sizeof(LISTAELEM));
strcpy(ujelem->szo,szo);
ujelem->kov=NULL;
if(!fej)
return ujelem;
else
{
LISTAELEM *seg=fej;
while(seg->kov)
seg=seg->kov;
seg->kov=ujelem;
}
return fej;
}

LISTAELEM* feldolgoz(FILE *f,LISTAELEM *fej)
{
char betu,sz[50];
int j,i=0;
int h=strlen(sz);
while( (betu=fgetc(f)) !=EOF)
{
if(betu==' ' || betu==',' || betu=='!' || betu=='?' || betu=='.' || betu=='\n')
{
if(h>2)
{
fej=beszur(fej,sz);
for(j=0;j<50;j++)
sz[j]='\0';
i=0;
}
}
else
{
sz[i]=tolower(betu);
i++;
}
}
return fej;
}

int gyak(LISTAELEM *fej,char sz[])
{
LISTAELEM *seg;
int gyakorisag=0;
for(seg=fej;seg;seg=seg->kov)
{
if(strcmp(seg->szo,sz)==0)
gyakorisag++;
}
return gyakorisag;
}

int main(int argc,char **argv)
{
FILE *f1,*f2;
LISTAELEM *fej1=NULL,*fej2=NULL,*fej3=NULL,*seged=NULL;
int gyak1,gyak2,szavak=0,n;
float hasonlosag=0,eredm;

f1=fopen(argv[1],"r");
f2=fopen(argv[2],"r");
fej1=feldolgoz(f1,fej1);
fej2=feldolgoz(f2,fej2);

for(seged=fej1;seged;seged=seged->kov)
{
if((n=keres(fej3,seged->szo))==0)
{
gyak1=gyak(fej1,seged->szo);
gyak2=gyak(fej2,seged->szo);
hasonlosag+=(abszolut(gyak1,gyak2))/(gyak1+gyak2);
szavak++;
}
}

for(seged=fej2;seged;seged=seged->kov)
{
if((n=keres(fej3,seged->szo))==0)
{
gyak1=gyak(fej1,seged->szo);
gyak2=gyak(fej2,seged->szo);
hasonlosag+=(abszolut(gyak1,gyak2))/(gyak1+gyak2);
szavak++;
}
}

eredm=hasonlosag/szavak;
printf("%.5f\n",eredm);

return 0;
}

valgrind -v eredmények:
==3173== Memcheck, a memory error detector.
==3173== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.
==3173== Using LibVEX rev 1658, a library for dynamic binary translation.
==3173== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.
==3173== Using valgrind-3.2.1-Debian, a dynamic binary instrumentation framework.
==3173== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.
==3173==
--3173-- Command line
--3173-- ./elso
--3173-- Startup, with flags:
--3173-- -v
--3173-- Contents of /proc/version:
--3173-- Linux version 2.6.18-6-xen-amd64 (Debian 2.6.18.dfsg.1-23etch1) (dannf@debian.org) (gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) #1 SMP Fri Dec 12 07:02:03 UTC 2008
--3173-- Arch and hwcaps: AMD64, amd64-sse2
--3173-- Valgrind library directory: /usr/lib/valgrind
--3173-- Reading syms from /home/izgatopasi/Prog1/3/1/elso (0x400000)
--3173-- Reading syms from /lib/ld-2.3.6.so (0x4000000)
--3173-- Reading debug info from /lib/ld-2.3.6.so...
--3173-- ... CRC mismatch (computed 1CBD6C2C wanted 509BB065)
--3173-- object doesn't have a symbol table
--3173-- Reading syms from /usr/lib/valgrind/amd64-linux/memcheck (0x38000000)
--3173-- object doesn't have a dynamic symbol table
--3173-- Reading suppressions file: /usr/lib/valgrind/default.supp
--3173-- Reading syms from /usr/lib/valgrind/amd64-linux/vgpreload_core.so (0x4918000)
--3173-- Reading syms from /usr/lib/valgrind/amd64-linux/vgpreload_memcheck.so (0x4A19000)
--3173-- Reading syms from /lib/libc-2.3.6.so (0x4B1F000)
--3173-- Reading debug info from /lib/libc-2.3.6.so...
--3173-- ... CRC mismatch (computed AD7708C1 wanted 5D81B887)
--3173-- object doesn't have a symbol table
--3173-- REDIR: 0x4B91980 (rindex) redirected to 0x4A1C450 (rindex)
--3173-- REDIR: 0x4B8D0F0 (malloc) redirected to 0x4A1B7D6 (malloc)
==3173== Syscall param open(filename) points to unaddressable byte(s)
==3173== at 0x4BDB152: open (in /lib/libc-2.3.6.so)
==3173== by 0x4B85F52: _IO_file_open (in /lib/libc-2.3.6.so)
==3173== by 0x4B8609B: _IO_file_fopen (in /lib/libc-2.3.6.so)
==3173== by 0x4B7C053: (within /lib/libc-2.3.6.so)
==3173== by 0x4008B9: main (1_feladat.c:94)
==3173== Address 0x0 is not stack'd, malloc'd or (recently) free'd
--3173-- REDIR: 0x4B8B180 (free) redirected to 0x4A1B3E6 (free)
==3173==
==3173== Conditional jump or move depends on uninitialised value(s)
==3173== at 0x400771: feldolgoz (1_feladat.c:53)
==3173== by 0x4008E3: main (1_feladat.c:96)
==3173==
==3173== Invalid read of size 2
==3173== at 0x4B82DE1: getc (in /lib/libc-2.3.6.so)
==3173== by 0x400801: feldolgoz (1_feladat.c:54)
==3173== by 0x4008E3: main (1_feladat.c:96)
==3173== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==3173==
==3173== Process terminating with default action of signal 11 (SIGSEGV)
==3173== Access not within mapped region at address 0x0
==3173== at 0x4B82DE1: getc (in /lib/libc-2.3.6.so)
==3173== by 0x400801: feldolgoz (1_feladat.c:54)
==3173== by 0x4008E3: main (1_feladat.c:96)
--3173-- REDIR: 0x4B92830 (memset) redirected to 0x4A1C960 (memset)
==3173==
==3173== ERROR SUMMARY: 6 errors from 3 contexts (suppressed: 8 from 1)
==3173==
==3173== 1 errors in context 1 of 3:
==3173== Invalid read of size 2
==3173== at 0x4B82DE1: getc (in /lib/libc-2.3.6.so)
==3173== by 0x400801: feldolgoz (1_feladat.c:54)
==3173== by 0x4008E3: main (1_feladat.c:96)
==3173== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==3173==
==3173== 1 errors in context 2 of 3:
==3173== Syscall param open(filename) points to unaddressable byte(s)
==3173== at 0x4BDB152: open (in /lib/libc-2.3.6.so)
==3173== by 0x4B85F52: _IO_file_open (in /lib/libc-2.3.6.so)
==3173== by 0x4B8609B: _IO_file_fopen (in /lib/libc-2.3.6.so)
==3173== by 0x4B7C053: (within /lib/libc-2.3.6.so)
==3173== by 0x4008B9: main (1_feladat.c:94)
==3173== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==3173==
==3173== 4 errors in context 3 of 3:
==3173== Conditional jump or move depends on uninitialised value(s)
==3173== at 0x400771: feldolgoz (1_feladat.c:53)
==3173== by 0x4008E3: main (1_feladat.c:96)
--3173--
--3173-- supp: 8 Debian libc6 (2.3.x) stripped dynamic linker
==3173==
==3173== IN SUMMARY: 6 errors from 3 contexts (suppressed: 8 from 1)
==3173==
==3173== malloc/free: in use at exit: 0 bytes in 0 blocks.
==3173== malloc/free: 2 allocs, 2 frees, 1,136 bytes allocated.
==3173==
==3173== All heap blocks were freed -- no leaks are possible.
--3173-- memcheck: sanity checks: 0 cheap, 1 expensive
--3173-- memcheck: auxmaps: 0 auxmap entries (0k, 0M) in use
--3173-- memcheck: auxmaps: 0 searches, 0 comparisons
--3173-- memcheck: SMs: n_issued = 12 (192k, 0M)
--3173-- memcheck: SMs: n_deissued = 0 (0k, 0M)
--3173-- memcheck: SMs: max_noaccess = 524287 (8388592k, 8191M)
--3173-- memcheck: SMs: max_undefined = 0 (0k, 0M)
--3173-- memcheck: SMs: max_defined = 66 (1056k, 1M)
--3173-- memcheck: SMs: max_non_DSM = 12 (192k, 0M)
--3173-- memcheck: max sec V bit nodes: 0 (0k, 0M)
--3173-- memcheck: set_sec_vbits8 calls: 0 (new: 0, updates: 0)
--3173-- memcheck: max shadow mem size: 4336k, 4M
--3173-- translate: fast SP updates identified: 921 ( 86.7%)
--3173-- translate: generic_known SP updates identified: 90 ( 8.4%)
--3173-- translate: generic_unknown SP updates identified: 51 ( 4.8%)
--3173-- tt/tc: 2,648 tt lookups requiring 2,655 probes
--3173-- tt/tc: 2,648 fast-cache updates, 2 flushes
--3173-- transtab: new 1,324 (31,539 -> 556,589; ratio 176:10) [0 scs]
--3173-- transtab: dumped 0 (0 -> ??)
--3173-- transtab: discarded 0 (0 -> ??)
--3173-- scheduler: 23,425 jumps (bb entries).
--3173-- scheduler: 0/1,389 major/minor sched events.
--3173-- sanity: 1 cheap, 1 expensive checks.
--3173-- exectx: 30,011 lists, 15 contexts (avg 0 per list)
--3173-- exectx: 18 searches, 4 full compares (222 per 1000)
--3173-- exectx: 0 cmp2, 39 cmp4, 0 cmpAll

valgrind eredmény (simán csak valgrind [nev]):
==3298== Memcheck, a memory error detector.
==3298== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.
==3298== Using LibVEX rev 1658, a library for dynamic binary translation.
==3298== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.
==3298== Using valgrind-3.2.1-Debian, a dynamic binary instrumentation framework.
==3298== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.
==3298== For more details, rerun with: -v
==3298==
==3298== Syscall param open(filename) points to unaddressable byte(s)
==3298== at 0x4BDB152: open (in /lib/libc-2.3.6.so)
==3298== by 0x4B85F52: _IO_file_open (in /lib/libc-2.3.6.so)
==3298== by 0x4B8609B: _IO_file_fopen (in /lib/libc-2.3.6.so)
==3298== by 0x4B7C053: (within /lib/libc-2.3.6.so)
==3298== by 0x4008B9: main (1_feladat.c:94)
==3298== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==3298==
==3298== Conditional jump or move depends on uninitialised value(s)
==3298== at 0x400771: feldolgoz (1_feladat.c:53)
==3298== by 0x4008E3: main (1_feladat.c:96)
==3298==
==3298== Invalid read of size 2
==3298== at 0x4B82DE1: getc (in /lib/libc-2.3.6.so)
==3298== by 0x400801: feldolgoz (1_feladat.c:54)
==3298== by 0x4008E3: main (1_feladat.c:96)
==3298== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==3298==
==3298== Process terminating with default action of signal 11 (SIGSEGV)
==3298== Access not within mapped region at address 0x0
==3298== at 0x4B82DE1: getc (in /lib/libc-2.3.6.so)
==3298== by 0x400801: feldolgoz (1_feladat.c:54)
==3298== by 0x4008E3: main (1_feladat.c:96)
==3298==
==3298== ERROR SUMMARY: 6 errors from 3 contexts (suppressed: 8 from 1)
==3298== malloc/free: in use at exit: 0 bytes in 0 blocks.
==3298== malloc/free: 2 allocs, 2 frees, 1,136 bytes allocated.
==3298== For counts of detected errors, rerun with: -v
==3298== All heap blocks were freed -- no leaks are possible.
Szegmens hiba

[ Szerkesztve ]

(#1008) blaces


blaces
(tag)

Közben a harmadikkal is foglalkozom... szinte egésznap, lehet a fáradtságtól nem tudok már oda figyelni rendesen.
Feladat:
[I]Írj programot, amely egy egész számokat tartalmazó szöveges állományból felépít egy bináris fát, és eldönti, hogy a fa inorder és preorder bejárásával ugyanazt a számsorozatot kapja-e! A számokat tartalmazó állomány nevét az első parancssori argumentumként kapja meg a program.

A szöveges állomány soronként pontosan egy tízes számrendszerbeli egész számot tartalmaz. A sorokat az újsor karakter (\n) zárja. Az állományt az állomány vége (EOF) jelig kell olvasni.

A bináris fa felépítésében két szabályt kell figyelembe venni. Ha a beszúrandó szám nagyobb, mint az, amelyik a gyökérben van, akkor a gyökértől jobbra kerüljön, ha kisebb vagy egyenlő, akkor a gyökér bal oldalára. Azaz ez a fa nem bináris keresőfa.

A program járja be a fát inorder és preorder módon. Ha a két bejárás ugyanazt a számsorozatot adja eredményül, akkor a program a második parancssori argumentumként megkapott nevű állományba írja az "igen", különben a "nem" szót. [/I]

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

#define HAMIS 0
#define IGAZ (!HAMIS)

typedef struct faelem {

char *adat;
int szamlalas, input;
struct faelem *bal, *jobb;
} FA;

void beszuras(FA **gyok, char *adat, int fajlnev) {
if(*gyok == NULL) {
*gyok = (FA*)malloc(sizeof(FA));
(*gyok)->adat = (char*)malloc((strlen(adat)+1)*sizeof(char));
strcpy((*gyok)->adat, adat);
(*gyok)->szamlalas = 1;
(*gyok)->input = fajlnev;
(*gyok)->bal = (*gyok)->jobb = NULL;
} else if(strcmp((*gyok)->adat, adat) < 0) {
beszuras(&(*gyok)->jobb, adat , fajlnev);
} else if(strcmp((*gyok)->adat, adat) > 0) {
beszuras(&(*gyok)->bal, adat, fajlnev);
} else if((strcmp((*gyok)->adat, adat) == 0) && ((*gyok)->input != fajlnev)) {
(*gyok)->szamlalas++;
(*gyok)->input = fajlnev;
}

return;
}

void bejaras(FA *gyok, int n) {
if(gyok != NULL) {
bejaras(gyok->bal, n);
if(gyok->szamlalas == n) {
printf("%s\n",gyok->adat);
}
bejaras(gyok->jobb, n);
}
return;
}

void torles(FA *gyok) {
if(gyok != NULL) {
free(gyok->adat);
torles(gyok->bal);
torles(gyok->jobb);
free(gyok);
}
return;
}

int atugras(int ch) {
if(ch != (int)' ' && ch != (int)'\n' && ch != (int)'\r' &&
ch != (int)'\t' && ch != (int)'.' && ch != (int)',' && ch != (int)';' &&
ch != (int)EOF) {
return HAMIS;
}

return IGAZ;
}

char *memoriafoglalas(char *szo, int j) {
return (szo == NULL) ?
(char*)malloc(sizeof(char)) : (char*)realloc(szo,(j+1)*sizeof(char));
}

int main(int argc, char **argv) {
FILE **fp = NULL;
char *szo = NULL;
int ch;
FA *gyok = NULL;
int i, j;

if((fp = (FILE**)malloc((argc-1)*sizeof(FILE*)))==NULL)
exit(1);
for(i=1;i<argc;++i)
if((fp[i-1] = fopen(argv[i],"rt+"))==NULL)
exit(1);

for(i=1;i<argc;++i) {
j = 0;

while((ch = fgetc(fp[i-1]))) {
if((szo = memoriafoglalas(szo, j))==NULL)
exit(1);

if(atugras(ch) == HAMIS) {
szo[j++] = tolower(ch);
} else if(j > 0 || ch == (int)EOF) {
szo[j] = '\0';
beszuras(&gyok, szo, i-1);
free(szo);
szo = NULL;
j = 0;

if(ch == (int)EOF) {
break;
}
}
}
fclose(fp[i-1]);
}
free(fp);
bejaras(gyok, argc-1);
torles(gyok);

return 0;
}

Ez lefordul, csak hibás kimenetet ad vissza :( az egyetemi tesztelőn

[ Szerkesztve ]

(#1009) Jester01 válasza blaces (#1007) üzenetére


Jester01
(PH! kedvence)

Izé, azt írtad az inicializálaltan sz változót javítod. Pedig nem. Cserébe viszont bevezettél egy h változót, ráadásul a cikluson kívül. (A valgrind kimeneted egyébként használhatatlan, mert nem adtál meg neki be/ki fájlnevet)

Jester

(#1010) Jester01 válasza blaces (#1008) üzenetére


Jester01
(PH! kedvence)

Ez meg nem is hasonlít a feladatkiírásra. Eleve egész számokról van szó. A fa elemeknél nem is értem a mezőket. A két bejárást sehol nem látom, ahogy a kiírandó igen és nem szavakat sem. A beolvasás meg úgy látom tetszőleges számú fájlból akar olvasni és sehová nem ír, pedig a feladat szerint egy darab bemeneti és egy darab kimeneti fájl van.

Biztos, hogy ez a program ehhez a feladathoz tartozik? :F

Jester

(#1011) blaces válasza Jester01 (#1010) üzenetére


blaces
(tag)

ufff bocs :W

ez a feladat...

[I]Írj programot, amely parancssori argumentumként megkapja legfeljebb 10 szöveges állomány nevét, és lexikografikus sorrendben a szabványos kimenetre írja azokat a szavakat, amelyek az összes állományban előfordulnak! Minden szót csak egyszer kell kiírni, és a kis- és nagybetűket azonosként kell kezelni (azaz az "alma" és az "alMA" szavakat azonosnak kell tekinteni).

Az állományokban minden sor egy vagy több szót tartalmaz. A sorokat az újsor karakter (\n) zárja. A sorokban a szavak egyetlen szóköz karakterrel vannak elválasztva egymástól. Minden szó legfeljebb 50 karakter hosszú.

A program a szabványos kimeneten minden sorba egyetlen szót írjon! A kimeneten minden szó csupa kisbetűvel szerepeljen! Az implementációhoz használj bináris fát.[/I]

(#1012) Jester01 válasza blaces (#1011) üzenetére


Jester01
(PH! kedvence)

Na így már jobban hasonlít, bár a feladatkiírás szerint minden szót pontosan egy szóköz választ el egymástól, te meg mindenféle mást is elválasztójelnek tekintesz. Ez okozhat problémát.

De ami biztos rossz, hogy a fájl végén ha éppen soremelés után vagyunk (ami pedig szokás) akkor beszúrsz egy üres szót is a fába. Ettől eltekintve az általam használt tesztadatra jól működött.

Jester

(#1013) blaces válasza Jester01 (#1012) üzenetére


blaces
(tag)

ezt a fordítási hibaüzenetet kaptam az egyetemi fordíton c:113:2: error: no newline at end of file

Most akkor valahova bekéne raknom egy pintf("\n"); parancsot? de hova? mert szerintem akkor már máshogy működne...

és köszi a türelmet és a segítséget :)

[ Szerkesztve ]

(#1014) doc válasza blaces (#1013) üzenetére


doc
(MODERÁTOR)
LOGOUT blog

sehova, nyomj egy entert a forras vegen :)

Aláírás (nem kötelező megadni - minden hozzászólásnál automatikusan az üzenet végéhez íródik)

(#1015) vgergo


vgergo
(fanatikus tag)

Mi ezzel a kóddal a gond?

for (int i = 1421; i <= 3; i=i-5)
{
cout << memblock[i];
}

Az a bajom ezzel a kóddal, hogy nem ír ki semmit, miközben a memblock[i] minden i-re egy számot tárol.

Sőt még ez sem működik:

for (int i = 1421; i <= 3; i=i-5)
{
cout << i;
}

Ez működik:

for (int i = 0; i < size; i++)
{
cout << memblock[i];
}

size sokkal nagyobb, mint 1421

Segítségeteket előre is köszönöm.

[ Szerkesztve ]

(#1016) ArchElf válasza vgergo (#1015) üzenetére


ArchElf
(PH! addikt)
LOGOUT blog

Mert amit írsz [for (int i = 1421; i <= 3; i=i-5)], azt azt jelenti:
Fusson a ciklus 1421 -től -5 ösével addig, amíg a ciklusváltozó kisebb vagy egyenlő, mint 3.
Mivel már kezdetben sem kisebb vagy egyenlő, mint három, bele sem ugrik a ciklusba... Amit te szeretnél (gondolom), az ez:

for (int i = 1421; i >= 3; i=i-5)
{
cout << memblock[i];
}

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1017) vgergo válasza ArchElf (#1016) üzenetére


vgergo
(fanatikus tag)

Nagyon szépen köszönöm soha nem vettem volna észre, hogy fordítva van a kacsacsőr.

(#1018) Iolé


Iolé
(újonc)

Sziasztok!

Szeretném a segítségeteket kérni! Lenne egy program, amit nem egészen értek, főleg utolsó rész nem tiszta. Esetleg valaki tudna egy kis kommentet írni hozzá, hogy hogyan működik, meg mikor mit csinál, nagyon fontos lenne!
Ez volta feladat: A parancs a parancs sorban egy decimális számot (vagy decimális számok

szóközökkel elválasztott sorozatát) vár(ja), amely(ek)nek kiírja római

szám megfelelőjét az stdout-ra.

Hibásan megadott parancs esetén a programnak rövid diagnosztikai

üzenetben informálnia kell a felhasználót arról, hogy a parancsot

hogyan kell használni. A diagnosztikai üzenetet az stderr-re kell

küldeni.

És a program:
#include <stdio.h>

int main(argc, argv)
int argc;
char *argv[];
{
int i = 0, x=0;
int dec;
char rom[50];
if(argc == 1){
fprintf(stderr, "Hianyzik a parameter!");
exit( 1 );
}

for(x=1;x<argc;x++){
if(egesze(argv[x])){
dec = atoi(argv[x]);
}else{
fprintf(stderr, "A parameterlistaban nem megfelelo az egyik ertek!");
exit( 1 );
}

while(dec>=1000){
dec -= 1000;
rom[i] = 'M';
i++;
}
if (dec>=900){
dec-=900;
rom[i] = 'C';
i++;
rom[i] = 'M';
i++;
}
if(dec>=500){
dec -= 500;
rom[i] = 'D';
i++;
}
if (dec>=400){
dec -= 400;
rom[i] = 'C';
i++;
rom[i] = 'D';
i++;
}
while(dec>=100){
dec = dec-100;
rom[i] = 'C';
i++;
}
if(dec>=90){
dec -= 90;
rom[i] = 'X';
i++;
rom[i] = 'C';
i++;
}
if(dec>=50){
dec -= 50;
rom[i] = 'L';
i++;
}
if(dec>=40){
dec -= 40;
rom[i] = 'X';
i++;
rom[i] = 'L';
i++;
}
while(dec>=10){
dec -= 10;
rom[i] ='X';
i++;
}
if(dec == 9){
rom[i] = 'I';
i++;
rom[i] = 'X';
i++;
}
else{
if(dec >= 5){
dec -= 5;
rom[i] = 'V';
i++;
}
if(dec == 4){
rom[i] = 'I';
i++;
rom[i] = 'V';
i++;
}
else{
while(dec > 0){
dec -= 1;
rom[i] = 'I';
i++;
}
}
}
rom[i]='\0';
printf(" %s", rom);
}
exit(0);
}

int egesze(s)
char *s[];
{
int i=0, kezd;
while (s[i]==' ' || s[i]=='\n' || s[i]=='\t')++i;
if(s[i]=='+' || s[i]=='-')++i;
kezd=i;
while(s[i]>='0' && s[i]<='9')++i;
if(i==kezd || s[i]!=' ' && s[i]!='\t' && s[i]!='\n' && s [i]!=0) return 0;
else return 1;
}

int atoi(s)
char s[];
{
int i, n;
n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + (s[i] - '0');
return n;
}

(#1019) ArchElf válasza Iolé (#1018) üzenetére


ArchElf
(PH! addikt)
LOGOUT blog

Nem akarom modani, de kicsit hibás is a program...
- Negatív számokra nem ír ki semmit (egy hibaüzenet azért elkélne)
- túl hosszú számokra hibát dob (puffer túlcsordulás miatt), ezt is illendő volna lekezelni
- az alábbi sor elé kell egy i = 0;
while(dec>=1000){
mert jelen helyzetben egymás mögé konkatenálja a sztringeket (amiből sok jó nem származik):

test.exe 1 2 3
I III IIIIII

test.exe 1 5 7
I IV IVVII

Amúgy nagyvonalakban:
egesze fv: megnézi, hogy az n. argument egész számmá alakítható-e (az argumentum első része csak számokból áll-e)
atoi fv: string integer-ré varázsolása...
belső for ciklus: végigmegy az argumentumokon, kivonásos alapon "legyártja" római karakteres reprezentációt, kiírja a kimenetre

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1020) Iolé válasza ArchElf (#1019) üzenetére


Iolé
(újonc)

Köszi szépen!!

(#1021) Zwiebel


Zwiebel
(tag)
LOGOUT blog

Sziasztok!

Programfejlesztést szeretnék tanulni , ehhez könyvet szeretnék venni és nem tudom , hogy melyikkel lehetne jobb programokat írni C-vel vagy C++-al? Játékokhoz melyik ésszerűbb? Melyiket könyebb tanulni?

És légyszíves ha tudtok ajánljatok nekem egy könyvet C-rő vagy C++-ról amelyik szerintetek egy kezdőnek ésszerűbb :) és jobb progik :)

Előre is köszi!

Zwiebel

Egy új fogalmat szeretnék alkotni: ProG(r)a(m)mer

(#1022) gygabor88 válasza Zwiebel (#1021) üzenetére


gygabor88
(kvázi-tag)

C-hez könyv: Brian Kernighan & Dennis Ritchie A C programozási nyelv
C++ könyv: Bjarne Stroustroup A C++ programozási nyelv

Ezenkívül rengeteg más a témával kapcsolatos könyvet fogsz találni a boltokban, de mind hulladék. Ezt komolyan mondom. Elég ha a terjdelmeket összehasonlítjuk, már akkor is látszik. A lényeg, hogy ha ezen a vonalon akarsz elindulni, akkor először a C-s könyvet utána a C++ könyvet olvasd ki. Utóbbit nem árt többször is elolvasni. Már csak azért is ezeket vedd meg, mert ha később programozónak tanulsz, akkor egyetemen is ezekből kell majd tanulnod.

(#1023) sghc_toma válasza gygabor88 (#1022) üzenetére


sghc_toma
(őstag)
LOGOUT blog

maganvelemeny kovetkezik, nem megkovezni erte:)
annyira nagyon nem ismerem a Stroustroup konyvet (referencianak hasznaltam parszor), de szerintem teljesen kezdonek nem a legmegfelelobb.. tul sok infot tartalmaz elsore.. szerintem sokkal jobban lehet tanulni egy olyan konyvbol, ami kisebb problemak megoldasan keresztul nyujt betekintest a nyelvbe.. amikor meg mar van egy ralatasod a dolgokra (es erdekel is a dolog), ugyis utananezel az apro finomsagoknak..

azzal az altalanosan elfogadott nezettel sem ertek egyet, hogy eloszor C, aztan C++.. nem irom le, hogy miert, mert Bartosz Milewski nagyon jol leirja a C++ In Action cimu konyveben, es maximalisan egyetertek vele..

Meg egy konyv van, amit tudok ajanlani C++-hoz: Thinking In C++..

in asm we trust

(#1024) gygabor88 válasza sghc_toma (#1023) üzenetére


gygabor88
(kvázi-tag)

Anno C++ volt az első programnyelv, amit megtanultam, utána C. Akkor úgy éreztem gyorsabban eljutottam volna ugyanoda, ha C lett volna a kezdőnyelv, ezért ajánlottam így, de nyilván mindenkinek más az ideális. Stroustroup könyv is jó kezdőnek, ha mellette példakódokat is néz a netről minden témakörhöz. A többi könyvvel az a baj, hogy felszínesen átrohannak minden témán , aztán amikor az olvasó belenéz egy open source program forrásába, akkor nem érti, mert alapvető nyelvi elemeket nem ismertetett a könyv.

(#1025) doc válasza gygabor88 (#1024) üzenetére


doc
(MODERÁTOR)
LOGOUT blog

en forditva csinaltam, C utan jott a C++, aminek megvolt az a hatranya, hogy sokaig kevert C/C++ programokat irtam, nem hasznaltam ki igazan a nyelv adottsagait, mert a C-s megoldast mar ismertem, igy azt hasznaltam (pl. filekezelesnel, input/outputnal)
igazabol ha komolyan akar C++-szal foglalkozni, es "ahhoz valo" feladatokat csinalni (pl. gui, stb) akkor a C-s alap inkabb hatrany mint elony, nagyon mas gondolkodasmod kell a kettohoz

Aláírás (nem kötelező megadni - minden hozzászólásnál automatikusan az üzenet végéhez íródik)

(#1026) Zwiebel


Zwiebel
(tag)
LOGOUT blog

Sziasztok!

Köszönöm szépen a válaszokat! :R

Egy új fogalmat szeretnék alkotni: ProG(r)a(m)mer

(#1027) sghc_toma válasza doc (#1025) üzenetére


sghc_toma
(őstag)
LOGOUT blog

en is igy latom.. Basic-kel, Pascal-lal kezdtem, es nagyon sokaig tartott, mire felnyilt a szemem, es megtanultam igazan hasznalni a C++ adta lehetosegeket..

gygabor88: Thinking In C++-t ezert szeretem nagyon; alaposan bemutatja a nyelvet, es mindezt jo peldaprogikon keresztul teszi..

in asm we trust

(#1028) kampi_


kampi_
(újonc)

Sziasztok!

Egy gyors kérdésem lenne. Van egy gépnév mint pl:: computer1234 ebből szeretnék én egy olyat, hogy az utolsó 4 karakter ténylegesen int tipusú legyen ne char. Tudnátok ebben segíteni. Nekem sehogysem jön össze. Nagyon fontos lenne!

Előre is köszönöm a segítséget!

Üdv:Kampi

(#1029) sghc_toma válasza kampi_ (#1028) üzenetére


sghc_toma
(őstag)
LOGOUT blog

udv! lehet, hogy van szebb megoldas is, de marha faradt vagyok, csak ez jutott eszembe:

char * str = "computer1234";
int num;
sscanf(str, "%*[^0123456789]%d", &num);

in asm we trust

(#1030) Jester01 válasza kampi_ (#1028) üzenetére


Jester01
(PH! kedvence)

Ha tudod, hogy az utolsó 4 karakter kell, akkor

char * str = "computer1234";
int num = atoi(str + strlen(str) - 4);

Ha nem tudod, akkor lásd sghc_toma megoldását fentebb :K

Jester

(#1031) farki001


farki001
(lelkes újonc)

Sziasztok!

Nem sokára (ha felvesznek) kezdem a győrben a mérnökinfó szakot. S kicsit előre szeretnék tanulni hogy könnyebb dolgom legyen. Az előző hozzá szólásokból megvan milyen könyveket szerezzek be. Köszi. Tudnátok mondani valami fejlesztői környezetet amiben tudnék gyakorolni.

Előre is köszi.

(#1032) Tv válasza farki001 (#1031) üzenetére


Tv
(senior tag)

Szia! Kezdésnek a C-Free szerintem tökéletesen elég.

(#1033) doc válasza farki001 (#1031) üzenetére


doc
(MODERÁTOR)
LOGOUT blog

gyorben regebben Turbo C-t nyomtak, nem tudom most mi az aktualis perverzio, de probald megtudni (gondolom vannak itt is Szechenyisek, majd megmondjak), es azzal gyakorolj
bar Bauer bacsi majd ugyis elmondja hogy mi van :D

Aláírás (nem kötelező megadni - minden hozzászólásnál automatikusan az üzenet végéhez íródik)

(#1034) farki001 válasza doc (#1033) üzenetére


farki001
(lelkes újonc)

Köszi. Akkor újabb kérdés van itt Szechenyis? :DD aki meg tudná mondani, hogy milyen fejlesztői környezetet preferálnak?

(#1035) gaben


gaben
(fanatikus tag)

Szaisztok!
Lenne egy .txt fájl,amiben soronként vannak adatok(több ezer sorban).Ezeket az adatokat kellene feldolgozni.
Úgy gondoltam,hogy majd az fgets-el kiszedem soronként az adatokat,ezt beteszem egy tömbbe(ebbe mindig csak az aktuális sor adatai vannak),és utána,ezt besteszem egy másik tömbbe(ide gyűjtöm soronként az adatokat,egy nagy vektor lesz) ,tehát mindegyik soron végig megyek,és az összes adatot egy vektorba teszem.Majd ezen a vektoron végzem el a feldolgozást.De ne makar összejönni,az fgets,csak az utolsó sorral dolgozik.
Próbáltam for ciklusba rakni,de így sem akar összejönni.

Hogyan tudnám megoldani,hogy soronként megyek?Vagy lehet az egész elgondolás rossz?
Köszönöm a helpet.
a Próbálkozás egy részlete:

while(!feof(filep)){
if (feof(filep)) break;

for(i=0;i!='\n';i++){

fgets(sor,1000,filep);
}
}

(#1036) gaben válasza gaben (#1035) üzenetére


gaben
(fanatikus tag)

Hát ezt eléggé benéztem. :((
Persze,hogy az utolsó sort írja ki....na azt a fort kivettem,aztán strcat -al hozzáfűzöm.Alakul már így.

(#1037) gaben


gaben
(fanatikus tag)

A szövegfájlban megkéne számolni pl: a 25-öt.Ezt hogy tehetném meg?
1-9-ig az ASCII kód alapján megtudnám,de a több jegyűeknek nem tudom az ASCII kódját.
Ha meg csak a karaktere nézem akkor kiírja az összes olyat amiben van Pl: 5-re mint számra keresek kidobja a 15-öt is,stb..
5let?

(#1038) gygabor88 válasza gaben (#1037) üzenetére


gygabor88
(kvázi-tag)

Strstr függvényt lenne célszerű használni egy ciklusban: [link]

[ Szerkesztve ]

(#1039) gaben válasza gygabor88 (#1038) üzenetére


gaben
(fanatikus tag)

szerintme ez neke mnem lesz jó,mert több is lehet a stringben,és a végén meg kéne számolni,hogy össz mennyi van.

(#1040) gygabor88 válasza gaben (#1039) üzenetére


gygabor88
(kvázi-tag)

Értem én, ezért írtam, hogy ciklusban kell majd hívogatni, hogy megszámolja az egy sorban levőket pl. Meg persze a ciklusban léptetni kell azt a pointert, amiben keresel.

(#1041) gaben válasza gygabor88 (#1040) üzenetére


gaben
(fanatikus tag)

nem igazán látom át perpill,kicsit jegelem,hátha az segít :D

(#1042) gygabor88 válasza gaben (#1041) üzenetére


gygabor88
(kvázi-tag)

Kb így gondoltam:

char* line = "asifh 25 dfis df 25 25 25 dsojg 25";
const char* pattern = "25";
char* tmp = line;
int count = 0;
do
{
tmp = strstr(tmp,pattern);
if(tmp)
{
count++;
tmp = tmp + strlen(pattern);
}
}while(tmp);

(#1043) gaben válasza gygabor88 (#1042) üzenetére


gaben
(fanatikus tag)

Ez majdnem jól is működik,csak a baj az hogy (ahogy fentebb is írtam) minden olyat megtalál,amiben szerepel a keresési kulcs.Pl..: 25 esetén megtalálja a 25-öt,a 125,225,325,stb is...
De köszi szépen az 5letet.

(#1044) gygabor88 válasza gaben (#1043) üzenetére


gygabor88
(kvázi-tag)

Beleteszel két if-et, hogy előtte-utána szóköz van-e.

(#1045) gaben válasza gygabor88 (#1044) üzenetére


gaben
(fanatikus tag)

Ezen már én is gondolkodtam,csak akkor meg megint jön egy újabb gond:
ha a sor a keresettel kezdődik akkor azt is le kell kezelni,és az úgy lehet hogy előtte sor vége van?

(#1046) ArchElf válasza gaben (#1045) üzenetére


ArchElf
(PH! addikt)
LOGOUT blog

C helyett nem lehet mást használni? RegEx-el elég egyszerűen meg lehetne oldani a problémát.
"25"-el mondjuk a következő:
(^25\W)|(\W25\W)|(\W25$)

AE

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1047) gaben válasza ArchElf (#1046) üzenetére


gaben
(fanatikus tag)

sajnos ezt nem ismerem,de majd utána nézek

[ Szerkesztve ]

(#1048) gaben válasza gaben (#1045) üzenetére


gaben
(fanatikus tag)

azt nem értem,hogy miért van az,hogy ha strstr-ben a pattern a tab,nem a 25,akkor egyáltalán nem számol.Mert ha a mintába a "tab25" kerül ,akkor elvileg így is meglehetne nézni,hogy előtte mi van,de így sem működik.

(#1049) gygabor88 válasza gaben (#1048) üzenetére


gygabor88
(kvázi-tag)

Ennek működnie kell:

char* line = "25asifh 125 dfis df 25 25 25 dsojg 2525";
const char* pattern = "25";
char* tmp = line;
int count = 0;
do
{
tmp = strstr(tmp,pattern);
if(tmp)
{
char *ch1 = tmp;
char *ch2 = tmp;
ch1--;
ch2 = ch2 + strlen(pattern);
if(((*ch2) == ' ' || (*ch2) == '\0') && (ch1 < line || (*ch1) == ' '))
{
count++;
}
tmp = tmp + strlen(pattern);
}
}while(tmp);

[ Szerkesztve ]

(#1050) gaben válasza gygabor88 (#1049) üzenetére


gaben
(fanatikus tag)

Köszönöm a segítséget!

Copyright © 2000-2014 PROHARDVER Informatikai Kft.