Scaling output with for loop - java

What I'm trying to do is make a box, like so:
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
and the code for it is
public static void drawUpper(int count)
{
System.out.print("|");
for(int i = 0; i <= (count); i++){
System.out.print(".");
}
for(int i = 0; i <= (-count + 1); i++){
System.out.print("/\\");
}
for(int i = 0; i <= count; i++){
System.out.print(".");
}
for(int i = 0; i <= count; i++){
System.out.print(".");
}
for(int i = 0; i <= (-count + 1); i++){
System.out.print("/\\");
}
for(int i = 0; i <= count; i++){
System.out.print(".");
}
System.out.print("|");
System.out.println();
}
public static void drawLower(int count)
{
System.out.print("|");
for(int i = 0; i <= -count; i++){
System.out.print(".");
}
for(int i = 0; i <= (count + 1); i++){
System.out.print("\\/");
}
for(int i = 0; i <= -count; i++){
System.out.print(".");
}
for(int i = 0; i <= -count; i++){
System.out.print(".");
}
for(int i = 0; i <= (count + 1); i++){
System.out.print("\\/");
}
for(int i = 0; i <= -count; i++){
System.out.print(".");
}
System.out.print("|");
System.out.println();
}
However, this needs to be at a scale, its current scale, is 5;
private static int size = 5;
public static void main(String[] args)
{
for(int i = 1; i > (-size / 2); i--){
drawUpper(i);
}
for(int i = 1; i > (-size / 2); i--){
drawLower(i);
}
}
Now, so long as the scale doesn't change it works perfectly, and I'm quite pleased with myself. However when i change the scale to 7 the box seems to turn into this:
|../\..../\..|
|./\/\../\/\.|
|/\/\/\/\/\/\|
|/\/\/\/\/\/\/\/\|
|\/\/\/\/\/\/|
|.\/\/..\/\/.|
|..\/....\/..|
|............|
However, it's supposed to look like this:
|....../\............/\......|
|...../\/\........../\/\.....|
|..../\/\/\......../\/\/\....|
|.../\/\/\/\....../\/\/\/\...|
|../\/\/\/\/\..../\/\/\/\/\..|
|./\/\/\/\/\/\../\/\/\/\/\/\.|
|/\/\/\/\/\/\/\/\/\/\/\/\/\/\|
|\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
|.\/\/\/\/\/\/..\/\/\/\/\/\/.|
|..\/\/\/\/\/....\/\/\/\/\/..|
|...\/\/\/\/......\/\/\/\/...|
|....\/\/\/........\/\/\/....|
|.....\/\/..........\/\/.....|
|......\/............\/......|

