Asking about the while loop inside nested for loop - java

Can anyone explain how it actually works? ive been carefully checking every single step with my note and all written down, and it does work fine, but why is the spot 4 all the time?when i init it with 0, it doesnt make sense to me...
here is the output
Random rand = new Random();
int[][] map = new int[row][column];
int spot = 0;
int i=0;
int j=0;
/*ignore this part
for(i = 0; i<map.length; i++){
for(j = 0; j<map[i].length; j++) {
map[i][j] = rand.nextInt(2);
}
System.out.println();
}*/
System.out.println();
for(i =0; i<map.length; i++){
for(j =0; j<map[i].length; j++){
if(map[i][j] == 1){
while(spot<4){
map[i][j] = 5;
spot++;
}
}
System.out.print(map[i][j]+" ");
}
System.out.print(spot);
System.out.println();
}
System.out.println();
}

This line:
System.out.print(spot);
Your array has only 4 members, but in printing the value of "spot" at the end of each line, you're printing 4 at the end of each line.
Edit: responding to your comment about increasing 'spot' only when a 1 is found:
if(map[i][j] == 1){
while(spot<4){ // <<<< you increase spot until it equals 4
map[i][j] = 5;
spot++;
}
}
If your intent is to count the number of occurrences of '1', you'll want to remove that nested while:
if(map[i][j] == 1){
map[i][j] = 5;
spot++;
}

