Java - Printing an empty square using nested loops - java

I am working on printing a quasi-empty square that looks like the example below (10 asterisks across and 10 down for the 2 columns):
**********
* *
* *
* *
* *
* *
* *
* *
* *
**********
My code cannot dynamically generate squares as specified by the user's input for the number of rows and columns (it is working for 10 rows and 10 columns, but as soon as I change the number to 20, the number of the asterisks does not change. The following is my code:
String STAR = "*";
String star1 = "**********";
int MAX = 10;
for (int row = 0; row <= MAX; row += 1 ) {
for (int col = 0; col <= MAX ; col += 10) {
if (row == 0 && col == 0)
System.out.println(star1);
if (row >= 1 && row <= 4)
System.out.println(STAR + " " + STAR);
if (row == 10 && col == 10)
System.out.println(star1);
}
}
Any help/advice is welcomed regarding the dynamism of the code.

String star = "*";
String space = " ";
int MAX = xxx;
for (int row = 0; row < MAX; row++) {
for (int col = 0; col < MAX; col++) {
if (row == 0 || row == MAX - 1) {
System.out.println(star);
} else if (col == 0 || col == MAX - 1) {
System.out.println(star);
} else {
System.out.println(space);
}
}
}

Look at your nested loop:
for (int col = 0; col <= MAX ; col += 10) {
So when col is 10, you're really only just iterating once... you might as well not have the nested loop at all.
Additionally, both star1 and the string literal with spaces have a fixed number of characters in them, clearly related to the number of columns.
I'm assuming this is homework, so I won't give any more hints than that to start with, but hopefully that'll get you thinking along the right lines...

You should change the 3 occurrences of 10 in your two for loops by the MAX variable, so when the user define another size, your for loop will take his input instead of the 10 value.

Also take a look at your last if statement there where it says if (row == 10 && col == 10) and think about it for a second. Once you have hit 10 rows and 10 columns, you are just going to print your final horizontal line of star1 regardless of what MAX is set too.

Like mentioned above, the nested for loop is unnecessary and can be inefficient if you plan to create larger rectangles in the future (not saying you're going to have to but try to stay away from nested for loops if you can). Instead, just print star1 before your loop begins and after it exits. The body of the loop should be simple enough. Hope this helps.

class Square
{
public static void main(String[] args)
{
String tenStars="**********";
String oneStar="*";
int count=0;
System.out.println(tenStars);
count++;
while(count<=8)
{
System.out.println(oneStar+" "+oneStar);
count++;
}
System.out.print(tenStars);
}
}

this should work
public static void hallowSquare(int side)
{
int rowPos, size = side;
while (side > 0)
{
rowPos = size;
while (rowPos > 0)
{
if (size == side || side == 1 || rowPos == 1 || rowPos == size)
System.out.print("*");
else
System.out.print(" ");
rowPos--;
}
System.out.println();
side--;
}
}

you can use something like this with one user input ... this is working
public static void drawSquare(int size)
{
for(int i=1; i<size ;i++)
System.out.print("*");
System.out.println("");
for(int i=0; i<50 ;i++)
{
System.out.print("*");
for(int j =0; j<size-3; j++)
System.out.print(" ");
System.out.println("*");
}
for(int i=1; i<size ;i++)
System.out.print("*");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
drawSquare(50);
}
you should just create a class in put this inside your class and run it ... I hope this will help you ....

class Star8
{
public static void main(String[] args)
{
for(int i=1;i<=5;i++)
{
for(int j=1;j<=5;j++)
{
if(i==2||i==3||i==4 )
{
System.out.print("* *");
break;
}
else
{
System.out.print("*");
}
}
System.out.println();
}
}
}

Hope this helps, simplify your thinking mate. Think about the axis x and y and work by that logic. Make a nested loop on ur for loop that passes lines, in each case loop the number of
the size of square and print a space, after the nested loop print the "*".
> for (int b=0;b<ans*2-3;b++)
This nested loop has the max value of b because:
remember that while ur printing, each "*" is distanced from the other by a space, and remember u are only counting space between the first and last column. Meaning all space
between x=0 and x=squaresize, therefore max b should be the space between these 2 coords.
which are: squaresize * 2 /the 2 is for the added spaces/ -3/* -3 because u leave out the first coord(x=0),last coord(x=squaresize), AND 1 space added from the former loop.
import java.util.Scanner;
public class AsteriksSquare {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input= new Scanner(System.in);
int ans;
System.out.print("Enter the size of the side of the square: ");
ans=input.nextInt();
String ast="*";
if (ans>0 && ans<21){
for(int i=0;i<=ans-1;i++){
System.out.print("* ");
}
System.out.println("");
for(int i=1;i<=ans-2;i++){
System.out.print("*");
for (int b=0;b<ans*2-3;b++){
System.out.print(" ");
}
System.out.println("*");
}
for(int i=1;i<=ans;i++){
System.out.print("* ");
}
}
}
}

class square1
{
public static void main(String[] args)
{
String star = "*";
String space = " ";
int MAX = 5;
for (int row = 0; row < MAX; row++)
{
for (int col = 0; col < MAX; col++)
{
if (row == 0 || row == MAX - 1)
{
System.out.print(star);
} else if (col == 0 || col == MAX - 1)
{
System.out.print(star);
} else {
System.out.print(space);
}
}
System.out.println();
}
}
}

This code should do the trick.
package javaPackage;
public class Square {
public static void main(String [] args)
{
for (int i=0;i<=10;i++)
{
for (int j=0;j<=10;j++)
{
if(i==0||i==10){
System.out.print("x");
}
else if(j==0||j==10){
System.out.print("x");
}
else{
System.out.print(" ");
}
}
System.out.println();
}
}
}
If the interpreter sees that you're on the first and last line(i=0 and i=10), it will fill the row with x. Else, it will only print a x at the beginning and the end of the row.

you can use below two methods.
1) One with minimal line of code.
for (int i = 0; i <= 9; i++) {
if (i == 0 || i == 9) {
System.out.println("* * * *");
} else {
System.out.println("* *");
}
}
OR
2) With the help of two for loops
for (int i = 0; i <= 9; i++) {
for (int j = 0; j <= 9; j++) {
if (i == 0 || i == 9) {
System.out.print("*");
} else {
if (j == 0 || j == 9) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
}
System.out.println();
}
Thanks,
Stuti

Here's another solution, a more versatile one. It lets you create a hollow rectangle of height "h" and width "w"
private static void hallowSquare(int h, int w)
{
for(int i=1; i<=h; i++)
{
for(int j=1; j<=w; j++)
{
if (j==1|| j==w || i==1 || i==h )
System.out.print("X");
else
System.out.print(" ");
}
System.out.println();
}
}

import java.util.Scanner;
class Star
{
public static void main(String...args)
{
Scanner sc = new Scanner(System.in);
System.out.print("Enter the row : ");
int row=sc.nextInt();
System.out.print("Enter the column : ");
int column=sc.nextInt();
for(int i=1;i<=column;i++)
{
System.out.print("*");
}
for(int i=row-2;i>=1;i--)
{
System.out.println();
System.out.print("*");
for(int k=1;k<=column-2;k++)
{
if(i<1)
{
break;
}
System.out.print(" ");
}
System.out.print("*");
}
System.out.println();
for(int i=1;i<=column;i++)
{
System.out.print("*");
}
}
}

I am hopeful the code below can help, used very simple coding and have the required result.
a=eval(input('Provide the height of the box: '))
b=eval(input('Provide the width of the box: '))
d=a-2
r=b-2
if a >= 1:
print('*'*b)
if a > 1:
for i in range(d):
print('*',end='')
for i in range(r):
print(' ',end='')
print('*')
print('*'*b,end='')
The result is:

Related

Having issues with printing a nested loop

I am trying to print a nested loop that will print two islands and scale depending on what the input is. The goal is to make Exclamation points(!) to make the left island, a line diagonally of asterisks(*), question marks to make the right island and tildas(~) to make the ocean. Any comments on my code would be helpful.
Example of what I am trying to do.
Input a size (must be larger than 1):
5
0 !!~~*
1 !!~*~
2 ~~*~~
3 ~*~??
4 *~~??
Here is my code:
import java.util.Scanner;
public class Two_Islands {
public static void main(String[] args) {
Scanner kbinput = new Scanner(System.in);
//Create Size variable
System.out.println("Input a size: ");
int n = 0; n = kbinput.nextInt();
for (int r = 0; r < n; r++) {
System.out.print(r);
for (int c = 0; c < n; c++) {
if (r+c == n-1) {
System.out.print("*");
} else if (r+c == n-2) {
System.out.print("!");
} else if (r+c == n+2) {
System.out.print("?");
} else {
System.out.print("~");
}
}
System.out.println();
}
kbinput.close();
}
}
Here is my current output.
Input a size:
5
0~~~!*
1~~!*~
2~!*~~
3!*~~?
4*~~?~
try the following:
else if(r+1 < n/2 && c+1 < n/2)
{
System.out.print("!");
}
else if(r+1 > n-n/2 && c+1 > n-n/2)
{
System.out.print("?");
}

Java output in lines of ten

I'm in a beginners java class and I have a quick question about the output statement on my array problem for week 5. So basically I have the core of the program down, but I'm supposed to output the result in lines of ten. I for some reason can not get it to work even with looking at similar posts on here. I'm a beginner and am pretty slow at putting 2 and 2 together when it comes to programming. Once I see it I have that ah-ha! moment and that's how this whole class has gone. I know I have to use the modulus, but in my trial and error I lost my way and have probably done more damage than good. Help would be appreciated.
Here is what I have and as you can tell I was trying something without modulus:
import java.util.*;
public class ArrayLoop
{
public static void main(String args[])
{
double alpha[] = new double[50];
*//Initialize the first 25 elements of the array (int i=0; i<25; i++)//*
for(int i = 0; i < 25; i++)
{
alpha[i]= i * i;
}
*//Initialize the last 25 elements of the array (i=25; i<50; i++)//*
for(int i = 25; i < 50; i++)
{
alpha[i]= 3 * i;
}
*//Print the element of the array*
System.out.println ( "The values are: " );
for (int i = 0; i < 50; i++)
System.out.println ( alpha[i] );
}
*//Print method to display the element of the array*
void print(double m_array[])
{
for(int i = 1; i < m_array.length; i++)
{
if(i % 10 == 0){;
System.out.println();
}else{
System.out.print(" ");
}
}
if (m_array.length % 10 != 0) {
System.out.println();
}
}
}
Um .. this isn't eloquent in the least but I tried to make the fewest changes to your existing code sample.
public class ArrayLoop {
public static void main(String args[]) {
double alpha[] = new double[50];
for (int i = 0; i < 25; i++) {
alpha[i] = i * i;
}
for (int i = 25; i < 50; i++) {
alpha[i] = 3 * i;
}
System.out.println("The values are: ");
for (int i = 0; i < 50; i++) {
System.out.print(alpha[i] + " ");
}
System.out.println();
System.out.println();
for (int i = 1; i < alpha.length; i++) {
if (i != 1 && i % 10 == 0) {
System.out.print(alpha[i - 1] + " ");
System.out.println();
} else {
System.out.print(alpha[i - 1] + " ");
}
}
System.out.print(alpha[49]);
}
}
Edit: A better condition would be ...
for (int i = 0; i < alpha.length; i++) {
if (i > 0 && i % 10 == 9) {
System.out.print(alpha[i] + " ");
System.out.println();
} else {
System.out.print(alpha[i] + " ");
}
}
You have to print the number first then decide whether to print space or newline by checking the modulus:
int arr[] = new int[50];
// Initialize array here
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i > 0 && (i + 1) % 10 == 0) {
System.out.println();
} else {
System.out.print(" ");
}
}
You have a couple of % 10 snippets in your code so I'm not entirely certain how that's "trying something without modulus" :-)
Having said that, modulus is exactly what you need, as per the following psuedo-code:
count = 0
for each item in list:
if count > 0 and (count % 10) == 0:
print end of line
print item
print end of line
In Java, you would use something like:
public class Test {
static public void main(String args[]) {
for (int i = 0; i < 24; i++) {
if ((i > 0) &&((i % 10) == 0)) {
System.out.println();
}
System.out.print ("" + i * 3 + " ");
}
System.out.println();
}
}
In other words, immediately before you print an item, check to see if it should be on the next line and, if so, output a newline before printing it.
Note that arrays in Java are zero based, so you need to start with an index of zero rather than one in your loops.
Now that's pretty close to what you have so you're on the right track but, for the life of me, I cannot see in your print() method where you actually print the item! That should be number one on your list of things to look into :-)
I urge you to try and work it out from the above text and samples but, if you're still having troubles after more than half an hour or so, the below code shows how I'd do it.
public class Test {
static void print (double m_array[]) {
for (int i = 0; i < m_array.length; i++) {
if ((i > 0) && ((i % 10) == 0))
System.out.println();
System.out.print (m_array[i] + " ");
}
System.out.println();
}
static public void main(String args[]) {
double[] x = new double[15];
for (int i = 0; i < x.length; i++)
x[i] = i * 3;
print (x);
}
}

