Gå til innhold

[Løst]Skrive ut noe med minst mulig kode


Anbefalte innlegg

Skrevet
Skriv et program som skriver ut følgende:

 

			 *
		***
	   *****
	  *******
		   *****
		***
		 *

 

Du skal kun bruke tegnet ’*’ eller ’ ’ (blank) i printf-statementet ditt. Selvfølgelig også lov med tegn for linjeskift. Hvert printf-statement skal kun inneholde 1 ’*’ eller ’ ’. Bruk så få printf-statements som mulig.

 

____________

 

Dette er det enkleste jeg kom på:

 

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int i;
/*1*/
for (i=1; i<=3; i++)
printf(" ");

for (i=1; i<=1; i++)
printf("*");

for (i=1; i<=3; i++)
printf(" ");

printf("\n");

/*2*/
for (i=1; i<=2; i++)
printf(" ");

for (i=1; i<=3; i++)
printf("*");

for (i=1; i<=2; i++)
printf(" ");

printf("\n");

/*3*/
for (i=1; i<=1; i++)
printf(" ");

for (i=1; i<=5; i++)
printf("*");

for (i=1; i<=1; i++)
printf(" ");

printf("\n");

/*4*/
for (i=1; i<=7; i++)
printf("*");

printf("\n");

/*5*/
for (i=1; i<=1; i++)
printf(" ");

for (i=1; i<=5; i++)
printf("*");

for (i=1; i<=1; i++)
printf(" ");

printf("\n");

/*6*/	
for (i=1; i<=2; i++)
printf(" ");

for (i=1; i<=3; i++)
printf("*");

for (i=1; i<=2; i++)
printf(" ");

printf("\n");

/*7*/
for (i=1; i<=3; i++)
printf(" ");

for (i=1; i<=1; i++)
printf("*");

for (i=1; i<=3; i++)
printf(" ");

printf("\n");

system("PAUSE");	
return 0;
}

 

Videoannonse
Annonse
Skrevet

Hva med å lage en funksjon som tar to argumenter: Antall tegn å skrive ut, og hvilket tegn du skal skrive ut.

 

Så kan du gjøre slik:

 

MinPrint(3,' ');

Minprint(1,'*');

MinPrint(1,'\n');

 

osv...

 

Da har du kun en printf() i koden din

Skrevet

Se på det som et array på 8x8.

 

#define star '*'

#define empty ' '

 

main () {

int i;

for (i = x; i < x; i++) {

if (something % x) {

printf("\n");

} else if (something) {

printf("%c", star);

} else {

printf("%c", empty);

}

}

}

Skrevet

Fullfør denne:

 

int MinPrintStjerne(int antall)

{

for (i=1;i=antall;i++)

{

printf('*');

}

}

 

int MinPrintBlank(int antall)

{

for (i=1;i=antall;i++)

{

printf('');

}

}

 

int main()

{

MinPrintBlank(3);

MinStjerne(1);

Printf('\n');

MinPrintBlank(2);

MinStjerne(3);

Printf('\n');

}

Skrevet (endret)

#include <stdio.h>
#include <stdlib.h>

void foobar(int n)
{
 for(int i = 0; i < (n+7)/2; i++)
printf((i<(7-n)/2)?" ":"*");
 printf("\n");
}

void main()
{
 for(int i = -3; i <= 3; i++)
foobar(7-abs(2*i));
}

Med en nøstet conditional kan man komme ned i én printf.

Endret av JeffK
Skrevet

Stemmer GeirGrusom, husker den oppgaven veldig godt :D

Hvis det fortsatt er Helge Herheim som har DATFE40, har du ihvertfall fått en glimrende lærer. En av de beste jeg har hatt noen gang.

 

Hvis det er data-linja du går kan du se fram til mange interessante fag og mange gode lærere (hvis du overlever realfagene). Lykke til!

Skrevet (endret)

Mulig jeg var fadderen din da hehe :)

 

edit: Men ihvertfall, du må bare telle antall linjer, og tenke deg til hvordan det skal gjøres. Kraftig hint er for-løkker.

Endret av GeirGrusom
Skrevet (endret)

Denn var jo god, men det er noe som er feil. Den stopper ikke. Når jeg setter inn break; så kommer det bare:

*

*

 

Continue; funker heller ikke.

 

#include <stdio.h>
#include <stdlib.h>

int MinPrintStjerne(int antall)
{
int i;

for (i=1;i=antall;i++)
{
	printf("*");
}
}

