2 Programy - pomoc (litery duże -> małe / małe -> duże oraz struktury danych) [C++]

0

Witam, chciałbym się doradzić co do dwóch zadań

  1. Program polega na tym, że odwraca i przepisuje od tyłu słowo/zdanie, który wpiszemy. Chciałbym jednak, żeby również duże litery zamieniały się na małe i na odwrót. Wiem, że tutaj trzeba zastosować toupper oraz tolower, ale coś mi nie wychodzi.
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    string wyraz;
    cout << "Podaj wyraz: ";
    getline(cin, wyraz);

    int dlugosc = wyraz.length();

    for (int i=dlugosc-1; i>=0; i--)
    {
        //cout << tolower(wyraz[i]);
        cout << (wyraz[i]);
    }
    return 0;
}

2.Napisz prosty program do przetwarzania danych uczniów w szkole. W tym celu stwórz strukturę uczen, która zawierać będzie pola: imię, nazwisko, klasa (np. „3c”), oceny semestralne dla maks. 20 przedmiotów (dla uproszczenia przyjmijmy, że przedmioty identyfikujemy po numerze, a nie po nazwie). Następnie napisz trzy funkcje pracujące na tej strukturze:
a) funkcję do wprowadzania danych osobowych nowego ucznia (funkcja ma przyjąć, imię, nazwisko, klasę i zwrócić strukturę danych ucznia);
b) funkcje do wprowadzania oceny z przedmiotu o zadanym numerze dla danego ucznia (funkcja ma przyjąć referencję do danych ucznia, ocenę i numer przedmiotu);
c) funkcję do liczenia średniej ocen dla wskazanego ucznia (funkcja ma przyjąć referencję do danych ucznia i zwrócić średnią jego ocen).

Pierwszą część tego zadania chyba wykonałem poprawnie, ale nie wiem co dokładnie dalej zrobić tutaj. Również prosiłbym o pomoc przy tym.

#include <iostream>
#include <cstdio>
#include <cstring> 

using namespace std;

struct uczen
	{
	char imie[20];
	char nazwisko[40];
	char klasa[2];
	
	int ocenyprzedmioty[20];
	};


struct uczen wprowadzanie_nowego_ucznia(char* imie,char* nazwisko,char* klasa)  //przyjmuje dane ucznia do przygotowania danych osobwych
{
	uczen temp;
	strcpy(temp.imie,imie);
	strcpy(temp.nazwisko,nazwisko);
	strcpy(temp.klasa,klasa);
	return temp;
}

	int main()
	{
		uczen klasa[10];
		uczen wprowadzanie_nowego_ucznia;
		return 0;
	}

z góry dziękuję za pomoc

0
  1. Przydatne funkcje do pierwszego zadania: tolower, toupper, islower, isupper, opcjonalnie także transform.
  2. Dlaczego w pierwszym programie używasz normalnie stringa, a w drugim męczysz się z tablicami znakowymi?
  3. Jaki konkretnie masz problem w b) i w c)? Nie umiesz się dobrać do pól w już istniejącej strukturze?

(swoją drogą, dlaczego w zadaniu drugim używa się struktur, a nie klas, to pewnie tylko układający zadanie wie…)

EDYCJA:
Umknęło mi to za pierwszym razem, ale skąd Ci się wzięła linijka uczen wprowadzanie_nowego_ucznia;? Co chcesz, żeby to robiło? Bo masz kolizję nazw, nie mam pojęcia po co wprowadzoną.

0

Z zadaniem 1 już sobie poradziłem, dzięki
W 1 zadaniu używałem stringa, ponieważ to było jedno z pierwszych zadań, który wykonywałem (tablice dopiero później poznałem)
Co do podpunktu b) i c), to najgorzej mam żeby to zacząć, później myślę nie będę miał problemów

Co do tej linijki, to właśnie teraz tak się zastanawiam i rzeczywiście to tam nie pasuje i chyba wpisałem to tam z rozpędu

0

Mam problem z jeszcze 2 zadaniami (rozwiązane są tak do połowy, później nie wiem jak zacząć), więc też prosiłbym o pomoc
**

  1. Napisz program wypełniający globalną tablicę o rozmiarze 5x5 kolejnymi liczbami rzeczywistymi: 1.0,1.0+k,1.0+2k, …, gdzie k jest krokiem zadanym przez użytkownika z klawiatury. Następnie:
    a) Napisz funkcję wyświetlającą wybraną kolumnę tablicy. W razie niesprecyzowania numeru kolumny, funkcja powinna wyświetlić ostatnią kolumnę.
    b) Napisz funkcje, która zwracać będzie do programu głównego średnią arytmetyczną wyrazów w wybranym wierszu.**

