Jump to content
GSForum - Segélyvonal

Programozás C/C++-ban


Recommended Posts

Posted

Ugyanígy, csak cseréld fel a for ciklusokban, hogy meddig mész. A mátrixok sorfolytonosan vannak ábrázolva C++-ban. Tehát a tanulok az egy sor, nem pedig oszlop, mint pl. a koordinátageometriában.

Posted

Na eddig a kód:

bool Minden_nyelven (const vector < vector <int> > &tanulok)
{
    bool l = false;

    for ( int i=0; !l && i<tanulok.size(); i++)
    {
        for (int j=0;!l && j<tanulok.size(); j++) {
            l=(tanulok[j][i] != 0);
            }

    }
    return l;
}

 

Mit cseréljek fel pontosan?

 

Posted

Ez így most négyzetes mátrixokra működik, és elvileg jó. De még nézegetem, késő van és már zokni vagyok. Ugyanezt meg tudod csinálni két függvénnyel, egyszerűen a külső ciklusban hívj meg egy függvényt, amiben a belső ciklus van. Én logikai függvénnyel csinálnám, amit értékül adnék az l-nek.

Posted

Ilyesmi lenne a cél?

 

#include<iostream>
#include<vector>

using namespace std;

int main()
{

    vector<vector<int>> tanulok;
    bool l=false;
    for(unsigned int i=0;i<3;i++)
    {
        tanulok.push_back(vector<int>());
        for (unsigned int j=0;j<4;j++)
        {
            //van nulla
            tanulok[i].push_back(j);
            //nincs nulla
            //tanulok[i].push_back(j+5);
        }
    }

    for(unsigned int i=0;!l && i<tanulok.size();i++)
    {
        for (unsigned int j=0;j<tanulok[i].size();j++)
        {
            if(l=(tanulok[i][j]==0)) break;
        }
        if(l) break;
    }

    if(l) cout<<"Van 0\n\n";
    else cout<<"Nincs 0\n\n";

    return 0;
}

Posted
Ez így most négyzetes mátrixokra mûködik, és elvileg jó. De még nézegetem, késõ van és már zokni vagyok. Ugyanezt meg tudod csinálni két függvénnyel, egyszerûen a külsõ ciklusban hívj meg egy függvényt, amiben a belsõ ciklus van. Én logikai függvénnyel csinálnám, amit értékül adnék az l-nek.

 

n x m-es mátrixra kell mûködjön a dolog.

Itt a teljes feladat.(kivéve a read.h tartalmát, mely a readint és readnat fv-k)

 

    Feladat:       Egy nyelviskolában n különbözõ nyelvet és mindegyiket m szinten oktatják.
                    Nyilvántartást vezetnek arról, hogy melyik nyelvbõl melyik szinten hány hallgató van.
                    Van-e olyan szint, amelyikbõl minden nyelven folyik oktatás? */


#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include "read.h"

using namespace std;

void Nyelveket_olvas(int n, const string &str, vector<string> &v);
void Hallgatok_szamat_olvas(const vector<string> &nyelv, const vector<string> &szint, vector<vector<int> > &a);

void Fajlbol_olvas(const string &fajlnev, vector<string> &nyelv, vector<string> &szint, vector<vector<int> > &tanulok);

bool Minden_nyelven (const vector < vector <int> > &tanulok);
bool Nem_nulla (int i, vector < vector <int> > tanulok);

bool Letszam (int k);
bool egykettoharom(int s);


