Jump to content
PirateClub.hu

c++ gond


szilard5
 Share

Recommended Posts

  • Replies 87
  • Created
  • Last Reply

Top Posters In This Topic

  • 4 weeks later...

Valaki aki ráér megtudná nézni, hogy mi lehet a gondja a programnak?

 

#include<iostream>

#include<iomanip>

#include<fstream>

#include<ctime>

 

using namespace std;

 

struct kockazo

{

char nev[20];

int dob[6];

};

 

int main()

{

setlocale(LC_ALL,"HUN");

kockazo kedd[2];

int ossz=0,ossz1=0;

cin.getline(kedd[1].nev,20);

for(int i=0;i<6;i++)

{

cout<<"Kerem a(z) "<<i+1<<". dobást: ";

cin>>kedd[1].dob;

 

while(kedd[1].dob<1 || kedd[1].dob>6)

{

cout<<"Hibás, csak 1-6 lehet, kérem újra! ";

cin>>kedd[1].dob;

};

 

}

ifstream be("kockazo.txt");

if(!be)

{

cerr<<"Nem találom a fájlt \n";

system("pause");

exit(1);

}

be.getline(kedd[2].nev,20);

for(int i=0;i<6;i++)

kedd[2].dob=rand()%6+1;

char a;

fflush(stdin);

cin>>a;

if(stdin)

{

system("cls");

 

cout<<kedd[1].nev<<" dobásai: \n";

for(int j=0;j<6;j++)

{

cout<<j+1<<". dobás: "<<kedd[1].dob[j]<<endl;

ossz=ossz+kedd[1].dob[j];

 

}

cout<<"összesen: "<<ossz<<endl;

 

cout<<kedd[2].nev<<" dobásai: \n";

for(int j=0;j<6;j++)

{

cout<<j+1<<". dobás: "<<kedd[2].dob[j]<<endl;

ossz1=ossz1+kedd[2].dob[j];

}

cout<<"összesen: "<<ossz1<<endl;

ofstream ki("nyert.txt");

if(ossz>ossz1)

{

cout<<"Nyert: "<<kedd[1].nev;

ki<<kedd[1].nev;

}

else

{

if(ossz<ossz1)

{

cout<<"Nyert: "<<kedd[2].nev;

ki<<kedd[2].nev;

}

else

{

cout<<"Dontetlen";

ki<<"Dontetlen";

}

}

}

 

cout<<endl;

system("pause");

return 0;

}

 

A visual studio 2005 ezt írja ki mikor futtatom:

http://kepfeltolto.hu/i/?241144&t=img

Mi lehet a gond? Vagy a Vista miatt van?

Link to comment
Share on other sites

Nem vagyok otthon a C++-ban, de szerintem a Vista miatt van ez. Van valami olyan utasítás, amit nem enged már a Vista. Pl. a real mode progik sem futnak normálisan a Vistan, szóval szerintem ez elképzelhető. Majd jön egy nálam nagyobb szaki és többet tud erről :)

Link to comment
Share on other sites

Javíts ki ha tévednék, egy egyszerű példa:char f[2];

 

ilyenkor elérhető memória címek: f[0] = 'j'; f[1] = 'ó';

 

szal ha ilyenkor f[2] re hivatkozol és az pont egy protected(most csak mondtam egy példát) memória cím, akkor jönnek az acces vilation-ok.

 

szal kedd[0] és kedd[1]

 

Nézd meg hátha :)

Link to comment
Share on other sites

Köszi, de már nincs fönt a Visual Studio(win reinstall volt) de a tanáromnak mutattam és szerinte hiányzik valahonnan egy fflush és az kavar be.

Ja meg írtunk ma egy ZH-t. 52 pontból 41 lett és ezt hozzáadva a félév közben szerzett pontokhoz meglett év végén a 3-as.

Link to comment
Share on other sites

Attól nem acces violationt kellene hogy kapj.

Akkor csak rossz eredményt kapnál mert a változód a következő ciklusban ugyanazt az értéket kapná meg ami az előző bekérésnél/olvasáskor volt. Címzéshibára tudok gondolni, csak az a fura hogy dev c++ ban tökéletesen fut :) .

