Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.97 KB | None | 0 0
  1. /*
  2. 2
  3.  *  * File:   main.c
  4.  * Author: Filip
  5.  *
  6.  * Created on Štvrtok, 2017, októbra 19, 18:49
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. char* scitackaPoZnakoch(char* stringPrveCislo, char* stringDruheCislo){
  14.     char* smernikZnamienkoPrvehoOperandu = stringPrveCislo;
  15.     char* smernikZnamienkoDruhehoOperandu = stringDruheCislo;
  16.     char* smernikPrvyOperand = (stringPrveCislo + (strlen(stringPrveCislo)) -1 );
  17.     char* smernikDruhyOperand = (stringDruheCislo + (strlen(stringDruheCislo)) -1 );
  18.    
  19.     int pocetZnakovVysledku;
  20.     if(strlen(stringPrveCislo) >= strlen(stringDruheCislo)) pocetZnakovVysledku = strlen(stringPrveCislo)+1;
  21.     else pocetZnakovVysledku = strlen(stringDruheCislo)+1;
  22.    
  23.     char poleZnakovVysledku[pocetZnakovVysledku];
  24.     char* smernikVysledok = poleZnakovVysledku + (strlen(poleZnakovVysledku)) -1;
  25.     poleZnakovVysledku[strlen(poleZnakovVysledku)] = '\0';
  26.     int prenosDoVyssiehoRadu = 0;
  27.    
  28.    
  29.     //pripad kedy su znamienka oboch operandov rovnake takze vysledkom bude hodnota so znamienkom +
  30.     if((*smernikZnamienkoPrvehoOperandu == '+' && *smernikZnamienkoDruhehoOperandu == '+') || (*smernikZnamienkoPrvehoOperandu == '-' && *smernikZnamienkoDruhehoOperandu == '-')){
  31.         //scitavanie dvoch celych cisel
  32.         while (smernikPrvyOperand >= stringPrveCislo && smernikDruhyOperand >= stringDruheCislo) {
  33.             int prvyScitanec, druhyScitanec, vysledok;
  34.            
  35.             if(*smernikPrvyOperand == '+' || *smernikPrvyOperand == '-' && (atoi(*smernikDruhyOperand) >= 0) && (atoi(*smernikDruhyOperand) <= 9)){
  36.                 prvyScitanec = atoi(*smernikDruhyOperand);
  37.                 vysledok = prvyScitanec + prenosDoVyssiehoRadu;
  38.                
  39.             }else if(*smernikDruhyOperand == '+' || *smernikDruhyOperand == '-' && (atoi(*smernikPrvyOperand) >= 0) && (atoi(*smernikPrvyOperand) <= 9)){
  40.                 prvyScitanec = atoi(*smernikPrvyOperand);
  41.                 vysledok = prvyScitanec + prenosDoVyssiehoRadu;
  42.                
  43.             }else if((atoi(*smernikPrvyOperand)) >= 0 && (atoi(*smernikDruhyOperand) >= 0) && (atoi(*smernikPrvyOperand)) <= 9 && (atoi(*smernikDruhyOperand) <= 9)){
  44.                 prvyScitanec = atoi(*smernikPrvyOperand);
  45.                 druhyScitanec = atoi(*smernikDruhyOperand);
  46.                 vysledok = prvyScitanec + druhyScitanec + prenosDoVyssiehoRadu;
  47.                
  48.             }else if((*smernikDruhyOperand == '+' || *smernikDruhyOperand == '-') && (*smernikPrvyOperand == '+' || *smernikPrvyOperand == '-') && (prenosDoVyssiehoRadu == 1)){
  49.                 vysledok = 1;
  50.             }else{
  51.                 printf("\nVyskytla sa neznama chyba!");
  52.                 break;
  53.             }
  54.            
  55.             if(vysledok >= 10){
  56.                 prenosDoVyssiehoRadu = 1;
  57.                 vysledok = vysledok % 10;
  58.             }else{
  59.                 prenosDoVyssiehoRadu = 0;
  60.             }
  61.            
  62.             //z hodnoty číslice spraví znak danej číslice na základe ascii
  63.             vysledok += 48;
  64.             *smernikVysledok = vysledok;
  65.            
  66.             smernikPrvyOperand--;
  67.             smernikDruhyOperand--;
  68.             smernikVysledok--;
  69.         }
  70.         if(prenosDoVyssiehoRadu == 1){
  71.             *smernikVysledok = prenosDoVyssiehoRadu;
  72.             *(smernikVysledok-1) = '+';
  73.         }else if(prenosDoVyssiehoRadu == 0){
  74.             *smernikVysledok = '+';
  75.             *(smernikVysledok-1) = ' ';
  76.         }
  77.    
  78.     //pripad kedy maju operandy rozdielne znamienka a teda znamienko vysledneho operandu zavisi aj od toho ktory string predstavuje cislo s vacsou hodnotou
  79.     }else if((*smernikZnamienkoPrvehoOperandu == '+' && *smernikZnamienkoDruhehoOperandu == '-') || (*smernikZnamienkoPrvehoOperandu == '-' && *smernikZnamienkoDruhehoOperandu == '+')){
  80.         int ciselnaHodnotaNacitanehoPrvku1 = 0;
  81.         int ciselnaHodnotaNacitanehoPrvku2 = 0;
  82.         int mocninaDesiatky1 = 0;
  83.        
  84.         //string to int 1. cislo
  85.         for(int indexMiesta1 = (strlen(stringPrveCislo) -1); indexMiesta1 >= 1; indexMiesta1--) {
  86.             ciselnaHodnotaNacitanehoPrvku1 += (atoi(*smernikPrvyOperand)) * (10^mocninaDesiatky1);
  87.             smernikPrvyOperand--;
  88.             mocninaDesiatky1++;
  89.         }
  90.         //string to int 2. cislo
  91.         int mocninaDesiatky2 = 0;
  92.         for(int indexMiesta2 = (strlen(stringDruheCislo) -1); indexMiesta2 >= 1; indexMiesta2--) {
  93.             ciselnaHodnotaNacitanehoPrvku2 += (atoi(*smernikDruhyOperand)) * (10^mocninaDesiatky2);
  94.             smernikDruhyOperand--;
  95.             mocninaDesiatky2++;
  96.         }
  97.        
  98.         int ciselnaHodnotaVysledku;
  99.         if(*smernikZnamienkoPrvehoOperandu == '+' && *smernikZnamienkoDruhehoOperandu == '-') ciselnaHodnotaVysledku = ciselnaHodnotaNacitanehoPrvku1 - ciselnaHodnotaNacitanehoPrvku2;
  100.         else if(*smernikZnamienkoPrvehoOperandu == '-' && *smernikZnamienkoDruhehoOperandu == '+') ciselnaHodnotaVysledku = ciselnaHodnotaNacitanehoPrvku2 - ciselnaHodnotaNacitanehoPrvku1;
  101.        
  102.         //pomocna premenna typu int, ak sa bude rovnat 0, vysledok je kladny a znamienko je +, ak 1, vysledok je zaporny a znamienko je - a ak 2, vysledok je nulovy a znamienko nie je
  103.         int znamienko;
  104.         if(ciselnaHodnotaVysledku > 0){
  105.             znamienko = 0;
  106.         }else if(ciselnaHodnotaVysledku < 0){
  107.             znamienko = 1;
  108.         }else znamienko = 2;
  109.        
  110.         printf("\nVysledok je: ");
  111.         int mocninaDesiatky3 = 1;
  112.         while(ciselnaHodnotaVysledku > 0){
  113.             *smernikVysledok = (ciselnaHodnotaVysledku % 10^mocninaDesiatky3) + 48;
  114.             printf("%c", *smernikVysledok);
  115.             ciselnaHodnotaVysledku -= (ciselnaHodnotaVysledku % 10^mocninaDesiatky3);
  116.             smernikVysledok--;
  117.             mocninaDesiatky3++;
  118.         }
  119.        
  120.         if(znamienko == 0){
  121.             *smernikVysledok = '+';
  122.         }else if(znamienko == 1){
  123.             *smernikVysledok = '-';
  124.         }else *smernikVysledok = ' ';
  125.        
  126.     }
  127.    
  128.    
  129.    
  130.     return &poleZnakovVysledku;
  131. }
  132.  
  133. int main(int argc, char** argv) {
  134.    
  135.     int pocetZnakovCisla = 0;
  136.     int volba = 0;
  137.    
  138.     printf("\n*****                               Program na scitanie cisel s najviac n cislicami, ktorych pocet zadas                              *****");
  139.     printf("\n***** Vyber si jednu z možností. Stlač \"1\" a následne si zvoľ pocetZnakov. Alebo stlač \"2\", ak chces využiť implicitnu hodnotu 50 *****");
  140.     printf("\nTvoja volba: ");
  141.     scanf("%d",&volba);
  142.     switch (volba) {
  143.     case 1:
  144.         printf("Zadaj pocet znakov cisla (VRATANE ZNAMIENKA):\n");
  145.         scanf("%d",&pocetZnakovCisla);
  146.         break;
  147.     case 2:
  148.         printf("Implicitne zadana hodnota je 50 (VRATANE ZNAMIENKA):\n");
  149.         pocetZnakovCisla = 50;
  150.         break;
  151.     default:
  152.         printf("Zadana neplatna volba!\n");
  153.         return EXIT_FAILURE;
  154.     }
  155.    
  156.     if(pocetZnakovCisla < 1){
  157.         printf("zle zadana hodnota poctu znakov, musi byt vacsia ako 1!");
  158.         return EXIT_FAILURE;
  159.     }
  160.    
  161.     int velkostPola = pocetZnakovCisla + 1;
  162.     char a[velkostPola];
  163.     char b[velkostPola];
  164.    
  165.     fgets(a, (velkostPola - 1), stdin);
  166.     printf("Zadaj prve cislo v tvare znamienko, cislica, cislica... : \n");
  167.     fgets(a, (velkostPola - 1), stdin);
  168.     a[(velkostPola - 1)] = '\0';
  169.    
  170.     fgets(b, (velkostPola - 1), stdin);
  171.     printf("Zadaj druhe cislo v tvare znamienko, cislica, cislica... (pokial ma menej cifier ako predosle, napr predosle bolo 100 a dalsie je 49, zadaj ako 049!: \n");
  172.     fgets(b, (velkostPola - 1), stdin);
  173.     b[(velkostPola - 1)] = '\0';
  174.    
  175.     if (!(a[0] == '+' || a[0] == '-')){
  176.         printf("Zadany argument a sa nezacina znamienkom!");
  177.         return EXIT_FAILURE;
  178.     }
  179.     if (!(b[0] == '+' || b[0] == '-')){
  180.         printf("Zadany argument b sa nezacina znamienkom!");
  181.         return EXIT_FAILURE;
  182.     }
  183.     scitackaPoZnakoch(a, b);
  184.    
  185.     return (0);
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement