Finishing a triangle with loops - java

I'm trying to make a right sided triangle that looked like this in Java with loops:
+
/|
/ |
/ |
/ |
+----+
The program needed the args as an int to determine the size of each of the triangle's sides. Now this is my code so far:
public static void main(String[] args) {
int x = Integer.parseInt(args[0]);
for (int i = 0; i <= x; i++) {
for (int j = x; j >= i; j--) {
System.out.print(" ");
}
System.out.println("/");
}
System.out.print("+");
for (int j = 0; j < x; j++) {
System.out.print("-");
}
System.out.print("+");
}
And the result so far is this
/
/
/
/
+---+
So how should I approach this? I tried some combination of for loops, but so far it often prints out a mangled mess of a shape rather than an actual triangle.

You are almost there: in the nested loop where you print '/', replace println with print. Add a second loop that prints x-j spaces, then print |. Finally, add a statement to print + before entering the first loop. That would be it!
To optimize your code, consider writing a helper method:
void printN(String str, int numTimes) {
// Prints numTimes copies of str
}
This way you would be able to "flod" several loops into a single call of printN. For example,
for (int j = x; j >= i; j--) {
System.out.print(" ");
}
would become
printN(" ", x-i);

To get the correct amount of spaces for your pipe symbol you need to add one more for loop.
Within this for loop you are going to set the iteration counter equal to your outside loop iteration counter. Then within the for loop you are going to use a String Builder. On each loop you will add a space to the string builder. Then, once the final space has been added you will put the / in the spaces and the | on the end.
That is the most I will give for an obvious school question. The only way to learn is to do friend.

public static void main(String[] args) {
int x = Integer.parseInt(args[0]);
for (int j = x+1; j >= 0; j--) {
System.out.print(" ");
}
System.out.println("+");
for (int i = 0; i <= x; i++) {
for (int j = x; j >= i; j--) {
System.out.print(" ");
}
System.out.print("/");
for (int k = 0; k < i; k++) {
System.out.print(" ");
}
System.out.println("I");
}
System.out.print("+");
for (int j = 0; j < x+1; j++) {
System.out.print("-");
}
System.out.print("+");
}

Related

Can't figure out For Loop

