Cpp tehtäviä syventävät

Mureakuha

Loikkaa: valikkoon, hakuun

Sisällysluettelo

Ohjelma 1 - Funktiot

Tämän ohjelman pitäisi laskea annettujen numeroiden summa sekä näyttää suurin ja pienin luku. Kaikki ei kuitenkaan mene oikein. Korjaa virheet.

#include <iostream.h>
 
void main()
{
 
    int numero=0, i=0, summa=0, maksimi=0, minimi=0;
 
    cout << "\n**************************************************\n";
    cout << " Ohjelma laskee annettujen numeroiden summan sekä\n";
    cout << " näyttää suurimman ja pienimman annetun luvun.\n";
    cout << " Anna numeroita ja lopeta ohjelma antamalla 0.";
    cout << "\n**************************************************\n";
 
    numero = LueNumero();
    maksimi = minimi = numero;/p> 
 
    do
    {
 
    maksimi = EtsiIsoin (int numero, int maksimi);
    minimi = EtsiPienin (int numero, int minimi);
    summa += numero;
    i++;
 
    cout << "Numero\tMaksimi\tMinimi\tSumma\ti\n";
    cout << numero << "\t" << maksimi << "\t" << minimi << "\t" << summa << "\t" << i << "\n";
 
    numero = LueNumero();
 
    } while (numero != 0);
 
}
 
int Luenumero()
{
 
    int luku;
    cout << "\nAnna uusi numero: ";
    cin >> luku;
    return luku;
 
}
 
int EtsiIsoin (int numero, int maksimi)
{
 
    if (numero >= maksimi) return numero;
    else return maksimi;
 
}
 
int EtsiPienin (int numero, int minimi)
{
 
    if (numero <= minimi) return numero;
    else return minimi;
 
}

Ohjelma 2 - Funktiot

Tämä ohjelma on toteutettu usealla funktiolla. Siinä kysytään käyttäjältä haluttua laskua ja tulostetaan vastaus. Ohjelma tosin vaatii pieniä korjauksia.

#include <iostream.h>
#define PII 3.14;
#define SADE 2.25;
double Menu();
double Kaari(double);
double Pintaala(double);
double Tilavuus(double);
void Tulosta(int, double);
 
void main()
{
 
    int lasku;
    lasku = Menu();
    Tulosta(lasku, SADE);
 
}
 
int Menu()
{
 
    static int lasku;
    cout << "\n\n-----------------------------";
    cout << "\n1\t = \tTilavuus";
    cout << "\n2\t = \tPinta-ala";
    cout << "\n3\t = \tKaaren pituus";
    cout << "\n-----------------------------";
    cout << "\n\nValitse lasku: ";
    cin >> lasku;
    return lasku;
 
}
 
void Tulosta(int n, double lasku)
{
 
    switch (n)
    {
 
        case 1: cout << Tilavuus(r) << "\n\n";
            break;
        case 2: cout << Pintaala(r) << "\n\n";
            break;
        case 3: cout << Kaari(r) << "\n\n";
            break;
 
    }
 
}
 
double Tilavuus(double r)
{
    return 4/3 * PII * r * r * r;
}
 
double Pintaala(double r)
{
    return PII * r * r;
}
 
double Kaari(double r)
{
    return 2 * PII * r;
}

Ohjelma 3 - Funktiot

Seuraavassa pitäisi tulostaa 8 saraketta ja 19 riviä kooltaan oleva taulukko johon tulostetaan luvut 0-152. Ohjelma kysyy käyttäjältä luvun ja etsii sen sijainnin sarake- ja rivinumerot. Sepä ei kuitenkaan toimi. Korjaa.

#include <iostream.h>
void EtsiLuku(int numero, int *sarake, int *rivi);
int luku[18][7];
 