Here's what I came up with. I only provided code for producing one diamond (I won't do all the work for you ;)). It's trivial to adapt it to produce two diamonds, so it's up to you to make those changes (it's really not difficult at all, given the code below).
// aliases for java's verbose methods
public static void p(char c) { System.out.print(c); }
public static void pn(char c) { System.out.println(c); }
// convenient shortcut for alternating between characters
public static char[] a = {'/', '\\'};
public static void dotop(int size, int line) {
p('|');
for (int i=0; i<size-line; i++) p('.');
for (int i=0; i<line+1; i++) p(a[i%2]);
for (int i=0; i<line+1; i++) p(a[(i+1+line)%2]);
for (int i=0; i<size-line; i++) p('.');
pn('|');
}
public static void dobottom(int size, int line) {
p('|');
for (int i=0; i<size-line; i++) p('.');
for (int i=0; i<line+1; i++) p(a[(i+line+(line+1)%2)%2]);
for (int i=0; i<line+1; i++) p(a[(i+1+(line+1)%2)%2]);
for (int i=0; i<size-line; i++) p('.');
pn('|');
}
public static void main(String[] args) {
int size = 4;
for (int i=0; i<=size; i++) dotop(size, i);
for (int i=0; i<=size; i++) dobottom(size, size-i);
}
The produced output is:
|..../\....|
|.../\/\...|
|../\/\/\..|
|./\/\/\/\.|
|/\/\/\/\/\|
|\/\/\/\/\/|
|.\/\/\/\/.|
|..\/\/\/..|
|...\/\/...|
|....\/....|

Related

How can I check if every single int in a randomly generated array is even and make it create another random array if it's not?

So I'm trying to create a program that creates a randomly generated array with numbers between 0 and 10.
Every time a number inside the 4x4 array is odd I want it to generate a brand new array and print every array discarded aswell until it creates a 4x4 array with only even numbers.
The problem right now is that I can't understand how to fix the last for and make it work properly with the boolean b that is supposed to restart the creation of the array.
import java.util.Scanner;
public class EvenArrayGenerator {
public static void main(String a[]) {
Boolean b;
do {
b = true;
int[][] Array = new int[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++)
Array[i][j] = (int) (Math.random() * 11);
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
System.out.print(Array[i][j] + " ");
}
System.out.println();
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (Array[i][j] % 2 != 0)
b = false;
}
}
} while (b);
}
}
public class ArrayGen {
private int[][] array = new int[4][4];
private int iterations = 1; // you always start with one iteration
public static void main (String[] args) {
ArrayGen ag = new ArrayGen();
ag.reScramble();
while(!ag.isAllEven()) {
ag.reScramble();
ag.iterations++;
}
// this is just a nice visualisation
for (int i = 0; i < 4; i++) {
System.out.print("[");
for (int j = 0; j < 4; j++) {
System.out.print(ag.array[i][j] +((j != 3)? ", " : ""));
}
System.out.print("]\n");
}
System.out.println(ag.iterations + " iterations needed to get all-even array.");
}
private void reScramble () {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
array[i][j] = (int)(Math.random() * 11);
}
}
}
private boolean isAllEven () {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (array[i][j] % 2 == 1) {
return false;
}
}
}
return true;
}
}
I think this is a good solution. Refactoring your code into structured methods is never a bad idea. I hope this helps!
You are looping until you get an array that's all even. You should initialize b to be false, and update it to true in the (nested) for loop. Note that once's you've set it to false, there's no reason checking the other members of the array, and you can break out of the for loop.
Note, also, that using stream could make this check a tad more elegant:
b = Arrays.stream(arr).flatMapToInt(Arrays::stream).anyMatch(x -> x % 2 != 0)
What about generating random numbers up to 5 and double it? Then you don't have two check if they are even.
Instead of your last for loop:
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(Array[i][j] % 2!=0){
b=false;
break;
}
}
if(!b){
break;
}
}
if(!b){
break;
}
Alternatively, you could do an oddity check when you are generating the elements. Something like:
int element;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
do{
element = (int)(Math.random()*11);
}while(element % 2 !=0)
Array[i][j] = element;
}
}
That way you don't have to check the values, they will always be even.
This should work:
import java.util.Scanner;
public class EvenArrayGenerator{
public static void main(String a[]){
boolean anyOdd;
int array = 0;
do{
System.out.println ("Array " + ++array + ":");
anyOdd=false;
int[][] Array = new int[4][4];
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
Array[i][j] = (int)(Math.random()*11);
}
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
System.out.print(Array[i][j] + " ");
}
System.out.println();
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
anyOdd |= Array[i][j] % 2!=0;
}
}
} while(anyOdd);
}
}
As you can see, I just modified the condition from b to anyOdd, so if there is any odd number, it will iterate again.
Also, you can check it when you generate the random numbers, so you avoid a second loop:
import java.util.Scanner;
public class EvenArrayGenerator{
public static void main(String a[]){
boolean anyOdd;
int array = 0;
do{
System.out.println ("Array " + ++array + ":");
anyOdd=false;
int[][] Array = new int[4][4];
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
Array[i][j] = (int)(Math.random()*11);
anyOdd |= array[i][j] % 2 != 0;
}
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
System.out.print(Array[i][j] + " ");
}
System.out.println();
}
} while(anyOdd);
}
}
public class EvenArrayGenerator {
public static void main(String a[]) {
int[][] arr = createAllEvenArray(4);
printArray(arr);
}
private static int[][] createAllEvenArray(int size) {
while (true) {
int[][] arr = createArray(size);
printArray(arr);
if (isAllEven(arr))
return arr;
}
}
private static int[][] createArray(int size) {
int[][] arr = new int[size][size];
for (int i = 0; i < arr.length; i++)
for (int j = 0; j < arr.length; j++)
arr[i][j] = (int)(Math.random() * 11);
return arr;
}
private static void printArray(int[][] arr) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (j > 0)
System.out.print("\t");
System.out.format("%2d", arr[i][j]);
}
System.out.println();
}
System.out.println();
}
private static boolean isAllEven(int[][] arr) {
for (int i = 0; i < arr.length; i++)
for (int j = 0; j < arr.length; j++)
if (arr[i][j] % 2 != 0)
return false;
return true;
}
}

Java out patterns

