2021-08-24, 18:48
  #1
Medlem
Hej.
Hade tentamen i fredags och fastnade p en uppgift som jag sedan frskt lsa, men jag lyckas inte helt.
Mycket eftersom jag inte verkar frst helt hur iteratorer kan anvndas.

Vad som fljer r frst min funktion, "rovarsprak" och sedan main som testar min funktion.
Min funktion tar 3 argument. iterator.begin(), iterator.end) samt en 3:e iterator?. I frsta fallet en back_insterter.
back_inserter som jag frstr fungerar genom att man skickar med den som en referens och skriver till den i sin funktion, men den skriver vidare till en strng som deklarerats i main.

I andra testet blir jag osker. Jag frstr inte helt vad den ska testa. Vilken distance r det frgan om?
Hr hnger jag inte riktigt med.

Kod:
#include <iterator>
#include <vector>
#include <string>
#include <iostream>

using std::cout;
using std::endl;

bool isvowel(char ch) {
	return (ch == 'a') || (ch == 'e') || (ch == 'i') || (ch == 'o') || (ch == 'u');
	}
	
template <class It, class T>

T rovarsprak( It first, It last, const T &value )

{
	
	std::vector<char> rovStr;	// create a temporary char vector to hold the string, converted to rovarspraket

    while( first != last ) {
        // check to see if it's alphanumerical(ie a character) NOT a vowel. Then it must be a konsonant
		if(isalpha(*first) && !isvowel( (char)tolower(*first) ) ){
			rovStr.push_back(*first);
			rovStr.push_back('o');
			rovStr.push_back(*first);
        }
		
		else{
			rovStr.push_back(*first);
		}
		
        ++first;
    }
	
	std::copy(rovStr.begin(), rovStr.end(), value);	// copy all characters to value reference
	
	return value;


}




bool print_and_check(const std::string& s, const std::string& r)
{
    std::string r1;
    auto i1 = std::back_inserter(r1);

    rovarsprak(s.begin(), s.end(), i1);

    auto success = true;
    cout << s << " --> " << r1 << endl;
    if (r1 != r) {
        cout << "*** expected: " << r << endl;
        success = false;
    }

    return success;
}

int main()
{
	// first test
    print_and_check("Test!", "ToTesostot!");
    print_and_check("ABBA", "ABoBBoBA");
    print_and_check("A secret message", "A sosecocroretot momesossosagoge");
    print_and_check("1234", "1234");





	// second test
    std::vector<char> v{'T', 'e', 's', 't', 'i', 'n', 'g', ',', ' ', 't', 'e', 's', 't', 'i', 'n', 'g', ' ', '1', '2', '3',};
    std::string exp = "ToTesostotinongog, totesostotinongog 123";	// 40 characters long
    const auto sz = exp.size();	// 40
    std::vector<char> res(sz+50);	// char vector 40+50 = 90 elements large
	
    auto it = rovarsprak(v.begin(), v.end(), res.begin());	//

    res.erase(it, res.end());

    for (auto x : res) {
        cout << x;
    }
    cout << "\n";

    if(it != res.begin() + static_cast<std::vector<char>::difference_type>(sz)){
        auto d = std::distance(res.begin(), it);
        cout << "*** wrong value of returned iterator. Distance was: " << d << ", expected " << sz << ".\n";
    }

    auto eq = std::equal(exp.begin(), exp.end(), res.begin());
    if(!eq){
        cout << "*** expected " << exp << "\ngot          " << std::string(res.begin(), res.end()) << "\n";
    }
	
	
}
Citera
2021-08-24, 19:53
  #2
Medlem
Citat:
Ursprungligen postat av dagsvag
Hej.
Hade tentamen i fredags och fastnade p en uppgift som jag sedan frskt lsa, men jag lyckas inte helt.
Mycket eftersom jag inte verkar frst helt hur iteratorer kan anvndas.

Vad som fljer r frst min funktion, "rovarsprak" och sedan main som testar min funktion.
Min funktion tar 3 argument. iterator.begin(), iterator.end) samt en 3:e iterator?. I frsta fallet en back_insterter.
back_inserter som jag frstr fungerar genom att man skickar med den som en referens och skriver till den i sin funktion, men den skriver vidare till en strng som deklarerats i main.