void main()
{
 
    int x, y, i = 0, numero, sarake, rivi;
    cout << "\t0\t1\t2\t3\t4\t5\t6\t7";
    cout << "\n\t-\t-\t-\t-\t-\t-\t-\t-\n\n";
 
    for (y = 0; y <= 18; y++)
    {
 
        cout << y << " |\t";
        for (x = 0; x <= 7; x++)
        {
 
            i++;
            luku[y][x] = i;
            cout << luku[y][x] << "\t";
 
        }
 
        cout << "\n";
 
    }
 
    cout << "\nAnna etsittävä numero: ";
    cin >> numero;
 
    EtsiLuku(numero, &sarake, &rivi);
    cout << "Sarake: " << &sarake << " Rivi: " << &rivi;
 
}
 
void EtsiLuku(int numero, int *sarake, int *rivi)
{
 
    int y, x;
    for (y = 0; y <= 18; y++)
    {
 
        for (x = 0; x <= 7; x++)
        {
 
            if (luku[y][x] == numero)
            {
 
                sarake = x;
                rivi = y;
 
            }
 
        }
 
    }
 
}

Ohjelma 4 - Dynaamisuus

Tämän ohjelman tulee laskea dynaamiseen taulukkoon kakkosen potesseja käyttäjän haluama määrä ja tulostaa ne lopuksi ruudelle. Ohjelma on kuitenkin virheellinen.

#include <iostream.h>
#include <math.h>
 
void main()
{
 
    int a, i;
 
    cout << "\nKuinka monta kakkosen potenssia lasketaan?: ";
    cin >> a;
 
    double* taulu;
    *taulu = new double[a];
 
    for (i = 0; i < a; i++)
        taulu[i] = pow(2, a);
 
    for (i = 0; i < a; i++)
        cout << "2 ^ " << i << " = " << taulu[i] << "\n";
 
    delete taulu[a];
 
}

Ohjelma 5 - Dynaamisuus

Tämän ohjelman tulee kopioida dynaamiseen merkkijonoon käyttäjän syöttämä jono ja tulostaa se muiden tietojen ohella. Ohjelma kuitenkin kaatuu suoritusvaiheessa, eikä muutenkaan anna oikeita tuloksia. Mikä ohjelmassa on väärin?

#include <iostream.h>
#include <string.h>
 
void main()
{
 
    char temp[255];
 
    cout << "\nAnna merkkijono: ";
    cin >> temp;
 
    char *jono;
    jono = new char[strlen(temp) + 1];
 
    strcpy(jono, temp);
 
    cout << "\nAlkuperäinen jono: " << temp;
    cout << "\nAlkuräisen jonon merkkien määrä: " << strlen(temp);
    cout << "\nAlkuräisen jonon tilanvaraus: " << sizeof temp;
    cout << "\n";
    cout << "\nDynaaminen jono: " << jono;
    cout << "\nDynaamisen jonon merkkien määrä: " << strlen(jono);
    cout << "\nDynaamisen jonon tilanvaraus: " << sizeof jono;
    cout << "\n\n";
 
    jono = "NULL";
    delete[] &temp;
    delete[] jono;
 
}

Ohjelma 6 - Dynaamisuus

Tässä ohjelmassa testataan kuinka suuren taulukon järjestelmästä pystyy vielä varaamaan. Ohjelman on tarkoitus pyöriä do-lauseessa, tulostaa tietoja varauksen onnistumisesta kunnes tila loppuu kesken ja poistua sen jälkeen. Kääntäjä antaa kuitenkin harvinaisen paljon virheitä.

#include <iostream.h>
 
void main()
{
    long alkiot = 10;
 
    do
    {
 
        cout << "Varataan " << alkiot << " alkiota... ";
 
        double *taulu = new taulu[alkiot];
 
        if (taulu != NULL)
        {
            cout << "\nVaraus onnistui alueelle: " << &taulu << " - " << &taulu[alkiot];
            cout << " eli " << &taulu[alkiot] - &taulu[0] << " alkiota.\n\n";
            alkiot *= 10;
        }
        else
            cout << "VARAUS EI ONNISTUNUT!";
 
    } while (taulu != NULL);
 
    cout << "\n\n";
 
}

Ohjelma 7 - Tiedostot

