Gå til innhold

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


Anbefalte innlegg

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;
}

 

Lenke til kommentar
Videoannonse
Annonse

#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
Lenke til kommentar

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!

Lenke til kommentar

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
Lenke til kommentar
  • 2 uker senere...

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
Lenke til kommentar
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!

Lenke til kommentar

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
Lenke til kommentar

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...