simple exercise:Printing E with '*'

S

sathyashrayan

Dear group,
Following is a exercise from a book called "Oreilly's
practical C programming". I just wanted to do a couple of C
programming exercise. I do have K and R book, but let me try
some simple one.

Exercise 4-2:

Write a program to print a block E using asterisks
(*), where the E has a height of seven characters
and a width of five characters.

Solution 1:

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


int main(void)
{
int i;
for(i=0;i<10;i++)
printf("*");

for(i=0;i<5;i++)
printf("*\n");

for(i=0;i<10;i++)
printf("*");

for(i=0;i<5;i++)
printf("*\n");

for(i=0;i<10;i++)
printf("*");

return 0;
}

Though the above print the E with '*', it uses 5 loops and
too ugly.
So I made a second try which is not working.

solution-2:

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

void foo(int w,int h)
{
int temp;
for(temp = 0 ; temp < (w + h) ; temp++)
{

printf("*");
if( temp == h)
printf("*\n");
else if( temp == w)
printf("*");
else
{

printf("*");
if( temp == h)
printf("*\n");
else if( temp == w)
printf("*");
}
}
}

int main(void)
{
foo(5,7);
return 0;
}

The Idea for the above is to iterate the desired number of
'*'
in one go and branching where ever needed. It prints two
lines of
'*'. Can any one suggest some solution for this simple
problem.Don't
simply write the code instead give me some hint.

Thanks.
 
A

Andrew Poelstra

sathyashrayan said:
Dear group,
Following is a exercise from a book called "Oreilly's
practical C programming". I just wanted to do a couple of C
programming exercise. I do have K and R book, but let me try
some simple one.

Exercise 4-2:

Write a program to print a block E using asterisks
(*), where the E has a height of seven characters
and a width of five characters.

[code snipped]
Though the above print the E with '*', it uses 5 loops and
too ugly.
So I made a second try which is not working.

solution-2:

[code snipped]

The Idea for the above is to iterate the desired number of
'*'
in one go and branching where ever needed. It prints two
lines of
'*'. Can any one suggest some solution for this simple
problem.Don't
simply write the code instead give me some hint.

Thanks.

I think that your best solution would to make an array of widths, so
that:
*****
*
***
*
*****
would become { 5, 1, 3, 1, 5 }

Then iterate through that, each time printing the specified number of
E's.
 
V

Vladimir S. Oka

Andrew said:
sathyashrayan said:
Dear group,
Following is a exercise from a book called "Oreilly's
practical C programming". I just wanted to do a couple of C
programming exercise. I do have K and R book, but let me try
some simple one.

Exercise 4-2:

Write a program to print a block E using asterisks
(*), where the E has a height of seven characters
and a width of five characters.

[code snipped]
Though the above print the E with '*', it uses 5 loops and
too ugly.
So I made a second try which is not working.

solution-2:

[code snipped]

The Idea for the above is to iterate the desired number of
'*'
in one go and branching where ever needed. It prints two
lines of
'*'. Can any one suggest some solution for this simple
problem.Don't
simply write the code instead give me some hint.

Thanks.

I think that your best solution would to make an array of widths, so
that:
*****
*
***
*
*****
would become { 5, 1, 3, 1, 5 }

Then iterate through that, each time printing the specified number of
E's.

Alternatively, you can do:

#include <stdio.h>

int main(void)
{
printf("*****\n");
printf("*\n");
printf("*\n");
printf("***\n");
printf("*\n");
printf("*\n");
printf("*****\n");

return 0;
}

Or even:

#include <stdio.h>

int main(void)
{
printf("*****\n*\n*\n***\n*\n*\n*****\n");

return 0;
}

;-)
 
R

Richard Heathfield

sathyashrayan said:
Dear group,
Following is a exercise from a book called "Oreilly's
practical C programming". I just wanted to do a couple of C
programming exercise. I do have K and R book, but let me try
some simple one.
Can any one suggest some solution for this simple problem.

I suggest you keep the solution as simple as the problem. Here's a solution
that's as easy as A-B-C:

#define a int
#define b main
#define c (
#define d void
#define e )
#define f {
#define g [
#define h 7
#define i ]
#define j =
#define k 1
#define l <<
#define m ,
#define n 5
#define o -
#define p }
#define q ;
#define r while
#define s '*'
#define t >>=
#define u '\n'
#define v ++
#define w if
#define x <
#define y 0
#define z putchar
#define become goto
#define _ return

a z c a e q a b c d e f a A g h
i j f c k l n e o k m k m k m c
k l n e o k m k m k m c k l n e
o k p q a B j y q confused: r c
A g B i e z c s e m A g B i t k
q z c u e m B v q w c B x h e

become confused

q _ y q p
 
F

Fred Kleinschmidt

sathyashrayan said:
Dear group,
Following is a exercise from a book called "Oreilly's
practical C programming". I just wanted to do a couple of C
programming exercise. I do have K and R book, but let me try
some simple one.

Exercise 4-2:

Write a program to print a block E using asterisks
(*), where the E has a height of seven characters
and a width of five characters.

Solution 1:

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


int main(void)
{
int i;
for(i=0;i<10;i++)
printf("*");

for(i=0;i<5;i++)
printf("*\n");

for(i=0;i<10;i++)
printf("*");

for(i=0;i<5;i++)
printf("*\n");

for(i=0;i<10;i++)
printf("*");

return 0;
}