int MinPrintBlank(int antall)
{
int i;

for (i=1;i=antall;i++)
{
	printf(" ");
}
}

int main()
{
MinPrintBlank(3);
MinPrintStjerne(1);
printf("\n");
MinPrintBlank(2);
MinPrintStjerne(3);
printf("\n");

system("PAUSE");	
return 0;
}

 

Og ja, jeg vet den ikke er helt ferdigskrevet i main().

Endret av mx1000
  • 2 uker senere...
Skrevet (endret)

Lagde en C++ versjon(sikkert overkomplisert men) for morroskyld

#include <iostream>
#include <string>

void printStars(const int noOfStars)
{
std::cout << std::string((7-noOfStars)/2, ' ');
std::cout << std::string(noOfStars, '*') << "\n";
}

int main(void)
{
int tyrant = 1;
int incrementor = 2;
while(true)
{
	printStars(tyrant);
	if(tyrant == 7)
		incrementor = -2;
	tyrant += incrementor;
	if(tyrant < 0)
		break;
}
return 0;
}

Merk, er ingen form for errorsjekk i koden, så hvis printStars får et tall større enn 7 så ryker nok koden på en exception muligens.

Endret av CoolBeer
Skrevet
Lagde en C++ versjon(sikkert overkomplisert men) for morroskyld

#include <iostream>
#include <string>

void printStars(const int noOfStars)
{
std::cout << std::string((7-noOfStars)/2, ' ');
std::cout << std::string(noOfStars, '*') << "\n";
}

int main(void)
{
int tyrant = 1;
int incrementor = 2;
while(true)
{
	printStars(tyrant);
	if(tyrant == 7)
		incrementor = -2;
	tyrant += incrementor;
	if(tyrant < 0)
		break;
}
return 0;
}

Merk, er ingen form for errorsjekk i koden, så hvis printStars får et tall større enn 7 så ryker nok koden på en exception muligens.

Oi, man kommer vel ikke lavere enn 0 printf'er!

Skrevet
Oi, man kommer vel ikke lavere enn 0 printf'er!

Hehe, nå er vel std::cout ikke tilgjengelig i C, så der hadde nok printf hatt sin misjon. Det var som sagt en C++ versjon for morroskyld :p

Skrevet (endret)

Har DA1 på HVE selv :D Går mikro though.

 

Løste den sånn:

 

#include <stdio.h>
#include <stdlib.h>

void printSpace ( int ); 	/* Printer mellomrom basert på inputverdi */
void printStar ( int );		/* Printer stjerner basert på inputverdi  */

int main(int argc, char** argv)
{

const int width = 7; /* Kan endres for større/mindre diamanter */

int counter;
for ( counter = 1; counter <= width; counter++ )
{

		/* 	Her trenger man å lage et mønster ved hjelp av linje-nummer 			
		*	"counter", og bredden til diamanten "width". Mønsteret man 		
		*	ønsker er 3-1-3, 2-3-2, 1-5-1, 0-7-0, 1-5-1, 2-3-2, 3-1-3.
		*
		*	Mønsteret 3, 2, 1, 0, 1, 2, 3 er veldig lett å finne.
		*	x(n) = abs ( (width+1)/2 - n ).
		*
		*	Mønsteret nedenfor kan finnes ved å sette opp en likning:
		*	width = 2 * abs( (width+1)/2 - n ) + x(n)
		*	x(n) = width - 2 * abs( (width+1)/2 - n	
		*/

	printSpace ( abs ((width+1)/2 - counter) );
	printStar ( width - 2*abs( (width+1)/2 - counter ) );
	/* printSpace ( abs ((width+1)/2 - counter) );		 Hadde den med i innleveringa :p hehe. Litt ubrukelig når jeg tenker meg om >_> */
	printf( "\n" );
}  
return 0; /* Bruker linux så trenger ikke å måtte stoppe opp terminalen med getchar() eller DOS-kommandoen system("PAUSE") for å se noe, siden jeg sitter i terminalen fra før :p */
}


void printSpace ( int n )
{
int counter;
for ( counter = 0; counter < n; counter++ )
	printf ( " " );
}

void printStar ( int n )
{
int counter;
for ( counter = 0; counter < n; counter++ )
	printf ( "*" );
}

 

Hvis man skal forholde seg til oppgaven og ikke "jukse" seg unna problemet med å bruke putc('*') eller noe i den duren, så må man nok bruke minst 2 printf (tror ikke det stod noe om hvordan new-linen skulle utføres.

Endret av TheMaister

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...