Link to comment
Share on other sites

sziasztok! én is egy nagy kéréssel fordulok hozzátok. nagyon kezdő vagyok c-ben és kaptam egy házit jegyre és elég bonyolultnak tűnik nekem,remélem tudtok segíteni.fontos lenne mert ezen múlik az évvégi jegyem.ja,és szerdára kéne beadnom.

tehát a feladat: egy tesztet írt 3 tanuló.a teszt 15kérdésből állt,minden kérdésre 4 válasz volt,de csak 1 volt a helyes.a helyes megoldást egy meglévő dokumentum tartalmazza szóközökkel elválasztva(megoldas.txt:).a tanuló válaszait egy másik txt tartalmazza a minta alapján

Pokol Sára

1 3 2 1 4 3 2 1 2 3 3 2 1 3 4

Szegfű Olivér

3 2 3 4 1 2 2 3 1 2 4 1 2 2 4

Balogi Jolán

2 4 3 3 3 2 1 4 2 4 2 4 3 2 2

1.kiíratni a megoldást tartalmazó állományt

2.kérjük be a tanuló nevét és írassuk ki a válaszait

3.írassuk ki h volt e 15 helyes válaszos tanuló

4.volt e min 13 helyes válaszos

5.bekérni a feladat sorszámát és kiíratni h kik válaszolt rá helyesen

6. kiírni a nevet és a helyes válaszok számát

7.kiíratni a legrosszabb válaszadó nevét

8készíteni egy statisztika.txt-t amiben van:

-kérdésenként hány helyes válasz

-átlagosan hány helyes válasz

-hány fő teljesített 60% felett

előre is köszönök minden segítséget

Link to comment
Share on other sites

Be kell olvasni a megoldásokat egy tömbbe, a tanulók válaszait és össze kell hasonlítgatni. Ne idegeskedj.

 

A kiíratást gondolom meg tudod csinálni. Változókban tárolod a legjobb és legrosszabb válaszadót. Egyedül a 8-as a nehezebb szerintem, de az sem lehetetlen.

Mivel nem ismerem a C-t, ezért csak így tudtam elmagyarázni.

Bontsd le a feladatot, először csak az elsővel foglalkozz, amíg nem működik az hibátlanul. Utána jöhet a következő ;)

Link to comment
Share on other sites

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

class tanulo{
   public:
     int oszt[15];
     char *nev;
   
     void nev_ert(char *s, int jegy[15]){
        int i; 
        nev = (char*) malloc (sizeof(char) * strlen(s));
        strcpy(nev,s);
        for (i = 0; i < 15; i++) oszt[i] = jegy[i];
     }                   
};

void kiirat(tanulo x){
     int i;
     printf("%s\n",x.nev);
     for (i = 0; i < 15; i++) {
         printf("%d",x.oszt[i]);
         (i == 14) ? printf("\n") : printf(" ");
     }
}

int* valaszok_be(FILE *f){
   int i;
   int *v = (int*) malloc (sizeof(int) * 15); 
   
   fscanf(f,"%d",&v[0]);
   for(i = 1; i < 15; i++) fscanf(f," %d",&v[i]);  
   
   return v;
}

void volte(int limit, tanulo x, int *jok){
    int counter = 0;
    int j;
    
    for (j = 0; j < 15; j++) if (jok[j] == x.oszt[j]) counter++;
    if (counter >= limit) printf("%s: %d helyes választ adott\n",x.nev,counter);

    return;
}

void helyesen(int sz, int *jok, tanulo *tanulok){
    int i,k = 0;
    for (i = 0; i < 3; i++){
        if (tanulok[i].oszt[sz] == jok[sz]) { k++; printf("Helyes válasz: %s\n",tanulok[i].nev);}
    } 
    if (k == 0) printf("Nem volt helyes válaszadó!\n");
}

int helyesV(tanulo x, int *jok){
    int i,counter = 0;
    for (i = 0; i < 15; i++){
        if (x.oszt[i] == jok[i]) counter++;
    }
    return counter;
}