int main(int argc, char *argv[])
{
    vector<vector<int> >  tanulok;
    vector<string>      szint;
    vector<string>      nyelv;

    // Beolvasás
    int s = 0;
    string fajlnev;
    if (argc<=1) {
        cout << "Valassza ki az adatbevitel modjat!\n";
        cout << "1 - adatok beolvasasa billentyuzetrol\n";
        cout << "2 - adatok beolvasasa fajlbol\n";
        cout << "3 - kilepes\n";
        s = ReadInt("Adatbevitel modja: ","1, 2 vagy 3 lehet", egykettoharom);
    }
    switch (s) {
        case 0:
            fajlnev = argv[1];
            Fajlbol_olvas(fajlnev, nyelv, szint, tanulok);
            break;
        case 1:
            int n = ReadNat("Hany nyelv van? ", "Termeszetes szamot kerek!");
            cout << "Adja meg a nyelveket:" << endl;
            Nyelveket_olvas(n, "nyelv: ", nyelv);
            cout << endl;

            int m = ReadNat("Hany szint van? ","Termeszetes szamot kerek!");
            cout << "Adja meg a szinteket:"<< endl;
            Nyelveket_olvas(m, "szint: ", szint);
            cout << endl;

            cout << "Adja meg a hallgatok szamat!"<< endl;
            Hallgatok_szamat_olvas(nyelv, szint, tanulok);
            cout << endl;
            break;
        case 2:
            cout << "Add meg a fajl nevet: ";
            cin >> fajlnev;
            Fajlbol_olvas(fajlnev, nyelv, szint, tanulok);
            break;
        case 3:
            exit(0);
    }


    if (Minden_nyelven(tanulok)) {

        cout << "Van olyan szint amibol minden nyelven folyik oktatas!";
    }
    else {
        cout << "Nincs olyan szint amibol minden nyelven folyik oktatas!";
    }


    cout<<endl;
    char ch;  cin>>ch;

    return 0;
}

//Feladat:     Ha egy szintet minden nyelven oktatnak akkor igaz  értékkel tér vissza.

bool Minden_nyelven (const vector < vector <int> > &tanulok)
{
    bool l = false;

    for ( int i=0; !l && i<tanulok.size(); i++)
    {
        l = (Nem_nulla(i, tanulok));

    }
    return l;
}

//Feladat:     Megnézi, hogy van-e olyan szint ahol a tanulok szama nem nulla.

bool Nem_nulla (int i, vector< vector <int> > tanulok)
{
    bool l = true;
    int j = 0;

    while ( l && j<tanulok[i].size() ){
        l = (tanulok[j][i] != 0);
        j++;

    }
    return l;
}


void Nyelveket_olvas(int n, const string &str, vector<string> &v)
{
    v.resize(n);
    for(int i=0; i<n; ++i)
    {
        cout << i+1 << "." << str;
        cin >> v[i];
    }
}


bool Letszam(int k)
{
    return k>=0 && k<=200;
}


void Hallgatok_szamat_olvas(const vector<string> &nyelv, const vector<string> &szint, vector<vector<int> > &a)
{
    a.resize((int)nyelv.size());
    for(int i=0; i<(int)nyelv.size(); ++i)
    {
        a[i].resize((int)szint.size());
        cout << nyelv[i] << " nyelven tanulok:\n";
        for(int j=0; j<(int)szint.size(); ++j)
        {
            cout << "\t" << szint[j] << ": ";
            a[i][j] = ReadInt(""," 0 es 200 kozotti Pozitiv szamot kerek!", Letszam);
        }
    }
}


void Fajlbol_olvas(const string &fajlnev, vector<string> &nyelv, vector<string> &szint, vector<vector<int> > &tanulok)
{
    ifstream f(fajlnev.c_str());
    if(f.fail()){
        cout << "Hibas fajlnev!\n";
        exit(1);
    }

    int n, m;
    f >> n >> m;
    string str;
    getline(f, str, '\n');

    cout << "\nNyelvek:\n";
    nyelv.resize(n);
    for(int i=0; i<n; ++i)
    {
        getline(f, nyelv[i], '\n');
        cout << nyelv[i] << endl;
    }

    cout << "\nSzintek:\n";
    szint.resize(m);
    for(int j=0; j<m; ++j)
    {
        f >> szint[j];
        cout << szint[j] << endl;
    }

    cout << "\nHallgatok szama:\n";
    tanulok.resize(n);
    for(int i=0; i<(int)nyelv.size(); ++i)
    {
        tanulok[i].resize(m);
        cout << nyelv[i] << " hallgatoi\n";
        for(int j=0; j<(int)szint.size(); ++j)
        {
            f >> tanulok[i][j];
            cout << "\t" << szint[j] << ": " << tanulok[i][j];

           
        }
        cout << endl;
    }

}


