User Tools

Site Tools


dydaktyka:cprog:2016:revision_1-solutions

This is an old revision of the document!


Zadania powtórkowe (1) - rozwiązania

Laboratorium: Zadania powtórkowe (1)

Zadanie SQEQ-FUN

sqeq-fun.c
#include <stdio.h>
#include <stdlib.h>
 
 int ile_pierwiastkow(int a, int b, int c) {
    int delta = b * b - 4 * a * c;
 
    if (delta < 0) {
        return 0;
    } else if (delta == 0) {
        return 1;
    } else {
        return 2;
    }
 }
 
int main()
{
    double a, b, c;
 
    printf("Podaj wspolczynniki a, b i c: ");
    scanf("%lf %lf %lf", &a, &b, &c);
 
    printf("Ilosc pierwiastkow: %d\n", ile_pierwiastkow(a, b, c));
 
    return 0;
}

Zadanie IS-SQUARE

Najbardziej “naiwny” sposób rozwiązania zadania polega na sprawdzeniu po kolei liczb $i = 1, 2, \ldots, n$ i sprawdzeniu, czy któraś z nich podniesiona do kwadratu da $n$:

is-square_1.c
#include <stdio.h>
#include <stdlib.h>
 
 int czy_kwadrat(int n) {
     int i;
 
     for (i = 1; i <= n; i = i + 1) {
        if (i*i == n) {
            return 1;
        }
     }
 
     return 0;
}
 
int main()
{
    int n;
 
    n = 4;
    printf("Czy %d jest kwadratem pewnej liczby? - %d\n", n, czy_kwadrat(n));
 
    n = 5;
    printf("Czy %d jest kwadratem pewnej liczby? - %d\n", n, czy_kwadrat(n));
 
    return 0;
}

Można tę pętlę usprawnić poprzez zmianę warunku pętli na i*i ⇐ n.

Zadanie można również rozwiązać wykorzystując mechanizm obcięcia – podczas przypisywania wartości niecałkowitej do zmiennej typu całkowitego część ułamkowa ostaje obcięta (tj. zaokrąglona w dół). Innymi słowy sprawdzamy, czy $\sqrt{n} = \left \lfloor \sqrt{n} \right \rfloor$, co będzie prawdziwe tylko dla całkowitego $\sqrt{n}$:

is-square_2.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int czy_kwadrat(int n) {
    int t = sqrt(n);   // obciecie
 
    return t == sqrt(n);
}
 
int main() {
    int n;
 
    n = 4;
    printf("Czy %d jest kwadratem pewnej liczby? - %d\n", n, czy_kwadrat(n));
 
    n = 5;
    printf("Czy %d jest kwadratem pewnej liczby? - %d\n", n, czy_kwadrat(n));
 
    return 0;
}

Zadanie MEAN

mean.c
#include <stdio.h>
#include <stdlib.h>
 
 double srednia(double a, double b, double c) {
     return (a + b + c) / 3;
}
 
int main()
{
    double p = 2;
    double q = 4;
    double r = 9;
 
    printf("Srednia z %f, %f i %f wynosi %f\n", p, q, r, srednia(p, q, r));
 
    return 0;
}

Zadanie EXPRESSION

expression.c
#include <stdio.h>
#include <stdlib.h>
 
double oblicz(double x)
{
    return (x * x * x  + 3 * x) / (x * x + 6);
}
 
int main()
{
    double x = 2.0;
 
    printf("y(%f) = %f\n", x, oblicz(x));
 
    return 0;
}

Zadanie IS-TRIANGLE

is-triangle.c
#include <stdio.h>
#include <stdlib.h>
 
void czy_zbuduje_trojkat(int a, int b, int c)
{
    printf("Z patykow dlugosci %d, %d i %d ", a, b, c);
    if (a < b + c && b < a + c && c < a + b) {
        printf(" da sie zbudowac trojkat.\n");
    } else {
        printf(" nie da sie zbudowac trojkata.\n");
    }
}
 
int main()
{
    czy_zbuduje_trojkat(1, 1, 2);
    czy_zbuduje_trojkat(3, 4, 5);
 
    return 0;
}

Zadanie FACT-FUN

fact-fun.c
#include <stdio.h>
#include <stdlib.h>
 
int silnia(int n)
{
    int wynik = 1;
 
    while (n > 1) {
        wynik = wynik * n;
        n = n - 1;
    }
 
    return wynik;
}
 
int main()
{
    int n;
 
    n = 3;
    printf("%d! = %d\n", n, silnia(n));
 
    n = 5;
    printf("%d! = %d\n", n, silnia(n));
 
    return 0;
}

Zadanie RANGE-SUM

range-sum.c
#include <stdio.h>
#include <stdlib.h>
 
int suma_przedzialu(int a, int b)
{
    int suma = 0;
    int i;
 
    for (i = a; i <= b; i = i + 1) {
        suma = suma + i;
    }
 
    return suma;
}
 
int main()
{
    int a = 3;
    int b = 5;
 
    printf("SUMA[%d, %d] = %d\n", a, b, suma_przedzialu(a, b));
 
    return 0;
}

Zadanie DISP-BOX

disp-box.c
#include <stdio.h>
#include <stdlib.h>
 
void wypisz_wzor(int ilosc_wierszy, int ilosc_znakow_w_wierszu)
{
    int curRow;   // indeks aktualnie wyswietlanego wiersza
    int curChar;  // indeks aktualnie wyswietlanego znaku w wierszu
 
    for (curRow = 1; curRow <= ilosc_wierszy; curRow = curRow + 1) {
        for (curChar = 1; curChar <= ilosc_znakow_w_wierszu; curChar = curChar + 1) {
            printf("$");
        }
 
        printf("\n");
    }
}
 
int main()
{
    wypisz_wzor(1, 6);
    printf("\n");
    wypisz_wzor(3, 5);
 
    return 0;
}
dydaktyka/cprog/2016/revision_1-solutions.1478241644.txt.gz · Last modified: 2020/03/25 11:46 (external edit)