int main(){
    int i,d; 
    int *jovalaszok, *valaszok;
    char nev[256];
    char k;
    
    tanulo tanulok[3];
    
    FILE *f = fopen("teszt.txt","r");
    
    for (i = 0; i < 3; i++){
        d = 0;
         do{
              k = fgetc(f);
              if (k != '\n')nev[d++] = k;
              nev[d] = '\0'; 
        }while ((k != '\n') && (k != '\0'));
        valaszok = valaszok_be(f);
        tanulok[i].nev_ert(nev,valaszok);
        fgetc(f);//megálltunk a sor végén ezért átugorjuk még az utsó karaktert
    }
    fclose(f);
    
    f = fopen("megoldas.txt","r");
    jovalaszok = valaszok_be(f);
    fclose(f);
    
    for (i= 0; i< 15; i++) {
        printf("%d",jovalaszok[i]);
        (i == 14) ? printf("\n") : printf(" ");
    }
    
    for (i = 0; i < 3; i++) kiirat(tanulok[i]);
    
    for (i = 0; i < 3; i++) volte(15,tanulok[i],jovalaszok);
    for (i = 0; i < 3; i++) volte(13,tanulok[i],jovalaszok);
    
    fflush(stdin);
    printf("Feladat sorszána: ");
    scanf("%d",&d);
    
    helyesen((d-1),jovalaszok,tanulok);
    
    for (i = 0; i < 3; i++) {
         printf("%s: %d\n",tanulok[i].nev,helyesV(tanulok[i],jovalaszok));
    }
    
    system("pause");
    
    free(jovalaszok);
    free(valaszok);
        
    return 0;
}

 

Unatkoztam, ez alapján már a statot meg tudod csinálni sztem.

 

Kipróbáltam de tüzetesen nem teszteltem le.(értsd lehetnek benne hibák)

A puding próbája hogy megeszik :lol: na majd írsz most dolgom van.

 

Tejcsokoládés csőtészta.

Link to comment
Share on other sites

Kedves SixHouse!Nagyon rendes vagy,csak az a gond h túlságosan tudsz:D igazából sok olyan dolog van abban amit írtál amit még nem is vettünk.amúgy már a probléma megoldva,mert volt egy rendes oszt.társam aki segített,és minden happy:) ha valakit érdekel,a kódot berakhatom,bár kétlem h bárkit is érdekel:D

Link to comment
Share on other sites

Na,akkor berakom egy kis kommenttel:) a hetedik feladatig kész

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>
#define M 20
/*------------------------------------------------------------------------------
Létre hozunk egy recordot ... ez elsõként a felhasználó nevét fogja tárolni,
mellé a hozzá tartozó teszt megoldásokat, valamint a legutolsó elem a jó
megoldások számát tárolja el. A recorddal egy tömböt hozunk létre. Ez arra, hogy
különbözõ típusú (string, integer) változókat tudjunk egy tömbben tárolni. A
létrehozott tömbönk a fent definiált M (20) elemû lesz.
------------------------------------------------------------------------------*/
struct teszt{
    char nev[30];
    int a[16];
} t[M];

int megoldas[15]; // eltárolom a megoldásokat

void elsofeladat();
void masodikfeladat();
void harmadikfeladat();
void negyedikfeladat();
void otodikfeladat();
void hatodikfeladat();
void hetedikfeladat();

void main()
{
randomize();
elsofeladat();
masodikfeladat();
harmadikfeladat();
negyedikfeladat();
otodikfeladat();
hatodikfeladat();
hetedikfeladat();
getch();
}

/*------------------------------------------------------------------------------
Lusták vagyunk, ezért soron kívül legeneráljuk a megoldas.txt és az adat.txt
fájlokat. Mivel ezt csak egyszer kell használni a továbbiakban kikommentelem :)
------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
void general()
{
int i , j;
FILE *f , *m;
m=fopen("megoldas.txt","w+");
    for (i = 0; i <= 14; i++) {
        fprintf(f,"%d ", random(4)+1);
    }
fclose(m);
f=fopen("adat.txt","w+");
    for (j = 0; j <= M-1; j++) {
        for (i = 0; i <= 14; i++) {
            fprintf(f,"%d ", random(4)+1);
        }
        fprintf(f,"\n");
    }
}

------------------------------------------------------------------------------*/