bool egykettoharom(int s)
{
    return s>=1 && s<=3;
}

Posted

Figyelj, megírtam, de kérlek, fogj egy papírt és rajzold le, hogy mit csinálsz. Egyetemen is úgy csinálják, a tanár is, nem szégyen. És hidd el, magadnak segítesz, ha betartod a konvenciókat, én is belezavarodtam a kódodba. Az i a sorok futóindexe, a j az oszlopoké. Az nxm-es mátrixnak n sora és m oszlopa van.

 

Ha nem volt még ilyen, akkor nyugodtan kiveheted belőle, a static kulcsszó azért szerepel ott, hogy ne a stacken, hanem a statikus területen jöjjön létre a változó, így csak a függvény első hívásakor számítódik ki. Amit nem értek, hogy a második függvényednél miért nem konstans referencia szerint vetted át a tömböt. Jelen esetben mindegy volt, de ilyeneken egy komolyabb programnál csúnyán el lehet csúszni. A futóindexet szintén konstansként célszerű. Mindig a legnagyobb megszorítással vedd át a paramétereket, mert annál kevesebb a hibalehetőség.

 

Remélem, hogy nem néztem be semmit. :)

 

bool Minden_nyelven (const std::vector < std::vector <int> > &tanulok) {
    int j = 0;
    bool l = false;
    static const int m = (int)tanulok[0].size();

    while (j < m && !l) {
        l = (Nem_nulla(j, tanulok));
        ++j;
    }

    return l;
}

bool Nem_nulla (const int j, const std::vector< std::vector <int> > &tanulok) {
    int i = 0;
    bool l = true;
    static const int n = (int)tanulok.size();
    
    while (i < n && l) {
        l = (tanulok[i][j] != 0);
        ++i;
    }

    return l;
}

 

@Botond

Igen, stringre nem működik, csak char-ra. Így ennyi a megoldás:

 

std::string Upper (const std::string &kicsi) {
    const int n = (int)kicsi.size();
    std::string nagy = "";

    for (int i=0; i < n; ++i) {
        nagy += toupper(kicsi[i]);
    }

    return nagy;
}

Posted
Figyelj, megírtam, de kérlek, fogj egy papírt és rajzold le, hogy mit csinálsz. Egyetemen is úgy csinálják, a tanár is, nem szégyen. És hidd el, magadnak segítesz, ha betartod a konvenciókat, én is belezavarodtam a kódodba. Az i a sorok futóindexe, a j az oszlopoké. Az nxm-es mátrixnak n sora és m oszlopa van.

 

Ha nem volt még ilyen, akkor nyugodtan kiveheted belőle, a static kulcsszó azért szerepel ott, hogy ne a stacken, hanem a statikus területen jöjjön létre a változó, így csak a függvény első hívásakor számítódik ki. Amit nem értek, hogy a második függvényednél miért nem konstans referencia szerint vetted át a tömböt. Jelen esetben mindegy volt, de ilyeneken egy komolyabb programnál csúnyán el lehet csúszni. A futóindexet szintén konstansként célszerű. Mindig a legnagyobb megszorítással vedd át a paramétereket, mert annál kevesebb a hibalehetőség.

 

 

Köszi így korrektül működik. Igazából a specifikációt megcsináltam ahogy kell. A helyes kódolással volt bajom, de így már érthető, hogy mit kellett volna máshogy csinálni.

Posted

Megmutatod a specifikációt? Mert ha jól írtad meg, akkor elég lett volna azt lekódolni. :)

Posted

A = (tanulók: Nnxm, l: L)

Ef =( tanulók = tanulók’ és n=n’ és m=m’)

Uf =( Ef és (l = i=1 SEARCH m-ig nemnulla(i) ))

ahol nemnulla(i) 1≤i≤m →N (minden) nemnulla(i)= " j=1 SEARCH n-ig tanulok [j]!=0

 

Na a logikai jeleket nem jeleníti meg szóval azt átírtam.

A kódolásban a tanulok[0].size -al volt bajom. Tehát, hogy az elsõ függvényben kellett volna használni és nem a nemnulla fv-ben.

 

Posted

Az utolsó sor így átírva nem egészen világos, de jónak tűnik, valami ilyesmi. Csakhogy a kódban mást csináltál. Nem véletlenül emeltem ki külön változóba, hogy mi n és m. Felcserélted, hogy mi felel meg a soroknak, és mi az oszlopoknak.

 

Egyébként mit csinál az előfeltételben n és m? Az állapottérben nem szerepelnek változóként, így semmi keresnivalójuk ott.

  • 3 weeks later...
Posted

Elkészítettem elsõ programom Linux alatt. CodeLite-ot használtam, a cpp fájl megírásához, de nem tudom most mit kezdjek vele, hogy elinduljon. Tudnátok segíteni? Még debug se megy.

Posted

Megírni elég lett volna használnod az mcedit-et.

Fordításhoz g++ kellene (sudo apt-get install g++). Ezután már terminal-ból tudod fordítani.

 

g++ -o prg prg_forras.cpp

 

A paraméterek listájában nem vagyok teljesen biztos, nézz utána!

Posted

Találtam egy Geany nevű szerkesztőt. Na ez le is fordítja. Előállít egy .o kiterjesztésű fájlt. De ezt nem tudom futtatni szintén. :S

Megpróbáltam a parancssoros verziót is, de azt írja nem találja a fájlt. Hova kell menteni a forrást, hogy megtalálja?

Posted

A .o csak az object, azt még linkelni is kellene.

Konzolban ott kell kiadni a parancsot, ahol a cpp-d van, vagy a paraméterlistában kell megadni a teljes útvonalat..

  • 2 weeks later...
BearVsMan
Posted

Lenne egy olyan kérdésem, hogy hogyan tudnám megvalósítani c++-ban a deltoidok típusát az átlóik hosszával és azzal az aránnyal ami megmutatja, hogy hol metszi az egyik átló a másikat?

Össz vissz 2 órán foglalkoztunk az osztályokkal és nem sok mindent vágok belőle. Diagonális mátrix meg polinom lekódolásahoz van alapom, de ezzel most akadályba ütköztem.

Posted

Csak találnod kell egy reprezentációt. Ehhez nem is kell osztály, elég egy rekord, hiszen nincsenek metódusok, csak adattagok. Eltárolsz két egész számot, ami a két átló, illetve egy lebegõpontosat, ami az arány.

BearVsMan
Posted

A probléma az, hogy muszáj osztállyal megcsinálni. Aztán meg kell mondani az oldalait szögeit stb..

Köszi az instrukciókat. Rajta vagyok az ügyön. Csak szorít a határidő meg a zh-k :(

Posted

Akkor lesz egy osztályod metódusok nélkül. :lol: Bár az oldalak, szögek kiszámítása nyilván az lesz. Ha beviszed ezt a három adattagot, onnantól elemi matek az egész.

  • 2 weeks later...
Posted

Na ez a feladat nekem bizony kimaradt XD

Posted

Akkor itt az ideje pótolni. :) Pár szinusz és koszinusz tétel az egész.

Posted

Á nem azzal van baj, hanem az osztály-al. Nem vágom ezt az részt. Megcisnálni egy deltoidot a 2 atlo meg a felezesi aranyuk segítségével stb..

 

osztály-al? Pfff, nemcsak azzal van itt gond... :(

Posted

class deltoid
{
private:
    int oldal1;
    int oldal2;
    float arany;
public:
    deltoid(int o1, int o2, float a) : oldal1(o1), oldal2(o2), arany(a) {}
    ...
};

Nem értem, mi a gond.

Posted

Majd utánanézek, hogy működik és megoldom.

Posted

Megkérdezhetem, hogy ki a tanárod? :pislog:

Posted

Meg. Pap Gábor Sándorné. Szerintem az egyik legjobb, fõleg Kõhegyi után.

Igazság szerint nekem az a 2 óra amit erre szántunk nem volt elég. Most meg nincs rá idõm, hogy foglakozzak már vele. Az elkövetkezendõ 2 hétben elég sok tennivalóm lesz :/

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...