I'm not sure what you are trying to do with spot, but this is you problem. The first time if(map[i][j] == 1) is true you are increasing spot to 4, so while(spot<4) won't be executed again. If you remove it it will work.
if(map[i][j] == 1){
map[i][j] = 5;
}
Edit
Base on the comments, if you want to replace only 4 1 you can extract the replacing to a method and return as soon as you swapped 4 1
public void replaceOnes(int[][] map) {
int spot = 0;
for(int i = 0 ; i < map.length ; i++){
for(int j = 0 ; j < map[i].length ; j++){
if(map[i][j] == 1){
map[i][j] = 5;
spot++;
if (spot == 4) {
return;
}
}
}
}
}
replaceOnes(map);
for(i = 0; i<map.length; i++){
for(j = 0; j < map[i].length; j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}

Related

draw figure(numbers) with for loops

I'm just getting started with Java and my teacher asked me to draw the following shape of numbers:
123456654321
2345665432
34566543
456654
5665
66
5665
456654
34566543
2345665432
123456654321
image
So far I was able to draw first line and part of the middle using this code:
int sz = 6;
for (int i =1;i<=sz;i++)
System.out.print(i);
for(int j =sz;j>1;j--)
System.out.print(j);
for(int i =1; i<=sz;i++){
System.out.println(i);
for(int j=0;j<=i;j++){
System.out.print(" ");
}
}
I'm having trouble the rest of the middle body.
Can anyone help me out drawing that one, by using nested for loops?
You have to go line by line,because after println(),you cannot go back there.
For the upper half of the pattern you can use this.
int sz = 6;
for(int d = 1;d<=sz;d++){
for (int i = d;i <= sz;i++) //for increasing numbers
System.out.print(i);
for(int j=sz;j>=d;j--) //for decreasing numbers
System.out.print(j);
System.out.println(); //for newline
for(int m=0;m<d;m++) // for spaces
System.out.print(" ");
}
First you build an array, then traverse the lines and build them:
int currentItem = 1;
int items[] = new int[12];
for (int index = 0; index < items.length; index++) {
items[index] = (index < 6) ? currentItem++ : currentItem--;
}
for (int index2 = 0; index2 < 12; index2++) {
String line = "";
int limit = (index2 < 6) ? index2 : (12 - index2);
for (int index3 = 0; index3 < items.length; index3++) {
line += ((index3 >= limit) && (index3 < items.length - limit)) ? " " : items[index3];
}
System.out.println(line);
}

replace every second line of my triangle with a blank line for loops

instead of getting a full triangle with 5 lines of "*" how do I replace every second line with a blank line, e.g. to look like this
5
555
55555
This is my code:
for(int i = 0; i < 5; i++) {
for(int j = i; j < 5; j++) {
System.out.print(" ");
}
for(int k = 0; k <= (i*2); k++) {
System.out.print("5");
}
System.out.println();
}
you need small modification in your code and you can get what you want.
for(int i = 0; i < 5; i++) {
for(int j = i; j < 5; j++) {
System.out.print(" ");
}
for(int k = 0; k <= (i*2); k++) {
if(i%2==0)
System.out.print("*");
}
System.out.println();
}
check it out.
Just test for i % 2
for(int i = 0; i < 5; i++) {
for(int j = i; j < 5; j++) {
System.out.print(" ");
}
for(int k = 0; k <= (i*2); k++) {
System.out.print(i % 2 == 0 ? "*" : " ");
}
System.out.println();
}
edit
If you want to print 5 instead or * then modify the code to use 5
Check this:
int num= 5; // 'num' denotes the number of lines
int numOfSpaces;
for(int i = 1; i <= num; i++) {
if( i%2 != 0) // checks whether the line number is odd. If odd, prints '*'
{
numOfSpaces = (num-i) / 2; // find the number of blank spaces
for(int j = 1; j <= numOfSpaces; j++) {
System.out.print(" ");
}
for(int k = 1; k <= i; k++) { // number of '*'s to be printed = current line number = i
System.out.print("*");
}
System.out.println();
}
else{
System.out.println(); // leaves every second line blank (ie.,if line number is even.)
}
}
//try this code. It may help you to achieve your output
[Check screen shot for the output of the below code][1]
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5 - i; j++)
{
System.out.print(" ");
}
for (int k = 0; k <= i; k++)
{
if(i%2!=0)
{
System.out.print(" ");
}
else{
System.out.print("* ");
}
}
System.out.println();
}
The Code below is Working now.
A simple if condition will solve your problem. Just check if the
value of i is divisible by 2. If it is true then print a
blank line. Else Print * and you are done!
* will be printed on 1st, 3rd and 5th lines.
Blank Space will be printed on 2nd and 4th lines.
public class PrintPattern{
public static void main(String []args){
int lineNo=0; // New Variable for Line Number (Can Use variable 'i' also)
for(int i = 0; i < 5; i++) {
lineNo++;
for(int j = i; j < 5; j++) {
System.out.print(" ");
}
if(lineNo%2!=0){
for(int k = 0; k <= (i*2); k++)
System.out.print('*'); // Will print '*' (or '5') Sequence for Odd Lines - 1st, 3rd, 5th Lines
System.out.println();
}
else
System.out.println();// Will print Blank Line for Even Lines - 2nd and 4th Lines
}
}
}
Try this
for(int i = 0; i < 5; i++) {
for(int j = i; j < 5; j++) {
System.out.print(" ");
}
for(int k = 0; k <= (i*2); k++) {
System.out.print("5"); //Use 5 instaed of * to draw
}
System.out.println();
System.out.println(); //This one will solve your problem
}
Output will be:
5
555
55555
5555555
555555555
I think that you can just enter one more print statement inside the loop:
for(int i = 0; i < 5; i++) {
System.out.println();
for(int j = i; j < 5; j++) {
System.out.print(" ");
}
for(int k = 0; k <= (i*2); k++) {
System.out.print("*");
}
System.out.println();
}
Output
*
***
*****
*******
*********

JAVA Numberline errors