I have recently started java, so I unfortunately am terrible at this. I have an question about a for loop question that was asked in my class today, but I can't figure out a part of it.
We were supposed to print out:
__1__
_333_
55555
with only for loops.
I have started the code but can't figure out what to do to print out the numbers, though I figured out the spaces.
public class Question{
public static void main(String [] args){
for(int j=1; j<=3;j++){
for(int i=1; i<=3-j; i++){
System.out.print(" ");
}
for(int k=?; k<=?; k??){
System.out.print(???);
}
for(int m=1; m<=3-j; m++){
System.out.print(" ");
}
System.out.println();
}
The question mark are the place where I don't know what goes in there.
Thanks.
You can do something like this,
class Main {
public static void main(String[] args) {
int i, j, k;
for (i = 1; i <= 3; i++) {
for (j = 2; j >= i; j--) {
System.out.print("_");
}
for (k = 1; k <= (2 * i - 1); k++) {
System.out.print(i * 2 - 1);
}
for (j = 2; j >= i; j--) {
System.out.print("_");
}
System.out.println();
}
}
}
The first for loop will print the _ before the number, second one will print the number and 3rd one will print the _ after the number
The values are changing by two each time j increments, that leads to the formula 1 + (2 * (j - 1)) which is how you can finish your loops. Like,
for (int j = 1; j <= 3; j++) {
for (int i = 1; i <= 3 - j; i++) {
System.out.print(" ");
}
int n = 1 + (2 * (j - 1));
for (int k = 1; k <= n; k++) {
System.out.print(n);
}
for (int m = 1; m <= 3 - j; m++) {
System.out.print(" ");
}
System.out.println();
}
Outputs
1
333
55555
Thanks everyone for helping. I figured out the answer.
public class Welcome {
public static void main(String [] args){
for(int j=1; j<=3;j++){
for(int i=1; i<=3-j; i++){
System.out.print(" ");
}
for(int k=1; k<=(2*j-1); k++){
System.out.print(2*j-1);
}
for(int m=1; m<=3-j; m++){
System.out.print(" ");
}
System.out.println();
}
}
}
This can also be achieved as below
public class ForLoopPrinter {
public static void main(String[] args) {
int number = 1;
int row = 3;
int column = 5;
char space = '_';
for(int i = 1; i <= row; i++){
for(int j = 1; j <=column;j++){
int offset = (column - number)/2;
if( j <= offset ||
j > (number + offset)){
System.out.print(space);
}else{
System.out.print(number);
}
}
System.out.println();
number += 2;
}
}
}
Here number of For loops are limited to 2 (one for row and one for column).
Logic goes like this -
offset provides you number of spaces to be printed at both sides of number.
first if condition checks if j (position) is below or above offset and if true it prints underscore and if false it prints number
I know that right answer has been given for this question and it will work like charm. I just tried to optimise code by reducing number of For Loops in answers provided before. Reduction of For loop will improve performance.
Apart from reduction of For loops, this code has following advantage
- This code is more scalable. Just change row, column values (e.g. 5,9) or space char to '*' and check output. You can play with it.
I would suggest you to go with answer given by #Sand to understand For loop and then check this answer to understand how you can optimise it.

For Loops and Characters

I'm learning for loops and am having a hard time understanding how to print these characters out
##..XXXXXXXXX
####..XXXXXXX
######..XXXXX
########..XXX
Here is my attempt:
for(int i = 0; i < 10; i++){
for(int j = 12; j > 10-i; j-=2)
{
System.out.print("#");
}
for(int j = 0; j < i-2; j++){
System.out.print("..");
}
for(int j =9; j < i; j-=3){
System.out.print("X");
}
System.out.println();
}
so the # adds two every time.
.. stays at two.
X adds 3.
Thanks for taking the time to look at this.
You need to figure out the pattern of #, . and X. There are total 4 lines. Let's say from line 0 to line 3. For each line i.
number of #: 2, 4, 6, 8 → 2i+2
number of .: 2, 2, 2, 2 → 2
number of X: 9, 7, 5, 3 → -2i+9
So the code should follow the pattern we discovered.
for (int i=0; i<4; ++i) {
for (int j=0; j<2*i+2; ++j) System.out.print("#");
for (int j=0; j<2; ++j) System.out.print(".");
for (int j=0; j<-2*i+9; ++j) System.out.print("X");
System.out.println();
}
So, before you start coding. Make sure you know what you are going to do, find out the pattern of the problem you are solving, check the algorithm you are going to implement.
sometimes it is easier if you split it out to different method
public static void main(String[] args){
for (int x = 0; x < 4; x++) {
printPattern1 (x + 1);
printPattern2 (x);
}
}
private static void printPattern1(int x) {
while (x-- > 0) {
System.out.print("##");
}
System.out.print("..");
}
private static void printPattern2(int x) {
for (int y=0; y < (-2 * x+9); y++){
System.out.print("X");
}
}
So here's what I understand to your question:
//Input: n=12 ---- so that we can have, for the last sequence, 10 '#' consecutively
public class ForLoop {
public static void main(String []args) {
int n = 12;
for(int i = 2; i < n; i+=2){
for(int j = 0; j < i; j++){
System.out.print("#");
}
System.out.print("..");
for(int k = n; k > i + 1; k--){
System.out.print("X");
}
}
}
}

using java for loop with user input to make custom diamond

I am looking to make a diamond like this:
n=2
*
*$*
*
n=3
*
*$*
*$*$*
*$*
*
n=4
*
*$*
*$*$*
*$*$*$*
*$*$*
*$*
*
I can get the diamond with just * but cannot figure out how to add the $ in the mix
My code is as follows:
import java.util.Scanner;
public class ForNestedDemo
{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Please input number of lines:");
int i = 0, j, k, n;
n = scan.nextInt();
for (k = 1; k <= (n + 1) / 2; k++) {
for (i = 0; i < n - k; i++) {
System.out.print(" ");
}
for (j = 0; j < k; j++) {
System.out.print("*$ ");
}
System.out.println("");
}
for (k = ((n + 1) / 2); k < n; k++) {
for (i = 1; i < k; i++) {
System.out.print(" ");
}
for (j = 0; j < n - k; j++) {
System.out.print(" *");
}
System.out.println("");
}
scan.close();
}
}
I agree that #GhostCat is the easiest way to go, but just for fun I figured it out using your way.
for (k = 1; k < (n + 1); k++) {
for (i = 0; i < n - k; i++) {
System.out.print(" ");
}
for (j = 0; j < k; j++) {
if(j == 0)
if(k == n+1)
System.out.print("*");
else
System.out.print(" *");
else{
System.out.print("$*");
}
}
System.out.println("");
}
for (k = 1; k < n; k++) {
for (i = 0; i < k; i++) {
System.out.print(" ");
}
for (j = 0; j < n - k; j++) {
if(j == 0)
if(k == n+1)
System.out.print("*");
else
System.out.print(" *");
else{
System.out.print("$*");
}
}
System.out.println("");
}
I have fixed some of your errors and added some checks in there also.
The logic I have in place is:
If you are the first character, are you the middle row (k == n+1), if so, only print *, otherwise print _*.
If you are not the first character, print $*.
After that I just simply took my logic and pasted it down below in your lower half loop.
A simply way would be: instead of directly printing those "patterns", push them into string variables first - without thinking about $ signs. Just put the required spaces and *s into those strings.
Like:
" *"
" **"
"***"
Then, take those strings, and build the final strings from them: walk through each string, and when you find that str[index] and str[index+1] are '*' you simply put "*$" into your result string (otherwise you just copy the character at index).
Using that algorithm, the above strings turn into
" *"
" *$*"
"*$*$*"
And finally, you simply *copy** the upper lines down!
For the record: of course there are easy solutions that create the whole output in one shoot. But: you already got the loops in place that build lines that just miss the $ chars. So you can use my approach go get from your current code to a working solution easily.
You could do it as follows:
1. first print spaces
2. then print alternate '*' and '$' as per the order of the line.
public void printDiamonds(int n) {
//print the top part
for (int i = n-1; i > 0 ; i--) {
printDiamondLine(n, i);
}
//print the bottom part
for (int i = 0; i < n; i++)
printDiamondLine(n, i);
}
private void printDiamondLine(int n, int i) {
// i denotes the number of preceding spaces per line
for (int j=i; j>0; j--)
System.out.print(" ");
// print alternate * and $
for (int k=2*(n-i)-1; k>0; k--)
if (k%2==0)
System.out.print("$");
else
System.out.print("*");
System.out.println(); //print a new line at the end
}
Since this seems like homework, I normally wouldn't give the full code. But, the cat's out of the bag.
I would try to think of things in a simple mathematical manner and carefully look at the relationships between spaces, *s, and $s. When you do the code may come a little easier to write, simple, and cleaner.
There are always as many *s in a row as the row number
There are always one less as many $s as there are *s
There are always n - rowNum spaces in a row precedings the first character
There is a top, middle, and bottom to the shape based on these characteristics
Given that, I would start by writing a solution that would be easy to debug and very clean. The interesting part of my main would reflect the characteristics of the shape listed above:
printTop(1, 1, n);
printMiddle(n);
printBottom(n - 1, n - 1, n);
These methods would be defined as follows:
public static void printTop(int i, int j, int n) {
for (; n - j > 0; ++i, ++j) {
printLine(n - j, i);
}
}
public static void printMiddle(int stars) {
printLine(0, stars);
}
public static void printBottom(int i, int j, int n) {
for (; i >= 0; --i, --j) {
printLine(n - j, i);
}
}
The printLine() method prints a line/row of the shape given a number of spaces and *s. This is the part I would normally leave out but...
public static void printLine(int spaces, int stars) {
printSpace(spaces);
for (int i = 1; i <= (2 * stars - 1); ++i) {
if (i % 2 == 0) {
System.out.print('$');
} else {
System.out.print('*');
}
}
System.out.println();
}
I'm certain you can figure out what printSpace() is doing.
The benefit of this approach is it leads you towards what is inevitably going to be a primary goal of yours: decompose and modularize your code. This will become increasingly important as solutions become more complex. Good luck.
public static void main(String[] args) {
int n = 2;
int mid = (int) Math.ceil((n+n-1)/2.0);
String[] stringArray = new String[n];
for(int i = 0 ; i < n ; i++) {
StringBuilder sb = new StringBuilder();
for(int j = 2*i+1; j > 0; j--) {
if(j%2 == 0)
sb.append("$");
else
sb.append("*");
}
stringArray[i] = sb.toString();
}
for(int i = 0 ; i < n ; i++) {
for(int j = mid - stringArray[i].length()/2; j >0 ;j--) {
System.out.print(" ");
}
System.out.print(stringArray[i] + "\n");
}
for(int i = n-2 ; i >= 0 ; i--) {
for(int j = mid - stringArray[i].length()/2; j >0 ;j--) {
System.out.print(" ");
}
System.out.print(stringArray[i] + "\n");
}
}
Here you go. This code is not optimized in any way. Hope this gives you a general idea.

Nested for loops 0123

I need to create a nested for loops that gives the following output,
0
1
2
3
This is what I have, but for the second test, userNum is replaced by 6 and obviously my code fails.. help?
public class NestedLoop {
public static void main (String [] args) {
int userNum = 0;
int i = 0;
int j = 0;
for(i = 0; i <= userNum; i++){
System.out.println(i);
for(i = 1; i <= userNum; i++){
System.out.println(" " +i);
for(i = 2; i <= userNum; i++){
System.out.println(" " +i);
for(i = 3; i <= userNum; i++){
System.out.println(" " + i);
}
}
}
}
return;
}
}
I think (it's a guess, though) that you're looking for this.
public static void main (String [] args)
{
int limit = 6;
for(int i = 0; i <= limit; i++)
{
for(int j = 0; j < i; j++)
System.out.print(" ");
System.out.println(i);
}
}
The reason why your approach fails is, as I see it, that you are looping through the numbers to show (which is right) but you fail to loop up on the number of spaces (which I resolved by relating the inner loop's limit to the outer loop's current value.
Let's talk a bit about what your intention is with these loops.
The inner loop is meant to produce an arbitrary number of spaces, depending on what number you're iterating on. So if you're on number 0, you produce no spaces, and if you're on 1, you produce one space, and so forth. The other caveat is that they all must appear on the same line, so System.out.println is the incorrect choice.
You would want to use System.out.print to print out the spaces. So let's write that.
for(int j = 0; j < 6; j++) {
System.out.print(" ");
}
This will print out six spaces unconditionally. What that condition is depends on the current number we're iterating on. That comes from your outer loop.
You only need to define a loop that starts from an arbitrary starting point - like 0 - and then loop until you are at most your ending number. For this, your current loop is sufficient:
for(i = 0; i <= userNum; i++) {
}
Now, we need to bring the two pieces together. I leave the figuring out of the question mark and what to print after you've printed the spaces as an exercise to the user, bearing in mind that you must stop printing spaces after you've reached your number.
for(int i = 0; i <= userNum; i++) {
for(int j = 0; j < ?; j++) {
System.out.print(" ");
}
}
Let's analyse the task
In every line, we should print a number and different number spaces in the front of the number.
For that, we need two loops - one outer to iterate from 0 to N and one inner to add spaces in front of the number.
private static void method1(int userNum) {
int nummSpaces = 0;
for (int i = 0; i <= userNum; i++) {
for (int j = 0; j < nummSpaces; j++) {
System.out.print(" ");
}
nummSpaces++;
System.out.println(i);
}
}
In this solution, we have variable numSpaces which used to count the number of spaces in front of the number. It is unneeded - we can use variable i for that purpose.
private static void method2(int userNum) {
for (int i = 0; i <= userNum; i++) {
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
System.out.println(i);
}
}
Let's analyses once again the output
- the fist line: printed zero spaces and number 0
- the second line: printed one space and number 1
- the third line: printed two spaces and number 2
- and so on
Finally, we can use just one variable, which contains spaces and after that print the length of it:
private static void method3(int userNum) {
for (String spaces = ""; spaces.length() <= userNum; spaces += " ") {
System.out.println(spaces + spaces.length());
}
}
C/C++
#include <iostream>
using namespace std;
int main() {
int userNum;
int i;
int j;
cin >> userNum;
for (i = 0; i <= userNum; ++i) {
for (j = 0; j < i; ++j) {
cout << " ";
}
cout << i << endl;
}
return 0;
}

Making pattern using loops Java

I'm supposed to create some pattern - somewhat triangular - using for loop based on given number n.
For example, if given number n is 3, the pattern should be something like this :
**
*##*
*####*
And below is the piece of code I'm currently working on now.
public static void patterPrinters(int n) {
for (int k = 0; k < n; k++) {
for ( int x = n; x > k + 1; x--) {
System.out.print(" ");
}
for ( int z = n - k; z <= n; z++) {
System.out.print("**");
}
System.out.print("\n");
}
}
}
So far, I was able to make a similar shape, but of course, it is filled with stars (*) without the number signs(#) in between them. Like :
**
****
******
Could someone give me a hint as what I'm supposed to do from here?
public static void patterPrinters(int n) {
int i,j,k;
for( i=0;i<n;i++)
{
for(k=0;k<((n-1)-i);k++)
{
System.out.print(" ");
}
System.out.print("*");
for(j=0;j<(i*2);j++)
{
System.out.print("#")
}
System.out.print("*\n");
}
}
check this out.
All the Best.
HINT:
If you managed to print the correct shape, but with * only, you can easily fix this by printing a single * at the start and end of each row, and between them print x-2 #s, where x is the number of * you currently print in each row.
public static void patterPrinters(int n)
{
for (int k = 0; k < n; k++)
{
for (int x = n; x > k + 1; x--)
{
System.out.print(" ");
}
System.out.print("*");
for (int col = 0; col < k; col++)
{
System.out.print("##");
}
System.out.print("*\n");
}
}

Categories