I'm currently trying to get this output using nested loops:
For the life of me I cannot figure out how to get the # signs to increment by +2 each time. Any help would be greatly appreciated!
public class PrintPatterns {
public static void main(String[] args) {
pattern1();
}
private static void pattern1() {
for (int i = 1; i <= 10; i++) {
for (int j = 0; j < 10; j += 2); {
System.out.print("# ");
}
for (int j = 0; j < 2; j++) {
System.out.print(". ");
}
for (int j = 1; j < 10 - i; j++) {
System.out.print("x ");
}
System.out.println();
}
}
}
This code does what you want:
private static void pattern1() {
StringBuilder stringBuilder = new StringBuilder();
for (int ats = 2; ats <= 10; ats += 2) {
for (int j = 0; j < ats; j++) {
stringBuilder.append("# ");
}
stringBuilder.append(". . ");
for (int j = 0; j <= 10 - ats; j++) {
stringBuilder.append("x ");
}
stringBuilder.append("\n");
}
System.out.println(stringBuilder.toString());
}
One mistake you did in your code is that you put a ; after your for loop, this will end the loop right there.
Also do not use System.out.println() in loops. As using IO will slow down your application. Use StringBuilder to build strings and then output all at once.
Instead of:
for (int j = 0; j < 10; j += 2); {
System.out.print("# ");
}
Try:
for (int j = 0; j < 2 * i; j += 1) {
System.out.print("# ");
}
public class PrintPatterns
{
public static void main(String[] args)
{
pattern1();
}
private static void pattern1()
{
for(int i = 1; i <= 10; i++)
{
for(int j = 1; j < i+2; j++)
{
System.out.print("# ");
}
for(int j = 0; j < 2; j++)
{
System.out.print(". ");
}
for(int k = 10-i; k > 0; k--)
{
System.out.print("x ");
}
System.out.println();
}
}
}

How can i create these shapes with java

package assignment.pkg3;
import java.util.Scanner;
public class Assignment3 {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("What integer length do you want: ");
int length = stdIn.nextInt();
for (int i = 0; i < length; i++) {
for (int j = ((length - 1) - i); j > 0; j--) {
System.out.print(" ");
}
for (int a = 0; a <= i; a++) {
System.out.print("*");
}
System.out.println();
}
for (int i = 0; i < length; i++) {
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
for (int a = length; a > i; a--) {
System.out.print("*");
}
for (int b = (length - 1); b > i; b--) {
System.out.print("*");
}
System.out.println();
}
for (int i = 0; i < length; i++) {
for (int j = 0; j <= i; j++) {
for (int k = 0; k < i; k++) {
System.out.print(" ");
}
for (int a = 0; a <= i; a++) {
System.out.print("*");
}
System.out.println();
}
}
}
}
Hi, I need help making this 3rd shape.. I don't even know how to start it. I did the other 3 pretty well. (except I have the spaces wrong on shape D). Can anyone help me find somewhere to start. (BTW I'm in a beginner java class so I can't put anything in there that we haven't learned. So sticking to for loops is basically all we can essentially use lol)
Here is link to pic
Try to execute this one & check -
for (int i = 0; i < length/2; i++){
for (int j = 0; j < length; j++){
System.out.print("*" + " ");
}
System.out.println("");
for (int k = 0; k < length-1; k++){
System.out.print(" " + "*");
}
System.out.println("");
}
Hope this will solve your problem.

I need help writing a program that prints out two shapes on one line using nested loops