How to print out an X using nested loops

I have searched through to find a simple solution to this problem.
I have a method called
printCross(int size,char display)
It accepts a size and prints an X with the char variable it receives of height and width of size.
The calling method printShape(int maxSize, char display) accepts the maximum size of the shape and goes in a loop, sending multiples of 2 to the printCross method until it gets to the maximum.
Here is my code but it is not giving me the desired outcome.
public static void drawShape(char display, int maxSize)
{
int currentSize = 2; //start at 2 and increase in multiples of 2 till maxSize
while(currentSize<=maxSize)
{
printCross(currentSize,display);
currentSize = currentSize + 2;//increment by multiples of 2
}
}
public static void printCross(int size, char display)
{
for (int row = 0; row<size; row++)
{
for (int col=0; col<size; col++)
{
if (row == col)
System.out.print(display);
if (row == 1 && col == 5)
System.out.print(display);
if (row == 2 && col == 4)
System.out.print(display);
if ( row == 4 && col == 2)
System.out.print(display);
if (row == 5 && col == 1)
System.out.print(display);
else
System.out.print(" ");
}
System.out.println();
}
}
Is it because I hardcoded the figures into the loop? I did a lot of math but unfortunately it's only this way that I have been slightly close to achieving my desired output.
If the printCross() method received a size of 5 for instance, the output should be like this:
x x
x x
x
x x
x x
Please I have spent weeks on this and seem to be going nowhere. Thanks
The first thing you have to do is to find relationships between indices. Let's say you have the square matrix of length size (size = 5 in the example):
0 1 2 3 4
0 x x
1 x x
2 x
3 x x
4 x x
What you can notice is that in the diagonal from (0,0) to (4,4), indices are the same (in the code this means row == col).
Also, you can notice that in the diagonal from (0,4) to (4,0) indices always sum up to 4, which is size - 1 (in the code this is row + col == size - 1).
So in the code, you will loop through rows and then through columns (nested loop). On each iteration you have to check if the conditions mentioned above are met. The logical OR (||) operator is used to avoid using two if statements.
Code:
public static void printCross(int size, char display)
{
for (int row = 0; row < size; row++) {
for (int col = 0; col < size; col++) {
if (row == col || row + col == size - 1) {
System.out.print(display);
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
Output: (size = 5, display = 'x')
x x
x x
x
x x
x x
Instead of giving a direct answer, I will give you some hints.
First, you are right to use nested for loops.
However as you noticed, you determine when to print 'x' for the case of 5.
Check that 'x' is printed if and only if row = col or row + col = size - 1
for your printCross method, try this:
public static void printCross(int size, char display) {
if( size <= 0 ) {
return;
}
for( int row = 0; row < size; row++ ) {
for( int col = 0; col < size; col++ ) {
if( col == row || col == size - row - 1) {
System.out.print(display);
}
else {
System.out.print(" ");
}
}
System.out.println();
}
}
ah, I got beaten to it xD
Here's a short, ugly solution which doesn't use any whitespace strings or nested looping.
public static void printCross(int size, char display) {
for (int i = 1, j = size; i <= size && j > 0; i++, j--) {
System.out.printf(
i < j ? "%" + i + "s" + "%" + (j - i) + "s%n"
: i > j ? "%" + j + "s" + "%" + (i - j) + "s%n"
: "%" + i + "s%n", //intersection
display, display
);
}
}
Lte's try this simple code to print cross pattern.
class CrossPattern {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("enter the number of rows=column");
int n = s.nextInt();
int i, j;
s.close();
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (j == i) {
System.out.print("*");
} else if (j == n - (i - 1)) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
}

is there a better way to do this than my way?

I was asked the following question on a job interview. I was asked to do a form of 'padded printing' using an * character. Here is the code I provided as my answer (in java):
edit:
something like this: User input 3:
x x x x x
x * * * x
x * * * x
x * * * x
x x x x x>
public class asterisk {
public static void main (String args[]){
int input,ast;
Scanner scan = new Scanner(System.in);
System.out.println("Enter number: ");
input = scan.nextInt();
if(input>0) {
topBottom(input);
for(int x=1; x<=input; x++){
System.out.print("x ");
for( ast=1; ast<=input; ast++) {
System.out.print("* ");
}
System.out.print("x ");
System.out.println();
}
topBottom(input);
} else {
System.out.print("x ");
}
}
public static void topBottom(int input) {
for(int top = 1; top<=input+2; top++ ) {
System.out.print("x ");
}
System.out.println();
}
}
Is there a better more efficient way to do this aside from my way? Also, what did i do poorly in my code?
It would really mean a lot to me. I am now practicing commonly asked interview coding questions.
Your code is good but a few suggestions.
By convention, methods should start with a verb. The use of the topBottom function is questionable. I find it makes the code more confusing than anything. Consider readability as well as efficiency.
An approach like this is easier to read and doesn't include the extra method.
For n+2 chars in n+2 rows
for(int i=0; i<input+2; i++) {
for(int j=0; j<input+2; j++) {
Always print X for the first and last rows
if(i == 0 || i == input+1) {
System.out.print("X ");
}
For all other rows print X for the first and last character, otherwise print *
else {
if(j == 0 || j == input+1) {
System.out.print("X ");
} else {
System.out.print("* ");
}
}
Final Result:
for(int i=0; i<input+2; i++) {
for(int j=0; j<input+2; j++) {
if(i == 0 || i == input+1) {
System.out.print("X ");
} else {
if(j == 0 || j == input+1) {
System.out.print("X ");
} else {
System.out.print("* ");
}
}
}
System.out.println();
}
Minor changes, #Michael code , to print next line and print the char inside inner loop
// y = column
for(int y=0; y < input; y++){
// x = row
for(int x=0; x< input; x++){
nextChar = (x == 0 || y == 0 || (x+1) == input
|| (y+1) == input) ? BORDER : FILLING;
System.out.print(nextChar);
}
System.out.println();
}

Ascii Art with Java - Creating a square/rectangle with different symbolled edges

I'm working to printout ascii art which takes two integers entered from the console then displays a rectangle or square from those two integers (the then dimensions). But the corners need to be a different symbol then the main symbol... yet the trick is that the short side has to have only 1 or 2 of the original symbols on it (due to odd or even.)
Here are two examples:
6x9:
001111100
011111110
111111111
111111111
011111110
001111100
9x6:
001100
011110
111111
111111
111111
111111
111111
011110
001100
I've gotten this far (since the console only goes from 0 to 9 right?)
What would need to be added to take in account the corners?
Would an If statement work or something else?
And yes, I know this is only for the "square". How would I add a second dimension? Can I get some help?
class Main {
public static void printSquare(int size) {
if(size > 9) {
size = 9;
}
int line = 1;
while (line <= size) {
int width = size;
int i = 1;
while (i <= width) {
System.out.print("*");
i = i + 1;
}
System.out.println(); // Newline
line = line + 1;
}
}
}
You need to simply tell it that the three corner symbols are different.
Scanner keys = new Scanner(System.in);
int x = 0;
int y = 0;
public void getInput() {
x = keys.nextInt();
y = keys.nextInt();
createart();
}
public void createart() {
System.out.print("00");
int counter = 0;
while (counter < x - 4) {
System.out.print(1);
counter++;
}
System.out.println("00");
counter = 0;
System.out.print("0");
while (counter < x - 2) {
System.out.print(1);
counter++;
}
System.out.print("0");
counter = 0;
int counter2 = 0;
while (counter < y - 4) {
System.out.println("");
while (counter2 < x) {
System.out.print(1);
counter2++;
}
counter++;
}
System.out.println("");
counter = 0;
while (counter < x - 2) {
System.out.print(1);
counter++;
}
counter = 0;
System.out.println("0");
System.out.print("00");
while (counter < x - 4) {
System.out.print(1);
counter++;
}
System.out.print("00");
}
Simple logic.

Categories