I am trying to make the following number line is Java
2,3,5,7,11,13,17 (Prime Numbers)
I tried this code
for(int i =0; i <= 100; i++) {
if(i < 2) {
continue;
}
for(int j = 2; j < 1; j++) {
if(i % j == 0) {
break;
} else {
System.out.print(i + ",");
}
}
}
But it doesn't work
Anyone help please?
Your code is quite poor, but the minimal amount of changes needed to make it work yields this code:
outerLoop:
for(int i = 0; i <= 100; i++) {
if(i < 2) {
continue;
}
for(int j = 2; j < i; j++) {
if(i % j == 0) {
continue outerLoop;
}
}
System.out.print(i + ",");
}
But a further improvement would be to start the first loop at 2 right away:
outerLoop:
for(int i = 2; i <= 100; i++) {
for(int j = 2; j < i; j++) {
// and so on...
EDITED
There are a lot of errors in that code, first of all that second loop is a infinite loop and second one that the System.out.println line should not be in second loop it should be at end of first loop! If you place it in second it will print numbers hundreds of time.
This is the correct code :
for(int i = 2; i <= 100; i++)//begin loop from 2 instead of 0
{
boolean flag = true;
for(int j = 2; j < i; j++)
{
if(i % j == 0)
{
flag = false;
break;
}
}
if(flag)System.out.print(i + ",");
}
You need to set a flag to check if a factor was found outside the loop.

Printing diamonds from *'s

I am trying to System.out.print() a diamond out of *'s. So far I have spent a good 5 hours on trying to figure out how to reverse print the bottom triangle of the diamond.
I can worry about the spacing to complete the diamond later. (I have it worked for the most part).
If someone could explain to me what I am doing wrong and how the right way works I would greatly appreciate it.
private static void diamond()
{
int numLines = 0;
System.out.println("How many lines would you like in the Diamond?");
numLines = scan.nextInt();
if (numLines / 2 == 0) //if number is even, make odd.
{
numLines++;
}
for(int i = 0; i <= numLines ; i++) // Controls #Lines
{
if(i <= numLines / 2)
{
for(int j = 0; j < i * 2 - 1; j++) // Controls #Stars small upright triangle
{
System.out.print("*");
}
}
else
{
for(int k = numLines; k > i / 2; k--) // Controls # of spaces
{
System.out.print("*");
}
/*for(int j = numLines/2 - i, l = i; l > j; j++) // Controls #Stars small upright triangle
{
String stars = "*";
System.out.print(stars);
}*/
}
System.out.println("");
}
}
`
What happens to your attempt is that you loop through the half (of the lines) of your diamond [the number of lines in second/first half] times.
You'd want to do a if-statement each loop, not an if and a for in each loop
Probably you want this
Just adjust it for user input values
public static void main(String[] args) {
System.out.print("Reverse diamond: \n");
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");
}
System.out.print("\n\nDiamond from starts: \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:

Asterisk in Nested loops, Java

I am trying to make my code print out the Asterisk in the image, you see below. The Asterisk are align to the right and they have blank spaces under them. I can't figure out, how to make it go to the right. Here is my code:
public class Assn4 {
public static void main(String[] args) {
for (int i = 0; i <= 3; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
for (int x = 0; x <= 1; x++) {
System.out.println(" ");
}
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
}
System.out.println();
}
}
Matrix problems are really helpful to understand loops..
Understanding of your problem:
1) First, printing star at the end- That means your first loop should be in decreasing order
for(int i =7;i>=0; i+=i-2)
2) Printing star in increasing order- That means your second loop should be in increasing order
for(int j =0;j<=7; j++)
Complete code:
for(int i =7;i>=0; i=i-2){ // i=i-2 because *s are getting incremented by 2
for(int j =0;j<=7; j++){
if(j>=i){ // if j >= i then print * else space(" ")
System.out.print("*");
}
else{
System.out.print(" ");
}
}
System.out.println();// a new line just after printing *s
}
Starting loops with 1 can sometimes help you visualize better.
int stopAt = 7;
for (int i = 1; i <= stopAt ; i += 2) {
for (int j = 1; j <= stopAt; j++) {
System.out.print(j <= stopAt - i ? " " : "*");
}
System.out.println();
}
Notice, how each row prints an odd number of *s ending at the line with 7. So, you start with i at 1 and go through 3 1+2, 5 3+2, and then stopAt 7 5+2.
The nested for loop has to print 7 characters always to make sure *s appear right aligned. So, the loop runs from 1 to 7.
Here the complete code:
for(int i = 0; i < 8; i++){
if( i%2 != 0){
for(int x = 0; x < i; x++){
System.out.print("*");
}
}else{
System.out.println();
}
}

Categories

Resources