What I am misunderstanding with code that prints a pyramid? - java

My code is supposed to make a pryamid. The example below, however, is supposed to have another A character at the end, like the second example.
ABCDDCBA
ABCCBA
ABBA
AA
ABCDDCBA
ABCCBA
ABBA
AA
A
This is my code. It starts with ABCDDCBA, and removes the characters in the middle each time. So ABCDDCBA would be ABCCBA as the Ds get removed. However, when there are two characters (always the same) the code is supposed to remove one, but it doesn't.
public static void pyramid(int n)
{
int i, j, num, gap;
// outer loop to handle number
// of rows n in this case
for (i = n; i >= 0; i--) {
// inner loop to create right triangle
// gaps on left side of pyramid
for (gap = n - 1; gap >= i; gap--) {
System.out.print(" ");
System.out.print(" ");
}
// initializing value corresponding to ASCII value of 'A'
num = 'A';
// loop to print characters on
// left side of pyramid
for (j = 1; j <= i; j++) {
System.out.print((char)num++ + " ");
}
// loop to print characters on
// right side of pyramid
for (j = i - 0; j >= 1; j--) {
System.out.print((char)--num + " ");
}
System.out.println("");
}
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
pyramid(n);
}
Please help me. :(

You have a typo in your code:
for (j = i - 0; j >= 1; j--) {
should be
for (j = i - 1; j >= 1; j--) {

Related

Number Triangles with alternating number

Hello All,
I was wondering if someone could help me with making a number triangle in Java that looks like the one below using nested while loops. Would someone be able to help me out?
4
56
789
1234
56789
I have a variable 'i' on the outer loop determining how many rows the triangle will be and a variable 'j' on the inner loop determine which number the triangle will begin with. the numbers have to stay between [1-9].
Can anyone help me out?
Try This, It Will Work... It accepts rows & number through user and in first for loop it runs the loop till the number of rows and second loop print the number as per the value of I in pattern and if condition to check if the number is 10 then reset the number with 1 to start the numbering again.
import java.util.Scanner;
public class Pattern {
public static void main(String[] args) {
int rows, number = 1;
Scanner sc = new Scanner(System.in);
System.out.println("Enter no of rows");
rows = sc.nextInt();
System.out.println("Enter no to start with");
number = sc.nextInt();
for (int i = 1; i <= rows; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(number + " ");
++number;
if (number == 10) {
number = 1;
}
}
System.out.println();
}
}
}
Try.. r is for number of rows and v is the value
Scanner sc = new Scanner(System.in);
int r = sc.nextInt();
int v = sc.nextInt();
int i = v - 1;
int j = 1;
while(j != r + 1){
int k = 0;
int ans = 0;
while( k < j){
i = i + 1;
if(i == 10){
i = 1;
}
ans = ans * 10 + i;
k = k + 1;
}
System.out.println(ans);
j = j + 1;
}

Triangle of for loops

I am working on an assignment and I understand how to do the first part of the assignment but not the second.
Problem:
Write a program that ask the user to enter the size of a triangle (1 to 50), then print the triangle by printing a series of lines consisting of asterisks. The first line will have 1 asterisk, the next two will have two and so on, with each line having one more asterisk than the previous line up to the number entered by the user. On the next line print one less asterisk and continue by decreasing the number of asterisk by 1 for each successive line until any one asterisk is printed.
I can make the program print up ward however I don't know how to make it print downward. My professor says to use for loops.
import java.util.Scanner;
public class CS123Ass5ID5189 {
public static void main(String[] args) {
int size;
System.out.println("Enter Triangle size");
Scanner key = new Scanner(System.in);
size = key.nextInt();
System.out.println(size);
for (int i = 0; i < size; i++) {
for (int f = 0; f < i; f++) {
System.out.print("*");
}
System.out.println("*");
}
for (int i = 0; i > size; i--) {
for (int f = 0; f > i; f--) {
System.out.println("*");
}
System.out.println("*");
}
}
}
Supposed to look something like
*
**
***
**
*
Your answer is almost there. You just need the second outer loop to count down from size to zero in the outer loop, and do the same thing.
for (int i = size - 1; i > 0; i--)
So the first loop goes from 0 to size, and this loop goes from (size - 1) to 0.
for (int i = size - 1; i > 0; i--) {
// This section is exactly the same as in the first loop
for (int f = 0; f < i; f++) {
System.out.print("*");
}
System.out.println("*");
}
Edit
To limit the input number to 50, check it in another loop. While the user has entered an invalid number, tell them, and ask for another one. Add this just after you get the initial number:
while (size < 0 || size > 50)
{
System.out.print("Size must be between 0 and 50. Try again: ");
size = key.nextInt();
}
Your second loop is wrong, it should be for i>0. Also, start at 1, not 0 and print like this:
for (int i = 1; i <= size; i++) {
for (int f = 0; f < i; f++) {
System.out.print("*");
}
System.out.println();
}
for (int i = size-1; i > 0; i--) {
for (int f = 0; f < i; f++) {
System.out.print("*");
}
System.out.println();
}
Your inner loop should still be counting up to the value of i. This should do what you need.
For loops can begin at any value, not just zero. This allows you to start at size and decrement all the way down to zero.
Here is an example of what you are looking for. (It links to an online executable to demonstrate the code below.)
public class Main
{
public static void main (String[] args)
{
int size = 10;
System.out.println(size);
for (int i=0; i<size-1; i++)
{
for (int f=0; f<i; f++)
{
System.out.print("*");
}
System.out.println("*");
}
for (int i=size-1; i>=0; i--)
{
for (int f=i; f>0; f--)
{
System.out.print("*");
}
System.out.println("*");
}
}
}
P.S. Your second inner for loop should have System.out.print not System.out.println to keep all the asterisks on one line.
Your first loop looks fine, but look at the second loop.
for (int i = 0; i > size; i--) {
for (int f = 0; f > i; f--) {
System.out.println("*");
If size is greater than 0, the outer for-loop won't be entered. Fix that by setting i = size - 1, then loop until i > 0 and i-- to decrease i in each loop.
The inner for loop has a similar problem, it should be the exact same and the previous inner loop. Also exact same in the usage of System.out.print instead of System.out.println. Otherwise, the triangle will print vertically for the bottom half.
FWIW - It's easier to read if you make small methods to clearly show your intention.
private static void printStarLine(int howManyStars) {
for (int i = 0; i < howManyStars; i++) {
System.out.print("*");
}
System.out.println();
}
public static void main(String[] args) {
Scanner key = new Scanner(System.in);
int size = 3; // some number in the range 1-50
do {
System.out.println("Enter Triangle size (1-50)");
size = key.nextInt();
} while (size < 1 || size > 50);
for (int stars = 1; stars < size; stars++) {
printStarLine(stars);
}
printStarLine(size);
for (int stars = size - 1; stars > 0; stars--) {
printStarLine(stars);
}
}
for(i=1; i<=n; i++)
{
for(j=1; j<=i; j++)
{
System.out.print("*");
}
System.out.println();
}
for(i=n; i>=1; i--)
{
for(j=1; j<i; j++)
{
System.out.print("*");
}
System.out.println();
}
this works

writiting the code with the appropriate variable values

I should Write a program Square.java that declares and initalizes a variable n (with n ≥ 2) and prints out a two dimensional n-by-n triangular pattern as shown below (where n=6).
public class Square {
public static void main (String[]args){
for (int Line=1; Line<= 6; Line ++){
for (int n=1; n<= (Line-1*1); n++) {
System.out.print ("# ");
}
for (int n=1; n<= (7-Line); n++){
System.out.print ("$ ");
}
System.out.println ("");
}
}
}
I can't manage to write the code with n>=6 or n=2
I am guessing you are forgetting to update the 7 when you change the 6. Put your size in a variable as shown below. Seems to work for me for 2 and any other size
public static void main(String[] args) {
int size = 6;
for (int Line = 1; Line <= size; Line++) {
for (int n = 1; n <= (Line - 1 * 1); n++) {
System.out.print("# ");
}
for (int n = 1; n <= ((size + 1) - Line); n++) {
System.out.print("$ ");
}
System.out.println("");
}
}
The size of the square must be an attribut of the class
The result :
public class Square {
public int size;
public Square(int size) {
this.size = size;
}
public void goSquare(){
for (int line=1; line<= size; line++){
for (int n=1; n<= (line-1); n++) {
System.out.print ("# ");
}
for (int n=1; n<= ((size+1)-line); n++){
System.out.print ("$ ");
}
System.out.println ("");
}
}
public static void main (String[]args){
Square square = new Square(6);
square.goSquare();
}
}
In your actual code 7-Line is what blocks values >=6 and for value =2 your code works great but it only prints one element(point).
Another thing if you use Line-1*1 you mean (Line-1)*1 which is equivalent to write Line-1.
Also in 7-Line the value 7 should be an attribute to be used in the first loop too in Line <= 7, you can see it in this working code:
int max = 2;
for (int Line = 1; Line <= max; Line++) {
for (int n = 1; n <= (Line - 1); n++) {
System.out.print("# ");
}
for (int n = 1; n <= (max - Line); n++) {
System.out.print("$ ");
}
System.out.println("");
}
And this is an Ideone Working Example of the code.

I'm having trouble making a diamond shape with loops

You have an input of n and that represents half the rows that the diamond will have. I was able to make the first half of the diamond but I'm EXTREMELY frustrated with the second half. I just can't seem to get it. I'm not here to ask for specific code I need, but can you point me in the right direction and give me some tips/tricks on how to write this? Also, if I'm going about this program the wrong way, feel free to tell me and tell me on how I should approach the program.
The diamonds at the bottom represent an input of 5. n-1 represents the spaces to the left of each asterisk. Thank you for your help!
public static void printDiamond(int n)
{
for(int i=0;i<n;i++)
{
for(int a=0;a<(n-(i+1));a++)
{
System.out.print(" ");
}
System.out.print("*");
for(int b=0; b<(i*2);b++)
{
System.out.print("-");
}
System.out.print("*");
System.out.println();
}
}
** What I need ** What I have currently
*--* *--*
*----* *----*
*------* *------*
*--------* *--------*
*--------*
*------*
*----*
*--*
**
public static void main(String[] args) {
int n = 10;
for (int i = 1 ; i < n ; i += 2) {
for (int j = 0 ; j < n - 1 - 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");
}
}
output
*
***
*****
*******
*********
*******
*****
***
*
Just reverse your loop :
for(int i=n-1;i>=0;i--)
{
for(int a=0;a<(n-(i+1));a++)
{
System.out.print(" ");
}
System.out.print("*");
for(int b=0; b<(i*2);b++)
{
System.out.print("-");
}
System.out.print("*");
System.out.println();
}
Since you have half the diamond already formed, simply run the loop again, in reverse, eg:
public static void printDiamond(int n)
{
for (int i = 0; i < n; i++)
{
for (int a = 0; a < (n - (i + 1)); a++)
{
System.out.print(" ");
}
System.out.print("*");
for (int b = 0; b < (i * 2); b++)
{
System.out.print("-");
}
System.out.print("*");
System.out.println();
}
for (int i = n-1; i >= 0; i--)
{
for (int a = 0; a < (n - (i + 1)); a++)
{
System.out.print(" ");
}
System.out.print("*");
for (int b = 0; b < (i * 2); b++)
{
System.out.print("-");
}
System.out.print("*");
System.out.println();
}
}
Whenever I see a symmetry of a kind, recursions ring to my head. I'm posting only for you and others interesting into learning more. When beginning, recursions can harder to grasp but since you already have loop based solutions, contrasting against recursion will clearly outline advantages and disadvantages. My advice, don't miss out on the chance to get into it :)
A recursive solution:
static int iteration = 0;
public static void printDiamond(int n) {
int numberOfBlanks = n - iteration;
int numberOfDashes = iteration * 2;
String blank = new String(new char[numberOfBlanks]).replace("\0", " ");
String dash = new String(new char[numberOfDashes]).replace("\0", "-");
String star = "*";
String row = blank + star + dash + star + blank;
// printing the rows forward
System.out.println(row);
iteration++;
if (iteration < n) {
printDiamond(n);
}
// printing the rows backward
System.out.println(row);
}
first, don't get confused with the strange new String(new char[numberOfBlanks]).replace("\0", " "); its a neat trick in java to construct a string with repeated chars, eg new String(new char[5]).replace("\0", "+"); would create the following String +++++
The recursion bit explained. The second println won't run until the recursion is stopped. The stop criteria is defined by iteration < n. Up until that point the rows up until that point will be printed. So something like this:
iteration 1. row = **
iteration 2. row = *--*
iteration 3. row = *----*
iteration 4. row = *------*
iteration 5. row = *--------*
than the recursion stops, and the rest of the code is executed but in reversed order. So only the second println is printed, and the value of row variable is like as follows
continuing after 5 iteration row = *--------*
continuing after 4 iteration row = *------*
continuing after 3 iteration row = *----*
continuing after 2 iteration row = *--*
continuing after 1 iteration row = **
I didn't go into mechanics behind it, plenty of resource, this is just to get you intrigued. Hope it helps, best

Beginner in Java - Controlling output - Generating Asterix

I am having difficulties with completing this program. I am trying to make a program that creates asteriks, but then makes it into a triangle.
This is what I have already.
public class 12345 {
public static void main(String[] args) {
int n = 0;
int spaces = n;
int ast;
System.out.println("Please enter a number from 1 - 50 and I will draw a triangle with these *");
Scanner keyboard = new Scanner(System.in);
n = keyboard.nextInt();
for (int i = 0; i < n; i++) {
ast = 2 * i + 1;
for (int j = 1; j <= spaces + ast; j++) {
if (j <= spaces)
System.out.print(' ');
else
System.out.print('*');
}
System.out.println();
spaces--;
}
}
}
It is creating the asteriks, but how would I be able to continue them where they make a triangle... so they get bigger as they go, and then back smaller...
Thank you in advance!
Try moving
int spaces = n;
to AFTER the value of n is read from stdin.
This solves half your problem and hopefully gets you on the right track.
I added a few things to your code and got it to print the full triangle, where the number input in the scanner will be the number of asterisks printed in the bottom row. I.e. if the input is 3, the triangle will be two rows of 1->3; if the input is 5 then the triangle will be 3 rows of 1->3->5, and so on.
public static void main(String[] args) {
int ast;
int reverse = 1;
System.out.println("Please enter a number from 1 - 50 and I will draw a triangle with these *");
Scanner keyboard = new Scanner(System.in);
int spaces = keyboard.nextInt();
for (int i = 0; i < spaces; i++) {
ast = 2 * i + 1;
for (int j = 1; j <= spaces + ast; j++) {
if (j <= spaces) {
System.out.print(' ');
} else {
System.out.print('*');}
if (j > spaces + ast) {
for (int k = 0; k < spaces-(reverse-1); k++) {
System.out.print(' ');
}
}
int k = 0;
reverse++;
}
System.out.println();
spaces--;
}
}
}
I added another if statement after your if-else that triggers when the variable j exceeds the first loop condition. This triggers another loop that makes the output lines symmetrical by essentially repeating your first if statement.
I hope this helps =)

Categories

Resources