I andra testet blir jag osker. Jag frstr inte helt vad den ska testa. Vilken distance r det frgan om?
Hr hnger jag inte riktigt med.

Kod:
#include <iterator>
#include <vector>
#include <string>
#include <iostream>

using std::cout;
using std::endl;

bool isvowel(char ch) {
	return (ch == 'a') || (ch == 'e') || (ch == 'i') || (ch == 'o') || (ch == 'u');
	}
	
template <class It, class T>

T rovarsprak( It first, It last, const T &value )

{
	
	std::vector<char> rovStr;	// create a temporary char vector to hold the string, converted to rovarspraket

    while( first != last ) {
        // check to see if it's alphanumerical(ie a character) NOT a vowel. Then it must be a konsonant
		if(isalpha(*first) && !isvowel( (char)tolower(*first) ) ){
			rovStr.push_back(*first);
			rovStr.push_back('o');
			rovStr.push_back(*first);
        }
		
		else{
			rovStr.push_back(*first);
		}
		
        ++first;
    }
	
	std::copy(rovStr.begin(), rovStr.end(), value);	// copy all characters to value reference
	
	return value;


}




bool print_and_check(const std::string& s, const std::string& r)
{
    std::string r1;
    auto i1 = std::back_inserter(r1);

    rovarsprak(s.begin(), s.end(), i1);

    auto success = true;
    cout << s << " --> " << r1 << endl;
    if (r1 != r) {
        cout << "*** expected: " << r << endl;
        success = false;
    }

    return success;
}

int main()
{
	// first test
    print_and_check("Test!", "ToTesostot!");
    print_and_check("ABBA", "ABoBBoBA");
    print_and_check("A secret message", "A sosecocroretot momesossosagoge");
    print_and_check("1234", "1234");





	// second test
    std::vector<char> v{'T', 'e', 's', 't', 'i', 'n', 'g', ',', ' ', 't', 'e', 's', 't', 'i', 'n', 'g', ' ', '1', '2', '3',};
    std::string exp = "ToTesostotinongog, totesostotinongog 123";	// 40 characters long
    const auto sz = exp.size();	// 40
    std::vector<char> res(sz+50);	// char vector 40+50 = 90 elements large
	
    auto it = rovarsprak(v.begin(), v.end(), res.begin());	//

    res.erase(it, res.end());

    for (auto x : res) {
        cout << x;
    }
    cout << "\n";

    if(it != res.begin() + static_cast<std::vector<char>::difference_type>(sz)){
        auto d = std::distance(res.begin(), it);
        cout << "*** wrong value of returned iterator. Distance was: " << d << ", expected " << sz << ".\n";
    }

    auto eq = std::equal(exp.begin(), exp.end(), res.begin());
    if(!eq){
        cout << "*** expected " << exp << "\ngot          " << std::string(res.begin(), res.end()) << "\n";
    }
	
	
}

Distansen de frgar efter r avstndet mellan brjan och slutet p din strng, de vill att den r 40, dvs att du returnerar en iterator som pekar p 1 steg frbi sista elementet.