Tämä ohjelma tallentaa ruokareseptejä levylle. Ohjelma kysyy aineen ja määrän ja kirjoittaa ne tiedostoon reseptit.txt. Ohjelma ei kuitenkaan käyttäydy oikein ja vaatii korjauksia.

#include <string.h>
#include <fstream.h>
 
void main()
{
 
    char aine[10];
    long maara;
 
    cout << "Ohjelma tallentaa ruokareseptejä.\n";
    cout << "Syötä aine ja tarvittava määrä.\n";
    cout << "Lopeta syöttäminen pisteellä.\n\n";
 
    do
    {
 
        cout << "Anna aine: ";
        cin >> aine;
 
        ofstream tallennus;
        if (strcmp(aine, ".") != 0)
        {
            cout << "Anna määrä: ";
            cin >> maara;
 
            tallennus.open("reseptit.txt", ios::out | ios::app);
            tallennus << aine << " " << maara << "\n";
        }
        tallennus.close();
 
    } while (strcmp(aine, ".") != 0);
 
    ifstream luku;
    luku.open("reseptit", ios::in);
    while (luku.eof == 0)
    {
 
        luku >> aine;
        luku >> maara;
        cout << "Aine: " << aine << "\tMäärä: " << maara << "\n";
 
    }
    luku.close();
 
    cout << "\n\n";
 
}

Ohjelma 8 - Tiedostot

Niinkin yksinkertaiselta kuulostava asia kuin tiedoston olemassaolon tarkistaminen ei ole helppo asia koodata. Tämä ohjelma tarkistaa onko tiedosto olemassa. Jos ei, kysytään halutaanko se luoda ja jos on, kysytään halutaanko se tyhjentää. Tai näin sen pitäisi toimia.

#include <fstream.h>
 
void main()
{
 
    char nimi[20];
    cout << "Ohjelma tallentaa nimiä tiedostoon.\n";
    cout << "Anna lisättävä nimi: ";
    cin >> nimi;
 
    ofstream tallennus;
    tallennus.open("testi.txt");
 
    if (tallennus.is_open() == false)
    {
 
        char vastaus;
        cout << "Tiedostoa ei ole olemassa. Haluatko luoda sen (k/e)? ";
        cin >> vastaus;
 
        if (vastaus == 'k')
        {
 
            ofstream uusitiedosto;
 
            if (uusitiedosto.is_open() == false)
                cout << "Tiedoston avaus ei onnistunut!";
            else
                cout << "Tiedosto on luotu ja nimi tallennettu.\n";
 
            uusitiedosto << nimi << "\n";
            uusitiedosto.close();
 
        }
        else
        {
 
            cout << "Tiedostoa ei luotu eikä nimeä tallennettu.\n";
 
        }
 
    }
    else
    {
 
        char vastaus;
        cout << "Tiedosto on olemassa. Haluatko tyhjentää sen (k/e)? ";
        cin >> vastaus;
 
        if (vastaus == 'k')
        {
 
            ofstream tyhjennatiedosto;
            tyhjennatiedosto.open("testi.txt");
 
            if (tyhjennatiedosto.is_open() == false)
                cout << "Tiedoston avaus ei onnistunut!";
            else
                cout << "Tiedosto on tyhjennetty muusta tiedosta.\n";
 
            tyhjennatiedosto.close();
            tyhjennatiedosto << nimi << "\n";
 
        }
        else
        {
 
            cout << "Tiedostoa ei tyhjennetty, joten nimi lisättiin loppun.\n";
            tallennus << nimi << "\n";
 
        }
 
    }
 
    tallennus.close();
 
    cout << "\n\n";
 
}
Tämän dokumentin kopiointi, levittäminen sekä muokkaaminen on sallittua GNU Free Documentation Licensen version 1.2 tai uudemman Free Software Foundationin julkaiseman version mukaisesti, ilman muuttumattomuuslauseketta tai kansitekstejä. Tätä koskee vastuuvapaus.
Kopio lisenssistä (englanniksi) löytyy täältä.


Alkuperäinen (c) Petteri Hämäläinen

Henkilökohtaiset työkalut