Pierwszą część zadania zrobiłem, ale z podpunktami mam problem

#include<iostream>
#include<cmath>


using namespace std;


void wyswietl_wiersz(int);
int  najwieksza(int w = 0);
void najwieksza(const int,int &,int &);
const int n = 5;
double tab[n][n];



int main(void)
{
	double w, k, poczatek;
	poczatek = 0;
	int i, j;
	cout << "podaj k: ";
	cin >> k;
	for (i=0; i<n; i++)
	{
			for(j=0; j<n; j++)
			{
			w = 1 + poczatek;
			tab[i][j] = w;
			cout << tab[i][j] << "\t";

			k=k++;
			poczatek+=k;
			}
			cout << endl;
	}

return 0;
}

2. Napisz program wypełniający globalną tablicę o rozmiarze 7x7 liczbami losowymi z przedziału [-500,1000]. Następnie dopisz zestaw dwóch funkcji o identycznej nazwie, z których:
-pierwsza powinna przyjmować współrzędne wybranego elementu tablicy oraz wartość rzeczy-wistą. Podana wartość rzeczywista powinna być podstawiona w miejsce, w tablicy wskazane współrzędnymi, a poprzednia wartość tego elementu tablicy powinna być zwrócona do programu głównego przez wartość (przez return).
-druga powinna przyjmować wartość całkowitą, dla której funkcja powinna znaleźć najbliższy pod względem wartości element tablicy i zwrócić go do programu głównego wraz z jego współrzędnymi (zwróć uwagę, że przez return można zwrócić tylko 1 wartość).

Również nie wiem jak ruszyć podpunkty

#include <iostream>
#include <ctime>
#include <cstdlib> //srand

using namespace std;

const int n = 7; //liczba elementow tablicy musi byc stala, wiec const
int tablica[n][n];

int main()
{
    srand(time(NULL)); //punkt startowy generatora pseudolosowego

    for(int i=1; i<=n; i++) //robienie 1 wymiaru tablicy
    {
        for(int j=1; j<=n; j++) //robienie 2 wymiaru tablicy
        {
            tablica[i][j] = ((rand()%1501))-500;     //zwracanie pseudolosowej liczby calkowitej. calkowity przedzial liczb: 1501. Pierwsza losowana liczba: -500
        }
    }

    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            cout << tablica[i][j] << "\t"; //wyswietlamy tablice, ktore zapisalismy wyzej
        }
         cout << endl;
    }
}

1

Nie wiem jak to napisać więc podpowiedź do 1a i 2b w formie kodu:

#include<iostream>
#include<cmath>

using namespace std;

// strunktura przechowująca wiersz i kolumnę:
struct Indeks
{
	int wiersz;
	int kolumna;
};

void wyswietl_wiersz(int);
int  najwieksza(int w = 0);
void najwieksza(const int,int &,int &);
const int n = 5;
double tab[n][n];

// funkcja wyświetlająca zadaną kolumnę, domyślnie zostanie wyświetlona ostatnia kolumna:
void wyswietlKolumne(int numer = 5)
{
	for (int i = 0; i < n; i++)
		cout << tab[i][numer - 1] << "\n";
}
// funkcja do 1b będzie podobna, tylko będzie trzeba dodać zmienną przechowującą średnią i operować nie po wierszach tylko po kolumnach;

// funkcja znajdująca element z tablicy o wartości najbliższej podanej do funkcji (aby zwrócić indeks tablicy o podanym elemencie stworzyłem strukturę Indeks, wtedy return zwróci tylko jedną wartość a jednak przechowującą obie potrzebne wartości, coś jak matrioszka xD)
Indeks znajdzElement(int wartosc)
{
	Indeks p;
	int roznica = fabs(tab[0][0] - wartosc);
	p.wiersz = 0;
	p.kolumna = 0;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
		{
			if (fabs(tab[i][j] - wartosc) < roznica)
			{
				roznica = fabs(tab[i][j] - wartosc);
				p.wiersz = i;
				p.kolumna = j;
			}
		}
		
	return p;
}

int main(void)
{
    double w, k, poczatek;
    poczatek = 0;
    int i, j;
    cout << "podaj k: ";
    cin >> k;
    for (i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
        {
            w = 1 + poczatek;
            tab[i][j] = w;
            cout << tab[i][j] << "\t";

            k = k++;
            poczatek += k;
        }
        cout << endl;
    }
	
	int numer = 5;
	wyswietlKolumne();
	
	Indeks a = znajdzElement(12);
	cout << "polozenie: " << a.wiersz << " " << a.kolumna << " " << tab[a.wiersz][a.kolumna] << endl;

	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1