1. gyakorlat - megoldások
1. feladat. A +, -, *, / és % operátorok melyikének nem állhat egyik oldalán double, míg a másik oldalán int
típusú változó?
Megoldás:
Ha az operátorok egyik oldalán int, másik oldalán double típusú változó áll, akkor a fordító az int típusú változót double-é konvertálja, és
a lebegőpontos értékek közt végzi el a műveletet.
A % operátor segítségével maradékos osztást végezhetünk, ennek csak egész operandusok esetén van értelme, így annak mindkét oldalán egész típusú változó kell álljon.
2. feladat. Mi lesz a ’3’==3 kifejezés értéke és miért?
Megoldás:
A fenti kifejezés a '3' karakter
kódját hasonlítja össze a 3 értékkel. Ezek nem egyeznek meg, így a kifejezés értéke 0, ami a logikai
hamisnak felel meg.
3. feladat. Mit fog kiírni a képernyőre a következő program? Próbáljuk meg meghatározni először a program
futtatása nélkül! Magyarázzuk meg az eredményt.
#include<iostream>
using namespace std;
int main() {
int a, b;
a = 5;
b = 10;
cout << (a == b) << endl;
cout << (a = b) << endl;
cout << (a == b) << endl;
return 0;
}
Megoldás:
A program a 0, 10, 1 számokat írja ki ebben a sorrendben. Az első cout << (a == b) << endl; parancs az a és b változók összehasonlításának eredményét írja ki, mivel ezek ekkor nem egyenlők, így az összehasonlítás
eredménye 0 (hamis).
Az ezt követő cout << (a = b) << endl; parancs a b változó értékét beírja az a változóba, az értékadás pedig visszatér egy a változóra mutató referenciával, így tehát az a változó új értékét, vagyis a 10-et írja
ki a program. Végül a második cout << (a == b) << endl; parancs már egyenlő értékeket hasonlít össze, hiszen az a változónak előtte értékül adtuk a b változó értékét, így az összehasonlítás eredménye
1 (igaz), ez tehát a harmadik kiírt szám.
4. feladat. Írjunk programot, amely kiírja 1-től 100-ig a páros számokat. Valósítsuk meg a feladatot a printf
függvény ill. a cout objektum segítségével is.
Megoldás:
Megvalósítás while ciklus és printf segítségével:
#include<stdio.h>
int main() {
int i = 2;
while(i<=100) {
printf("%d\n", i);
i += 2;
}
return 0;
}
Megvalósítás for ciklus és cout segítségével:
#include<iostream>
using namespace std;
int main() {
for (int i = 2; i <= 100; i += 2) {
cout << i << endl;
}
return 0;
}
5. feladat. Írjunk programot, ami a felhasználótól egy ciklusban egész számokat kér be addig, amíg 0 értéket nem
kap, 0 érték esetén pedig kiírja a képernyőre a kapott nemnulla számok átlagát. Valósítsuk meg a
feladatot a scanf_s függvény ill. a cin objektum segítségével is.
Megoldás:
Megvalósítás printf és scanf_s segítségével:
#include<stdio.h>
int main() {
int i = 0;
int n = -1;
int sum = 0;
do {
printf("Adjon meg egy 0-tol kulonbozo egesz szamot, vagy a program befejezesehez adja meg a 0 erteket: ");
scanf_s("%d",&i);
sum += i;
++n;
} while (i != 0);
if (n > 0) {
double atlag = sum;
atlag /= n;
printf("A megadott szamok atlaga: %f\n", atlag);
}
else {
printf("Nem adott meg egy 0-tol kulonbozo szamot sem.\n");
}
return 0;
}
Megvalósítás cout és cin segítségével:
#include<iostream>
using namespace std;
int main() {
int i = 0;
int n = -1;
int sum = 0;
do {
cout << "Adjon meg egy 0-tol kulonbozo egesz szamot, vagy a program befejezesehez adja meg a 0 erteket: ";
cin >> i;
sum += i;
++n;
} while (i != 0);
if (n > 0) {
double atlag = sum;
atlag /= n;
cout << "A megadott szamok atlaga: " << atlag << endl;
}
else {
cout << "Nem adott meg egy 0-tol kulonbozo szamot sem." << endl;
}
return 0;
}
6. feladat. Írjunk függvényt, amely visszaadja a bemeneti egész szám abszolút értékét.
Megoldás:
int absval(int a) {
return a < 0 ? -a : a;
}
7. feladat. Írjunk függvényt, amely bekéri két darab 2 dimenziós vektor koordinátáit, és visszaadja az általuk
feszített paralelogramma területét. A függvénynek legyen négy double típusú paramétere, az első ill.
a második vektor x és y koordinátái, és térjen vissza a kívánt eredménnyel.
Megoldás:
#include <cmath>
double parallelogram_area(double x1, double y1, double x2, double y2) {
return fabs(x1 * y2 - y1 * x2);
}
8. feladat. Írjunk függvényt, amely visszaadja egy paraméterül kapott egész szám négyzetét és köbét is.
Megoldás:
void square_cube(int a, int& square, int& cube) {
square = a * a;
cube = square * a;
}
9. feladat. Írjunk függvényt, amely paraméterként kér két long típusú változót, és megcseréli az értéküket.
Megoldás:
void swap(long& a, long& b) {
long temp = a;
a = b;
b = temp;
}
10.feladat. A következő kód feladata a kapott egész szám összes prímosztójának kiírása. Van benne 2 logikai
hiba. Mik ezek? Javítsuk ki a kódot.
#include<iostream>
using namespace std;
void prim(int n) {
for(int i = 2; i < n; i++) {
if(n % i == 0) {
cout << false;
}
}
cout << true;
}
void osztok(int n) {
for(int i = 2; i <= n; i++) {
if(prim(n)) {
cout << i << " ";
}
}
}
int main() {
int n;
cin >> n;
osztok(n);
return 0;
}
Megoldás: (a hibák a kommentekben)
#include<iostream>
using namespace std;
bool prim(int n) {
if (n <= 1) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false; // már nem csak kiírjuk az eredményt, hanem ezt adja vissza a függvény
}
}
return true;
}
void osztok(int n) {
for (int i = 2; i <= n; i++) {
if ((n % i == 0) && prim(i)) { // nem az n-t kell vizsgálni, hogy prím-e, hanem a lehetséges osztókat, i-ket
cout << i << " ";
}
}
}
int main() {
int n;
cin >> n;
osztok(n);
return 0;
}