Here is what the shapes should look like :
Here is my code so far:
public class Diamonds {
public static void main(String[] args) {
for (int i = 1; i < 10; i += 2) {
for (int j = 0; j < 9 - i / 2; j++) {
System.out.print(" ");
}
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.print("\n");
}
for (int i = 7; i > 0; i -= 2) {
for (int j = 0; j < 9 - i / 2; j++) {
System.out.print(" ");
}
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.print("\n");
}
}
}
I am having trouble getting the second shape
In order to not spoil your fun with this problem, I will explain what you need to do without writing any code.
To get the second shape in there, you would need to add two additional nested for loops into each of the two "outer" loops that you already have.
Loops number three will produce a fixed number of spaces. Note that the distance between the right edge of the first shape and the left edge of the second shape is constant, so your third loops will be easy to code up.
Loops number four will loop like your first loop, but they would change places: the first inner loop from the first outer loop will be the forth inner loop in the second outer loop, and vice versa.
By examining the shape on the right, we can notice that for each N asterisks on the line in the left shape, the right one has 10 - N, so, taking your code and extending it, we can get:
public class Diamonds {
public static final String SPACE = " ";
public static void main(String[] args) {
for (int i = 1; i < 10; i += 2) {
for (int j = 0; j < 9 - i / 2; j++)
System.out.print(" ");
for (int j = 0; j < i; j++)
System.out.print("*");
System.out.print(SPACE);
for (int j = 0; j < 10 - i; j++)
System.out.print("*");
System.out.print("\n");
}
for (int i = 7; i > 0; i -= 2) {
for (int j = 0; j < 9 - i / 2; j++)
System.out.print(" ");
for (int j = 0; j < i; j++)
System.out.print("*");
System.out.print(SPACE);
for (int j = 0; j < 10 - i; j++)
System.out.print("*");
System.out.print("\n");
}
}
}
And if we extract some common code:
public class Diamonds {
public static final String SPACE = " ";
public static void main(String[] args) {
for (int i = 1; i < 10; i += 2) {
drawLine(i);
System.out.print("\n");
}
for (int i = 7; i > 0; i -= 2) {
drawLine(i);
System.out.print("\n");
}
}
private static void drawLine(int i) {
for (int j = 0; j < 9 - i / 2; j++)
System.out.print(" ");
for (int j = 0; j < i; j++)
System.out.print("*");
System.out.print(SPACE);
for (int j = 0; j < 10 - i; j++)
System.out.print("*");
}
}
public class ReverseDiamond {
public static void main(String[] ar) {
int rows = 10;
ReverseDiamond diamond = new ReverseDiamond();
for(int i = 0; i < rows; i++)
diamond.printLine(rows, i);
for(int i = rows - 2; i >= 0; i--)
diamond.printLine(rows, i);
}
private void printLine(int rows, int currRow) {
for(int space = 1; space <= currRow; space++)
System.out.print(" ");
for(int star = 1; star < 2 * (rows - currRow); star++)
System.out.print("*");
System.out.println();
}
}
You may like that :
public class Diamonds {
public static void main(String[] args) {
int totalStars = 9;
int rows = 9;
for (int r = 0,stars=-1,gap=totalStars; r < rows; r++ ) {
stars+= (r<=rows/2) ?2:-2;
gap=totalStars-stars;
printChars(' ', gap);
printChars('*', stars);
printChars(' ', gap);
int gap2=stars+1;
int stars2=gap+1;
printChars(' ', gap2);
printChars('*', stars2);
printChars(' ', gap2);
System.out.println();
}
}
private static void printChars(char c ,int times) {
for (int i = 0; i < times; i++) {
System.out.print(c);
}
}
}
try this :
public static void main(String[] args) {
for (int i = 9; i > 0; i -= 2) {
for (int j = 0; j < 9 - i / 2; j++)
System.out.print(" ");
for (int j = 0; j < i; j++)
System.out.print("*");
System.out.print("\n");
}
for (int i = 2; i < 10; i += 2) {
for (int j = 0; j < 9 - i / 2; j++)
System.out.print(" ");
for (int j = 0; j <= i; j++)
System.out.print("*");
System.out.print("\n");
}
}
output :
*********
*******
*****
***
*
***
*****
*******
*********

Why does my program produce no output while it's compiling fine?

I want to create a two dimensional array. I am able to compile but not able to run
public class Arraytest1 {
public static void main(String[] args) {
int i, j, k = 0;
int test[][] = new int[4][5];
for (i = 0; i < 4; i++) {
for (j = 0; j < 5; j++) {
test[i][j] = k;
k++;
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 5; k++)
System.out.print(test[i][j] + " ");
System.out.println();
}
}
}
You have an endless loop: for(j=0;j<5;k++), you have to write for(j=0;j<5;j++)
You increment k instead of j
You have an endless loop. You are incrementing k instead of j:
for(j=0;j<5;k++)
You should change it both times to
for(j=0;j<5;j++)
Here... this should work. Just change your sub-loops making it j++ instead of k++ both top and bottom
public static void main(String[] args) {
int i, j, k = 0;
int test[][] = new int[4][5];
for (i = 0; i < 4; i++) {
for (j = 0; j < 5; j++) {
test[i][j] = k;
k++;
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 5; j++)
System.out.print(test[i][j] + " ");
System.out.println();
}
}
I think you've mixed up the k and j variables in the second for-loop "block". When I alter it to:
...
for (i = 0; i < 4; i++) {
for (j = 0; j < 5; j++)
System.out.print(test[i][j] + " ");
System.out.println();
}
...
I get the following printed to my console:
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
Is it what you wanted?
public class Arraytest1 {
public static void main(String[] args) {
int i, j, k = 0;
int test[][] = new int[4][5];
for (i = 0; i < 4; i++) {
for (j = 0; j < 5; j++) {
test[i][j] = k;
k++;
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 5; j++) {
System.out.print(test[i][j] + " ");
System.out.println();
}
}
}
}
you can resolve this problem

Categories