2020年4月29日 星期三

0102-ComputeHMS

#include <iostream>
using namespace std;

int main()
{
    long long int A,hour,mintue,second;
    while(cin>>A)
    {
        second=A%60;
        A/=60;
        mintue=A%60;
        A/=60;
        hour=A;
        cout << hour << " hours " << mintue << " mintues and " << second << " seconds" << endl;
    }
    return 0;
}

0101-ComputSQRT

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    double n,r,guess,pre_guess;
    while(cin>>n)
    {
        guess=n/2;
        do{
            r=n/guess;
            pre_guess=guess;
            guess=(guess+r)/2; 
        }while(pre_guess-guess>=0.01);
        cout << fixed << setprecision(2) << guess << endl;
    }
    return 0;
}

2020年4月6日 星期一

4.3-Greatest_Common_Divisor_Lab

程式碼:
#include <iostream>
using namespace std;
int gcd(int a, int b)
{
 while ((a %= b) != 0 && (b %= a) != 0);
 return a + b;
}
int main() {
 int a, b;
 while (cin >> a >> b)
 {
  cout << gcd(a, b) << endl;
 }
    return 0;
}

4.2-BankAccount-Lab

程式碼:
main.cpp
#include <iostream>
#include "BankAccount.h"

using namespace std;

int main() {
 BankAccount bankAccount1(200), bankAccount2, bankAccount3(-100);
 cout << BankAccount::getAllMoneyInBank() << endl;
 bankAccount1.withdraw(100);
 cout << bankAccount1.getBalance() << endl;
 cout << BankAccount::getAllMoneyInBank() << endl;
 bankAccount2.save(50);
 cout << bankAccount2.getBalance() << endl;
 cout << BankAccount::getAllMoneyInBank() << endl;
 return 0;
}


BankAccount.h
#pragma once
class BankAccount {
private:
 int balance;
 static int total;
public:
 BankAccount()
 {
  balance = 0;
 }
 BankAccount(int input)
 {
  balance = input;
  total += input;
 }
 void withdraw(int output);
 void save(int input);
 int getBalance() { return balance; }
 static int getAllMoneyInBank() { return total; }
};

BankAccount.cpp
#include"BankAccount.h"

int BankAccount::total = 0;

void BankAccount::withdraw(int output)
{
 balance -= output;
 total -= output;
}
void BankAccount::save(int input)
{
 balance += input;
 total += input;
}

4.1-Collatz_Conjecture-Lab

解題心得:
典型的3N+1問題。

程式碼:
#include <iostream>
using namespace std;

int main() {
 int a, b;
 while (cin >> a >> b)
 {
  int maxCycleLength = 0, cycleLength = 0, n;
  cout << a << " " << b << " ";
  if (a > b)
   swap(a, b);
  for (int i = a; i <= b; i++)
  {
   n = i;
   cycleLength = 1;
   while (n != 1)
   {
    if (n % 2) // even
     n = 3 * n + 1;
    else //odd
     n = n / 2;
    cycleLength++;
   }
   maxCycleLength = cycleLength > maxCycleLength ? cycleLength : maxCycleLength;
  }
  cout << maxCycleLength << endl;
 }
    return 0;
}

4.2-Fraction

程式碼:
main.cpp
#include <iostream>
#include "Fraction.h"
using namespace std;

int main()
{
 Fraction f1, f2;
 f1.setNumerator(4);
 f1.setDenominator(2);
 f1.getDouble();
 f1.outputReducedFraction();

 f2.setNumerator(20);
 f2.setDenominator(60);
 f2.getDouble();
 f2.outputReducedFraction();
 system("pause");
 return 0;
}

Fraction.h
#ifndef Fraction_H
#define Fraction_H
#include <iostream>
#include <iomanip>
using namespace std;

class Fraction
{
private:
 int numerator;
 int denominator;
public:
 void setNumerator(int nu);
 void setDenominator(int de);
 void getDouble();
 void outputReducedFraction();

};

#endif //Fraction_H

Fraction.h
#include "Fraction.h"

int gcd(int a, int b)
{
 while ((a %= b) != 0 && (b %= a) != 0);
 return a + b;
}
void Fraction::setNumerator(int nu)
{
 numerator = nu;
}

void Fraction::setDenominator(int de)
{
 denominator = de;
}

void Fraction::getDouble()
{
 if (!(numerator % denominator)) // integer
  cout << numerator / denominator << endl;
 else
  cout << fixed << setprecision(6) << (double)numerator / denominator << endl;
}

void Fraction::outputReducedFraction()
{
 int greattestCommonDivisor = gcd(numerator, denominator);
 if (!(numerator % denominator)) // integer
  cout << numerator / denominator << endl;
 else
  cout << numerator / greattestCommonDivisor << "/" << denominator / greattestCommonDivisor << endl;
}

4.1-Class Point in plane

程式碼:
main.cpp
#include <iostream>
#include "Point.h"
using namespace std;

int main(void) {
 Point point;

 point.Set(0, 5);
 cout << point.RetrieveVertical() << " " << point.RetrieveHorizontal() << endl;

 point.Move(1, 2);
 cout << point.RetrieveVertical() << " " << point.RetrieveHorizontal() << endl;
 for (int i = 0; i < 4; i++) {
  point.Rotate();
  cout << point.RetrieveVertical() << " " << point.RetrieveHorizontal() << endl;
 }

 return 0;
}

Point.cpp
#include "Point.h"

void Point::Set(int x, int y)
{
 vertical = x;
 horizontal = y;
}

void Point::Move(int x, int y)
{
 vertical += x;
 horizontal += y;
}
void Point::Rotate()
{
 int temp = vertical;
 vertical = horizontal;
 horizontal = temp * (-1);
}


Point.h
#ifndef Point_H
#define Point_H
#include <iostream>
using namespace std;

class Point
{
private:
 int vertical;
 int horizontal;

public:
 Point()
 {
  vertical = 0;
  horizontal = 0;
 }

 void Set(int vertical, int horizontal);
 void Move(int x, int y);
 void Rotate();
 int RetrieveVertical() const { return vertical; }
 int RetrieveHorizontal() const { return horizontal; }
};

#endif //Point_H

2020年4月3日 星期五

operator overloading

三種方法:
Overloading unary operator.
Overloading binary operator.
Overloading binary operator using a friend function.
(Types of Operator Overloading in C++)

以複數運算為例:
(原創) 如何使用Operator Overloading? (C/C++)
文章中的複數加法用的是第二種方法,即用member function;複數乘法則是第三種方法,即用 friend function.

complex1 + complex2 比較像是 complex1.+(complex2) ,也就是說complex1 呼叫了加法的函式,把complex2當成參數傳進去。

complex1 * complex2 的概念比較像一般的function ,把兩個複數當成參數傳進去。

其他參考文章:
https://stackoverflow.com/questions/13544364/over-loading-operator-must-take-either-zero-or-one-arguments

練習的code:
https://onlinegdb.com/SJSR5TEvI