/*------------------------------------------------------------------------------
1. Kiiratni a képernyõre a tanulók válaszait.
------------------------------------------------------------------------------*/

void elsofeladat() {
    int i , j , jo = 0;
    char anev[30];
    FILE *f , *m;
    m=fopen("megoldas.txt", "rt");
        for (i = 0; i <= 14; i++) {
            fscanf(m,"%d", &megoldas[i]); // a megoldásokat beolvassuk a megoldas tömbbe.
        }
    fclose(m);
    f=fopen("adat.txt", "rt");
        for (i = 0; i <= M-1; i++) {
            fscanf(f, "%s", &anev);         // az anev változóba beolvasom a fájl elsõ stringjét
            strcpy(t[i].nev, anev);     // lemásolom ezt a stringet a rekordom elsõ elemébe
            strcat(t[i].nev, " ");        // a lemásolt adathoz hozzáfûzök egy szóközt
            fscanf(f, "%s", &anev);         // az anev változóba beolvasom a fájl második stringjét
            strcat(t[i].nev, anev);     // hozzáfûzöm ezt a stringet a rekordom elsõ eleméhez
            for (j = 0; j <= 14; j++) { // egy másik ciklussal beolvasom a 15 teszt eredményét az a tömbbe.
                fscanf(f,"%d", &t[i].a[j]);            // beirom a beolvasott értéket az a tömbbe
                if (t[i].a[j] == megoldas[j]) {     // he ez a beolvasott érték megeegyezik a megoldás azonos feladatának értékével
                    jo++;                           // növelem a jo -t 1-gyel
                }
            }
            t[i].a[15]=jo;                // beirom az a tombbe a jo-t.
            jo = 0;                    // jo-t lenullázom, hogy legközelebb is lehessen vele számolni
        }
    fclose(f);
    // most ki fogom irni a fejlecet!
    textcolor(8);
    cprintf("Tanulo neve");
    printf("\t");
    for (j = 1; j <= 15; j++) { // ciklus segítségével a  feladat sorszámáz
        cprintf("%3d",j);
    }
    cprintf(" Jok");            // és végül, hogy jok, mert ott vannak a jó megoldások elmentve
    printf("\n");
    // fejlec vege, most jonnek az adatok
    for (i = 0; i <= M-1; i++) {
        printf("%s\t", t[i].nev);       // kiírom a nevet.
        for (j = 0; j <= 15; j++) {
            printf("%3d", t[i].a[j]);     //ciklus segítségével kiírom an évhez tartozó eredményeket
        }
        printf("\n");                    // sort emelek, a többi tanulonak
    }
}

/*------------------------------------------------------------------------------
2. Bekérni egy tanuló nevét és kiíratni csak az õ válaszait.
------------------------------------------------------------------------------*/

void masodikfeladat() {
    int i = 0 , j , db = 0;
    char anev[30];
    char neve[30];
    printf("\ntanulo neve: ");
    gets(anev);                             // bekérem a tanuló nevét "aneve" változóba
    strcpy(neve,anev);                      // átmásolom a szóköz miatt...
    for (i = 0; i <= M-1; i++) {
        if (strcmp(t[i].nev,neve)==0) {     // összehasonlítom a bekértet a tárolt nevekkel .. ha egyezik:
            printf("%s\t", t[i].nev);       // kiírom a nevet.
            for (j = 0; j <= 14; j++) {
                printf("%3d", t[i].a[j]);     //ciklus segítségével kiírom an évhez tartozó eredményeket
            }
            printf("\n");                    // sort emelek, mert több tanulonak lehet ugyanaz a neve
            db++;                           // novelem a db-t.
        }
    }
    if (db==0) {                            // ha db=0, akkor nem volt a névnek megfelelõ tanuló
        printf("Nincs ilyen nevu tanulo az iskolaban!");
    }
    printf("\n");
}

/*------------------------------------------------------------------------------
3. Kiírni h volt-e olyan tanuló, akinek mind a 15 válasza helyes.
------------------------------------------------------------------------------*/

void harmadikfeladat() {
    int i = 0;
    while (t[i].a[15]!=15 && i<=M-1) {              // az eltarolt "jok" nem egyenlo 15-tel, akkor ciklusban marad, tehát növeli az i-t a megadott korláti
        i++;
    }
    if (i<M) {    // ha volt 15 jo, akkor i kisebb lesz M-nél, ezért kilép .. tehát csak ki kell írnunk:
        printf("volt olyan tanulo, aki mindenre helyesen valaszolt.\n");
    }
    else {
        printf("nem volt mindenre helyesen valaszolo tanulo.\n");
    }
}

/*------------------------------------------------------------------------------
4. Kiíratni h volt-e olyan, akinek min 13 helyes válasza volt

szerintem félre írtad a feladatot ... szerintem az a feladat, hogy:
hányan válaszoltak legalább 13-ra helyesen :) szóval azt fogom megcsinálni ...
ha tévednék, akkor csak az elõzõben egy feltételt kell átírni:)
------------------------------------------------------------------------------*/

void negyedikfeladat() {
    int i = 0 , db = 0;
    for (i = 0; i <= M-1; i++) {        // ciklussal végig megyek az eltárolt adatokon
        if (t[i].a[16]>=13) {             // ha a "jok" 13, vagy annal több, akkor
            db++;                       // db-t novelem.
        }
    }
    if (db==0) {                        // ha db = 0 akkor nem volt
        printf("nem volt semennyi tanulo.\n");
    }
    else {                             // egyébként meg kiiratom db-t.
        printf("%d tanulo irt 13, vagy annal tobb pontot ero teszetet.\n", db);
    }
}

/*------------------------------------------------------------------------------
5. Bekérni a feladat sorszámát és kiíratni h kik válaszoltak rá helyesen.
------------------------------------------------------------------------------*/

void otodikfeladat() {
    int i , j , ssz;
    printf("\nfeladat sorszama: ");
    scanf("%d",&ssz);                   // bekerem a feladat sorszamat
    if (ssz<1 || ssz>15) {
        printf("hibas szam\n");
    }
    else {
        for (i = 0; i <= M-1; i++) {
            if (megoldas[ssz-1]==t[i].a[ssz-1]) {      //ciklusban osszehasonlitom a megoldasban tarolt és a tanulok altal adott valaszt
                printf("%s\n", t[i].nev);          // ha jó, kiírom a nevüket
            }
        }
    }
}

/*------------------------------------------------------------------------------
6. Készíteni egy másik állományt amibe belekerülnek a tanulók neve és helyes válaszaik száma.
------------------------------------------------------------------------------*/

void hatodikfeladat() {
    int i;
    FILE *f;
    f=fopen("helyesvalasz.txt","w+");
        for (i = 0; i <= M-1; i++) {
            fprintf(f,"%s: %d helyes valasz\n", t[i].nev , t[i].a[15] );
        }
    fclose(f);
}

/*------------------------------------------------------------------------------
7. Kiíratni a legrosszabb válaszadó(k nevét)
------------------------------------------------------------------------------*/

void hetedikfeladat() {
    int i , min ;
    min = t[0].a[15];
    for (i = 0; i <= M-1; i++) {
        if (min>t[i].a[15]) {
            min = t[i].a[15];
        }
    }
    printf("\nlegrosszabb valaszadok: \n");
    for (i = 0; i <= M-1; i++) {
        if (t[i].a[15] == min) {
            printf("%s\n", t[i].nev);
        }
    }
}

Link to comment
Share on other sites

  • 2 weeks later...

Skacok! megint lenne egy kis problémám:Sholnapra kéne ijen indexvektoros rendezés csinálni minimummal de vhol elrontottam.Megtudná vki lesni h hol a hiba?remélem nem túl későn szóltam és előre is köszi!

