2013-10-11, 15:54
  #1
Medlem
MDCSs avatar
Hej
Jag frsker att f fram ett program som frgar efter hur mnga gnger ett tecken ska upprepas, och frsker att f antalet tecken att stiga med varje ny rad:
*
**
***
osv

Jag antar att det finns fler tillvgagngsstt, men gr det att lsa p detta stt genom att "bdda in" uttrycket och multiplicera det med antal upprepningar?

Koden som jag syftar p:
Kod:
cout<<"*"*rep<<endl;
Koden i helthet:
Kod:
#include <iostream>
#include <conio.h>
using namespace std;
main ()
{
	int tal=1;
	while (tal!=0)
	{
		cout<<"Ange antal upprepningar, avsluta med 0: ";
		cin>>tal;
		for(int rep=0;rep<tal;rep+=1)
		{
		cout<<"*"*rep<<endl;
		}
		cout<<"Avsluta med 0 eller kr igen med annat vrde: ";
		cin>>tal;
	}
	cout<<"Du har valt att avsluta programmet"<<endl;
	getch();
	return 0;
}
Citera
2013-10-11, 16:10
  #2
Medlem
Nej ngot sdant hittar du inte inbyggt i sjlva sprket nr det handlar om ett sprk p s pass lg niv som C++.

Ett (omstndligt och inte vrt mdan fr detta problem) r att definiera en egen klass fr det hela. Den skulle kunna se ut ngot i denna stil:

Kod:
class Bar
{
  char chr;
  char* str;
  Bar(char c) : chr(c), size(1) {} 
  char* operator*(int n) { 
     str=new char[n+1]; 
     for(int i=0; i<n+1; i++)
         str[i]=c;
     return str;
   }
}

Det hr r rtt slarvigt skrivet och inkluderar problem med minneshantering, men som sagt s r det en metod att lsa det.

Man skulle kunna anvnda ovanstende klass s hr:

Kod:
main()
{
   Bar bar('*');
   cout << bar*5 << endl;
}

EDIT:

Kom p att ovanstende inte fungerar eftersom man ven mste verlagra <<.
__________________
Senast redigerad av patwotrik 2013-10-11 kl. 16:34.
Citera
2013-10-11, 16:40
  #3
Medlem
Citat:
Ursprungligen postat av MDCS
Jag antar att det finns fler tillvgagngsstt, men gr det att lsa p detta stt genom att "bdda in" uttrycket och multiplicera det med antal upprepningar?

Nej, repetera gr man med loopar (for, while och do-while) och de r statements, inte expressions, s man kan inte loopa bara en del av ett uttryck. Men man kan repetera datat om man vill, t.ex. skapa en strng med x antal y-tecken med `string(x, y)` (eller om det var tvrtom).

Fr konditionella statements (if-else) finns det dremot en motsvarighet som r ett uttryck: ?:-operatorn. S man kan skriva...

Kod:
cout << (height < 1.5 ? "dvrg" : "mnniska") << endl;

...istllet fr...

Kod:
if (height < 1.5) {
  cout << "dvrg";
} else {
  cout << "mnniska";
}
cout << endl;

Antingen loopar du n antal `cout << '*';` som skriver ut en enda asterisk, och d behver du en ny loop inuti den andra, eller s kr du bara `cout << string('*', n)`. Det senare slsar lite p minne, men gr andra sidan bara ett output-anrop. Eftersom cout antagligen r buffrad, s sparar det nog inte ngon srskild tid, men hade det varit cerr kunde kanske strngskaparmetoden varit mycket snabbare.

Det finns fler trdar med samma uppgift, du kanske kan hitta ngon bra info i dem:

https://www.flashback.org/t1806434
https://www.flashback.org/t1501850
https://www.flashback.org/t1366651
https://www.flashback.org/t1090267
__________________
Senast redigerad av 770310 2013-10-11 kl. 16:54.
Citera
2013-10-11, 23:15
  #4
Medlem
Det r ju uppenbart c++ han kodar i och d finns det en utmrkt container av chars som heter string...?

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

using namespace std;

int main()
{
	string x = "*";
	int amount = 10;

	for (int i = 0; i < amount; i++)
	{
		for (int j = 0; j <= i; j++)
		cout << x;
		cout << endl;
	}
	cin.get();
}
__________________
Senast redigerad av PG-k 2013-10-11 kl. 23:23.
Citera
2013-10-11, 23:44
  #5
Medlem
Goto10s avatar
Citat:
Ursprungligen postat av PG-k
Det r ju uppenbart c++ han kodar i och d finns det en utmrkt container av chars som heter string...?

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

using namespace std;

int main()
{
	string x = "*";
	int amount = 10;

	for (int i = 0; i < amount; i++)
	{
		for (int j = 0; j <= i; j++)
		cout << x;
		cout << endl;
	}
	cin.get();
}
Hller med. Hade nog till och med gjort s hr:
Kod:
#include <iostream>
#include <string>

using namespace std;

int main() {
  string x = "*";
  size_t iterations = 10;
  while (x.length() <= iterations) {
    cout << x << endl;
    x += "*";
  }
}
Citera
2013-10-12, 01:38
  #6
Medlem
Citat:
Ursprungligen postat av Goto10
Hller med. Hade nog till och med gjort s hr:
Kod:
#include <iostream>
#include <string>

using namespace std;

int main() {
  string x = "*";
  size_t iterations = 10;
  while (x.length() <= iterations) {
    cout << x << endl;
    x += "*";
  }
}

Fint! det nda r vl att du nu utkar minnet och programmet vxer istllet fr att skriva ut "on the go" s att sga.
Citera
2013-11-25, 10:37
  #7
Medlem
kom ihg att tnka p den hr trden nr jag brjade kolla igenom string operatorer.

Kod:
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str;
	const size_t AMOUNT = 10;
	for (int i = 0; i < AMOUNT; i++)
	{
		str.assign(i+1, '*');
		cout << str << endl;
	}
}
__________________
Senast redigerad av PG-k 2013-11-25 kl. 10:42.
Citera
2013-11-25, 22:58
  #8
Medlem
ture.karlssons avatar
En del sprk stder "multipliation" av strngar; i t.ex. Python r "abc" * 2 = "abcabc".

Om du vill (ej rekommenderat) kan du i C++ verlagra operator* p samma stt.

Fr vrigt, om du inte mste "spola rren" r "\n" bttre n "std::endl".
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