Though the above print the E with '*', it uses 5 loops and
too ugly.
So I made a second try which is not working.

solution-2:

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

void foo(int w,int h)
{
int temp;
for(temp = 0 ; temp < (w + h) ; temp++)
{

printf("*");
if( temp == h)
printf("*\n");
else if( temp == w)
printf("*");
else
{

printf("*");
if( temp == h)
printf("*\n");
else if( temp == w)
printf("*");
}
}
}

int main(void)
{
foo(5,7);
return 0;
}

The Idea for the above is to iterate the desired number of
'*'
in one go and branching where ever needed. It prints two
lines of
'*'. Can any one suggest some solution for this simple
problem.Don't
simply write the code instead give me some hint.

Thanks.

int Eshape[7] = {5, 1, 1, 3, 1, 1, 5}; /* Number of asterisks per line */
Then use two nested loops.

This can be genrealized for arbitrary height/width, without
using an array, similar to your second try.

for ( i=0; i < height; i++ ) {
/* set n to number of asterisks for line i */
....
/ * add loop to print n asterisks */
....
}
 
A

Abdo Haji-Ali

A possible solution which I did once, is to break down the 'E' into
four line equations, then iterate through an imaginary x, y grid each
representing a * or a space, this would allow you to specify the width
and height of the 'E'. In fact it's the essential idea to draw any
shape with variable width and height.

However, the last thing that can be said about this solution (Compared
to what others suggested), is simple :)

Abdo Haji-Ali
Programmer
In|Framez
 
P

Peter Shaggy Haywood

Groovy hepcat sathyashrayan was jivin' on Thu, 13 Apr 2006 17:37:44
+0530 in comp.lang.c.
simple exercise:printing E with '*' 's a cool scene! Dig it!
Dear group,
Following is a exercise from a book called "Oreilly's
practical C programming". I just wanted to do a couple of C
programming exercise. I do have K and R book, but let me try
some simple one.

Exercise 4-2:

Write a program to print a block E using asterisks
(*), where the E has a height of seven characters
and a width of five characters.

Solution 1:

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


int main(void)
{
int i;
for(i=0;i<10;i++)
printf("*");

10??? Tell me, what part of "a height of seven characters and a
width of five characters" are you having trouble comprehending?
for(i=0;i<5;i++)
printf("*\n");

for(i=0;i<10;i++)
printf("*");

for(i=0;i<5;i++)
printf("*\n");

for(i=0;i<10;i++)
printf("*");

It's not ugly. It's not what the exercise said to do. But it's
pefectly clear code.
return 0;
}

Though the above print the E with '*', it uses 5 loops and
too ugly.
So I made a second try which is not working.

What does that mean? Define "not working".
#include<stdio.h>
#include<stdlib.h>

void foo(int w,int h)
{
int temp;
for(temp = 0 ; temp < (w + h) ; temp++)
{

printf("*");
if( temp == h)
printf("*\n");
else if( temp == w)
printf("*");
else
{

printf("*");
if( temp == h)
printf("*\n");
else if( temp == w)
printf("*");
}

Now *this* is ugly! It isn't immediately obvious what it is meant to
do. It is poorly formatted. It's overly convoluted. It contains errors
in the most basic logic. (Eg., neither the second if(temp ==h) nor the
second if(temp == w) can possibly evaluate true, since they are within
the else clause of the first.)
}
}

int main(void)
{
foo(5,7);
return 0;
}

The Idea for the above is to iterate the desired number of
'*'
in one go and branching where ever needed. It prints two
lines of
'*'. Can any one suggest some solution for this simple
problem.Don't
simply write the code instead give me some hint.

What's wrong with the most straight-forward approach? You haven't
tried that yet. Just output whatever characters are needed to make an
E 7 characters high and 5 characters wide. You can do that in a single
line, with a single output statement. That's all it takes.
OK, lets get your mind on track. Get all notions of doing "clever"
things with loops out of your head. Simplify, m'boy, simplify! How
would you do it by hand? Get a piece of paper and a pencil, and draw
an E in asterisks. Remember, it has to be 7 high and 5 wide. How would
you do it?
You'd no doubt start by making 5 asterisks at the top. Then you'd
begin a new line, and put one asterisk there, right? And then you'd
begin a new line, and put another asterisk there. Then you'd begin a
new line, and put 5 more asterisks down. (Although some people like to
shorten the middle prong. In that case, just put 3 or 4 asterisks
here.) Then begin another new line, and another asterisk. And the same
again. Then on the next new line, finish off with 5 more asterisks.
Well, it's no different doing it on a computer. You just need to
output the right characters, asterisks and newlines, in the correct
sequence. As I said, you don't need to get caught up in loops; you can
just output the sequence as a single unit.

--

Dig the even newer still, yet more improved, sig!

http://alphalink.com.au/~phaywood/
"Ain't I'm a dog?" - Ronny Self, Ain't I'm a Dog, written by G. Sherry & W. Walker.
I know it's not "technically correct" English; but since when was rock & roll "technically correct"?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,176
Messages
2,570,950
Members
47,503
Latest member
supremedee

Latest Threads

Top