tehát a kód:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{int i,j,min,a[10],b[10];
clrscr();
randomize();
for (i = 0; i <= 9; i++) a[i]= random(100)+1;
for (i = 0; i <= 9; i++) b[i]= i;
for (i = 0; i <= 9; i++) printf("%d ",a[i]);
while (i<=9){
for (i = 0; i <= 9; i++) {
if (a[i]<min) {
min=a[i];}}
for (j = 0; j <= 9; j++) {
b[j]=min;
j=j++;}}
printf("\n");
for (i = 0; i <= 9; i++) printf("%d ",a[b[i]]);
getch();}

Link to comment
Share on other sites

  • 2 weeks later...

1: nem tudja megnyitni az iostream.h fájlt

2,3,4: ezek az első problémából adódnak, ugyanis az a fájl tartalmazza ezeket a függvényeket :)

5: a getchar pedgi azt hiszem az stdio.h-ban található

 

(6: nem használod a deklarált változót semmire)

Link to comment
Share on other sites

  • 2 weeks later...

van ilyen sor a programban:

using namespace std

 

enélkül nem használhatod csak minősítve a cin/cout neveket.

Az include direktívában használt header nevekben pedig azért nem célszerű a .h-s nevet használni, mert ezek elavult, nem szabványos header állományok. C-s header-eket ugyan használhatsz C++-ban, de ezek csak a kompatibilitás miatt vannak benne a nyelvben, így a használatuk nem a legszebb kódot eredményezi. De ha már használod, akkor érdemes a C++-os verzióját használni, pl. stdio.h helyett, cstdio, stb.

Link to comment
Share on other sites

nem célszerű a .h-s nevet használni, mert ezek elavult, nem szabványos

 

Melyik szabványra gondolsz? :)

 

Az ansi c -ben ez a szabványos és ez "központi" szabvány.

(és "általában" ezzel a c++ szabványok kompatibilisek)

 

c++ ban igaz végülis :)

 

Itt egy kis segédlet amiből megnézheted seekoly javaslatát:

 

http://e-oktat.pmmf.hu/webgui/www/uploads/images/1453/010-c-c-2.pdf

Link to comment
Share on other sites

Az ISO szabványra. Mikor a 80-as végén megalkották a C++-t, akkor a standard könyvtárak nevei .h-ra végződtek. A nyelv szabványosítása során azonban úgy döntöttek, hogy a könyvtárakban elhelyezett függvényeket az std névtérbe rakják, ami jó ötletnek volt, de a régi forráskódokat ezzel a lépéssel (szabványos C++ fordítóval) lehetletlen lett lefordítani.

Ezért a régi könyvtárak, pl. a iostream.h ugyan felhasználhatók, de a szabvány szerint nem támogatottak => elavultak és a tartalmuk nincs benne az std névtérben. Ezért célszerű az új könyvtárakat használni, melyek szinte megegyeznek a régiekkel, de a tartalmuk az std névtérben található.

 

Így a szabvány szerint a nyelv két részből áll, a nyelv magjából és egy standard könyvtárból. Mondjuk ehhez később újabb részek kapcsolódtak, pl. az STL, és a C standard könyvtáraknak egy módosított változata. Így használhatók a régi C könyvtárak pl. stdio.h, de ezek globálisak a programra nézve. Vagy használhatók az standard könyvtárban találhatók pl. cstdio.

 

OK, hogy C++-ban lehet C programot írni, de az attól nem lesz C++. Mint ahogy C-ben is lehet C-szerű programot írni, de az attól nem lesz C pl. while( tomb[ i ] != 0 )

 

Amúgy C++-hot ajánlom az alábbi könyvet:

http://www.research.att.com/~bs/3rd.html

 

Esetleg pdf-ben megtalálható a guglin:

http://www.google.hu/search?hl=hu&q=The+C%2B%2B+Programming+Language+filetype%3Apdf&meta=

 

 

És ha mindenáron parancssorban akarsz fordítani, akkor használd inkább a GCC-t:

http://gcc.gnu.org/

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Hozzászólás a témához...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Jelenleg olvassa   0 members

    • No registered users viewing this page.



×
×
  • Create New...