Du har returnerat iteratorn som skriver ut tecken med copy. Vilket om du kollar dokumentation fr copy ( https://en.cppreference.com/w/cpp/algorithm/copy ), pekar p frsta elementet av resultatet.

De mter allts frsta elementet till frsta elementet, dvs 0.

Om du fortstter lsa om copy, under returvrde s ser du att den returnerar en iterator som pekar 1 steg frbi slutet p destinationen.

S, p rad 36
Kod:
return std::copy(rovStr.begin(), rovStr.end(), value);
Citera
2021-08-24, 19:58
  #3
Medlem
Citat:
Ursprungligen postat av fatr
Distansen de frgar efter r avstndet mellan brjan och slutet p din strng, de vill att den r 40, dvs att du returnerar en iterator som pekar p 1 steg frbi sista elementet.

Du har returnerat iteratorn som skriver ut tecken med copy. Vilket om du kollar dokumentation fr copy ( https://en.cppreference.com/w/cpp/algorithm/copy ), pekar p frsta elementet av resultatet.

De mter allts frsta elementet till frsta elementet, dvs 0.

Om du fortstter lsa om copy, under returvrde s ser du att den returnerar en iterator som pekar 1 steg frbi slutet p destinationen.

S, p rad 36
Kod:
return std::copy(rovStr.begin(), rovStr.end(), value);

Wow! Tusen tack. Ja, jag frstod inte att copy returnerade ngonting.
Sedan r det en sak som aldrig slagit mig tidigare. En funktion med returvrde behver man inte fnga i en variabel. Gller detta alla sprk?
Citera
2021-08-24, 21:18
  #4
Medlem
Trollfeeders avatar
Citat:
Ursprungligen postat av dagsvag
Wow! Tusen tack. Ja, jag frstod inte att copy returnerade ngonting.
Sedan r det en sak som aldrig slagit mig tidigare. En funktion med returvrde behver man inte fnga i en variabel. Gller detta alla sprk?

Det finns inget som gller i alla sprk.
Citera
2021-08-24, 22:25
  #5
Medlem
Citat:
Ursprungligen postat av Trollfeeder
Det finns inget som gller i alla sprk.
N, det var en lite dum frga. Ska se vad som gller i Java och Python. Antingen r det bara jag som inte har s goda kunskaper eller s fungerar det annorlunda i dessa sprk. Kan inte minnas.
Citera
2021-08-24, 23:26
  #6
Medlem
Neksnors avatar
Citat:
Ursprungligen postat av dagsvag
Wow! Tusen tack. Ja, jag frstod inte att copy returnerade ngonting.
Sedan r det en sak som aldrig slagit mig tidigare. En funktion med returvrde behver man inte fnga i en variabel. Gller detta alla sprk?
Jag ser inget behov av ett fngsttvng. En funktion med ett returvrde av typen Int blir helt enkelt ett heltal, allts som exempelvis kodraden
Kod:
42;
Ganska meningslst om man inte gr ngot med det, men det kan ju vara s att returvrdet inte r det primra i funktionen.
Tnk dig en funktion som kr lite elak kod. Om allt gick som planerat returneras 0, annars ngot annat.

En iterator r enkelt uttryckt ett stt att blddra igenom ngot, ungefr som en for-loop.
Citera
2021-08-24, 23:39
  #7
Medlem
Trollfeeders avatar
Citat:
Ursprungligen postat av dagsvag
N, det var en lite dum frga. Ska se vad som gller i Java och Python. Antingen r det bara jag som inte har s goda kunskaper eller s fungerar det annorlunda i dessa sprk. Kan inte minnas.

Nej, det behvs inte i dessa sprk. Men det finns mnga sprk.
Citera
2021-08-25, 17:11
  #8
Medlem
Citat:
Ursprungligen postat av Neksnor
Jag ser inget behov av ett fngsttvng. En funktion med ett returvrde av typen Int blir helt enkelt ett heltal, allts som exempelvis kodraden
Kod:
42;
Ganska meningslst om man inte gr ngot med det, men det kan ju vara s att returvrdet inte r det primra i funktionen.
Tnk dig en funktion som kr lite elak kod. Om allt gick som planerat returneras 0, annars ngot annat.

En iterator r enkelt uttryckt ett stt att blddra igenom ngot, ungefr som en for-loop.
Jo, det r jag med p. Var bara osker eftersom jag tror att jag alltid fngat returvrdena frn funktioner med returvrden.
Tack!

Citat:
Ursprungligen postat av Trollfeeder
Nej, det behvs inte i dessa sprk. Men det finns mnga sprk.
Tack!
__________________
Senast redigerad av dagsvag 2021-08-25 kl. 17:14.
Citera
2021-08-26, 02:13
  #9
Medlem
Neksnors avatar
Citat:
Ursprungligen postat av dagsvag
Jo, det r jag med p. Var bara osker eftersom jag tror att jag alltid fngat returvrdena frn funktioner med returvrden.
Tack!


Tack!
Testade nyss (i java) och raden
42;
funkade givetvis inte. Not a statement, vilket jag hller med om. Man kan dremot skriva den lika meningslsa raden
new Integer(42);
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in