Програмирање 2/Блок 3
Пређи на навигацију
Пређи на претрагу
Комплексни бројеви
Написати програм у програмском језику C за рад са комплексним бројевима. Претпоставити да се комплексни бројеви у меморији рачунара чувају помоћу следеће структуре:
typedef struct complexNumber {
double real, imaginary;
} ComplexNumber;
Ова декларација се налази у фајлу са називом тyпе.х. Приликом реализације програма неопходно је укључити овај фајл свугде где се користи дати тип. Програм реализовати према следећим ставкама:
- Написати потпрограм ЦомплеxНумбер сум ( ЦомплеxНумбер а, ЦомплеxНумбер б ); који сабира два комплексна броја а и б и резултат враћа као повратну вредност функције.
- Написати потпрограм воид цоњугате ( ЦомплеxНумбер *а ); који коњугује комплексни број на који показује показивач а.
- Написати потпрограм воид wрите ( ЦомплеxНумбер а ); који исписује комплексни број а.
- Написати потпрограм инт исНумбер ( цхар *стринг ); који проверава да ли низ карактера на који показује показивач стринг представља валидан реалан број.
- Коришћењем претходно реализованих потпрограма написати главни програм који добија четири аргумената преко командне линије. Главни програм треба да провери да ли су проследјени аргументи валидни реални бројеви и уколико јесу да од прва два формира једна комплексан број, а од друга два други комплексни број. Након тога потребно је наћи и исписати суму два комплексна броја, као и коњугиоване вредности оригиналних комплексних бројева. Уколико аргументи не представљају валидне реалне бројеве потребно је прекинути извршавање програм са повратном вредношћу 0.
Прва функција
#include <stdio.h>
#include "types.h"
ComplexNumber sum ( ComplexNumber a, ComplexNumber b) {
ComplexNumber c;
c.real = a.real + b.real;
c.imaginary = a.imaginary + b.imaginary;
return c;
}
Друга функција
#include "types.h"
void conjugate ( ComplexNumber *a ) {
a->imaginary *= -1;
}
Трећа функција
#include <stdio.h>
#include "types.h"
void write ( ComplexNumber a ) {
char op = a.imaginary >= 0 ? '+' : '-';
a.imaginary *= (a.imaginary >= 0 ? 1 : -1);
printf("%.4f %c %.4fi", a.real, op, a.imaginary);
}
Четврта функција
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int isNumber ( char *string ) {
if (string == NULL) {
return 0;
}
int a;
double b;
return sscanf(string, "%*[+-]%lf%n", &b, &a) == 1 && a == strlen(string);
}
Пета функција
#include <stdio.h>
#include <stdlib.h>
#include "types.h"
#include <string.h>
int main(int argc, char** argv)
{
for(int i = 1; i < 5; i++)
if(!isNumber(argv[i]))
return 0;
ComplexNumber a, b, c;
a.real = atof(argv[1]);
a.imaginary = atof(argv[2]);
b.real = atof(argv[3]);
b.imaginary = atof(argv[4]);
c.real = a.real + b.real;
c.imaginary = a.imaginary + b.imaginary;
write(c);
putchar('\n');
conjugate(&a);
conjugate(&b);
write(a);
putchar('\n');
write(b);
return 0;
}
Листе
Саставити на језику C пакет функција за рад са једноструко уланчаним листама бројева. Елементи листе се чувају у меморији рачунара коришћењем следеће структуре:
тyпедеф струцт ноде {
int number;
struct node *next;
} Ноде;
Дата декларација се налази у датотеци тyпе.х коју је потребну укључити свигде где се користи дати тип. Пакет реализовати према следећим ставкама:
- Реализовати функцију Ноде* формЛист(); која чита бројеве са стандардног улаза и он њих формира листу тако што нове елементе убацује на крај листе. Читање се завршава када се преко стандардног улаза прочита нешто што није број. Функција као повратну вредност враћа показивач на почетак новоформиране листе.
- Реализовати функцију воид принтЛист(Ноде *хеад); која на стандардни излаз исписује садржај листе на чији први елемент показује показивач хеад.
- Реализовати функцију инт листСизе(Ноде *хеад); која као повратну вредност враћа број елемената листе на чији први елемент показује показивач хеад.
- Реализовати функцију Ноде* сеарцхФирст(Ноде *хеад, инт нумбер); која у листи на чији први елемент показује показивач хеад проналази прво појављивање броја нумбер и као повратну вредност враћа показивач на тај елемент.
- Реализовати функцију Ноде* сеарцхЛаст(Ноде *хеад, инт нумбер); која у листи на чији први елемент показује показивач хеад проналази последње појављивање броја нумбер и као повратну вредност враћа показивач на тај елемент.
- Реализовати функцију воид сортЛист(Ноде *хеад); која сортира листу на чији први елемент показује показивач хеад по неопадајућем поретку.
- Реализовати функцију воид деаллоцатеЛист(Ноде *хеад); која врши деалокацију меморије коју је заузела листа на чији први елемент показује показивач хеад.
- Реализовати функцију Ноде* инсертСортед(Ноде *хеад, инт нумбер); која у неопадајуће сортирану листу на чији први елемент показује показивач хеад убацује број нумбер, али тако да листа након тога остане сортирана. Функција као повратну вредност враћа показивач на измењену листу.
- Реализовати функцију Ноде* ремовеЕлементс(Ноде *хеад, инт нумбер); која из листе на чији први елемент показује показивач хеад избацује свако појављивање броја нумбер. Функција као повратну вредност враћа показивач на почетак измењене листе.
- Реализовати функцију Ноде* мергеЛистс(Ноде *хеад0, Ноде *хеад1); која спаја две неопадајуће сортиране листе на чије прве елементе показују показивачи хеад0 и хеад1 у нову неопадајуће сортирану листу. Функција као повратну вредност враћа показивач на први елемент нове листе.
- Коришћењем функције воид деаллоцатеЛист(Ноде *хеад);, која деалоцира простор који је заузела листа на чији први елемент показује показивач хеад, реализовати функцију воид ремовеДуплицатес(Ноде *хеад); која из листе на чији први елемент показује показивач хеад избацује све узастопне појаве истих елемената.
- Реализовати функцију Ноде* реверсеЛист(Ноде *хеад); која обрће листу на чији први елемент показује показивач хеад.
- Реализовати функцију Ноде* гетМиддле(Ноде *хеад); која враћа показивач на елемент који се налазе на средини листе на чији први елемент показује показивач хеад.
- Реализовати функцију Ноде* гетНтхФромЕнд(Ноде *хеад); која враћа показивач на Н-ти елемент од краја листе на чији први елемент показује показивач хеад.
Прва функција
#include <stdio.h>
#include <stdlib.h>
#include "type.h"
Node* formList ( ) {
int number;
Node* head = NULL, *tail = head;
while(scanf("%d", &number) == 1)
{
Node* tmp = malloc(sizeof(Node));
tmp->number = number;
if(!head)
head = tmp;
else
tail->next = tmp;
tail = tmp;
}
return head;
}
Друга функција
#include <stdio.h>
#include "type.h"
void printList ( Node *head ) {
while(head)
{
printf("%d ", head->number);
head = head->next;
}
}
Трећа функција
#include "type.h"
int listSize ( Node *head ) {
int size = 0;
while(head)
{
size++;
head = head->next;
}
return size;
}
Четврта функција
#include "type.h"
Node* searchFirst ( Node *head, int number ) {
while(head)
{
if(head->number == number)
{
break;
}
head = head->next;
}
return head;
}
Пета функција
#include "type.h"
#include <stdlib.h>
Node* searchLast ( Node *head, int number ) {
Node* prev = NULL;
while(head)
{
if(head->number == number)
prev = head;
head = head->next;
}
return prev;
}
Шеста функција
#include "type.h"
void sortList ( Node *head ) {
for(Node *f = head; f; f = f->next)
{
for(Node *s = f->next; s; s = s->next)
{
if(f->number > s->number)
{
int tmp = f->number;
f->number = s->number;
s->number = tmp;
}
}
}
}
Седма функција
#include <stdlib.h>
#include "type.h"
void deallocateList ( Node *head ) {
while(head)
{
Node* old = head;
head = head->next;
free(old);
}
}
Осма функција
#include <stdlib.h>
#include "type.h"
Node* insertSorted ( Node *head, int number ) {
Node *prev = NULL, *curr = head;
while(curr && curr->number<number)
{
prev = curr;
curr = curr->next;
}
Node *newNode = malloc(sizeof(Node));
newNode->number = number;
if(!prev)
{
head = newNode;
newNode->next = NULL;
}
else
{
newNode->next = prev->next;
prev->next = newNode;
}
return head;
}
Девета функција
#include <stdlib.h>
#include "type.h"
Node* removeElements ( Node *head, int number ) {
Node *curr = head, *prev = NULL,
*old;
while (curr)
if (curr->number != number)
{
prev = curr;
curr = curr->next;
}
else
{
old = curr;
curr = curr->next;
if (!prev)
head = curr;
else
prev->next = curr;
free (old);
}
return head;
}
Десета функција
#include <stdlib.h>
#include "type.h"
Node* mergeLists ( Node *head0, Node *head1 )
{
Node* head = NULL;
Node* last = NULL;
Node* curr0 = head0;
Node* curr1 = head1;
while (curr0 && curr1)
{
Node* tmp = NULL;
if (curr0->number < curr1->number)
{
tmp = curr0;
curr0 = curr0->next;
}
else
{
tmp = curr1;
curr1 = curr1->next;
}
tmp->next = NULL;
if (!last)
{
head = tmp;
}
else
{
last->next = tmp;
}
last = tmp;
}
if (curr0)
{
if (last == NULL)
head = curr0;
else
last->next = curr0;
}
if (curr1)
{
if (last == NULL)
head = curr1;
else
last->next = curr1;
}
return head;
}
Једанаеста функција
#include <stdlib.h>
#include "type.h"
void removeDuplicates ( Node *head )
{
Node* current = head;
Node* next_next;
if (current == NULL)
return;
while (current->next != NULL)
{
if (current->number == current->next->number)
{
next_next = current->next->next;
free(current->next);
current->next = next_next;
}
else
{
current = current->next;
}
}
}
Дванаеста функција
#include <stdlib.h>
#include "type.h"
Node* reverseList ( Node *head ) {
Node *prev = NULL, *curr = NULL, *next = head;
while(next)
{
curr = next;
next = next->next;
curr->next = prev;
prev = curr;
}
return curr;
}
Тринаеста функција
#include <stdlib.h>
#include "type.h"
Node* getMiddle ( Node *head ) {
Node *slow = head, *fast = slow;
if(!head)
return NULL;
while(fast->next)
{
slow = slow->next;
fast = fast->next;
if(fast->next)
fast = fast->next;
}
return slow;
}
Четрнаеста функција
#include <stdlib.h>
#include "type.h"
Node* getNthFromEnd ( Node *head, int n ) {
Node* fast = head;
for (int i = 0; i < n && fast; i++, fast = fast->next);
Node* slow = head;
for (; fast; fast = fast->next, slow = slow->next);
return slow;
}