How can i solve this issue for showing the grade - loops

**Write the program to calculate the grade
Average of marks
1-59: F
60-69: D
70-79: C
80-89: B
90-100: A
**
```
let marks = [100,100,100];
console.log(calculateGrade(marks));
function calculateGrade(marks) {
var total = 0;
var sum = 0;
for (let total of marks)
sum +=total;
sum /= marks.length;
return (( sum <=59 || sum <=69 ? 'F' : 'D') && ( sum <=79 || sum <=89 ? 'C' : 'B'));
(sum >= 90)console.log('A');
}

console.log(calculateGrade(marks));
function calculateGrade(marks) {
var total = 0;
var sum = 0;
for (let total of marks)
sum +=total;
average = sum / marks.length;
console.log(average);
// return ((((average = 0 && average <=59) && (average = 60 && average <=69) ? 'F' : 'D')) && (((average = 70 && average <=79) && (average = 80 && average <=89) ? 'C' : 'B')));
// else console.log('A');
if ( average < 60) return "F";
if ( average < 70) return "D";
if ( average < 80) return "C";
if ( average < 90) return "B";
return "A";
}

Related

My If-statements seem to be ignored even though my variables look fine in the debugger

I just started learning C (I'm an absolute beginner) and I'm trying to make a program that translates Roman numbers to Arabic and vice versa.
If I were to type "IX" my program should give me a "9" as an output but instead I get a "1". I tried to find the issue on my own using the debugger and I can see my program entering the first If-Statement
if (userString[localIndex] == 'I')
but then it skips the inner If-Statement
else if (userString[++localIndex] == 'X') {
ARABIC_NUM += 9;
localIndex++;
}
I'm not sure why this is happening. If I type "IV" my program outputs a "4" which is the correct answer but if I type "IVIV" my programs once again outputs a lonely "4" and ignores the rest of my input.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#define NOT_A_NUMBER 0
#define IS_ROMAN 1
#define IS_ARABIC 2
int ARABIC_NUM = 0;
int findStringLength(char* userString) {
int stringLength = 0;
size_t index = 0;
while (userString[index] != '\0')
{
if (userString[index] != '\0') {
stringLength++;
index++;
}
}
return stringLength;
}
void resetString(char* userString)
{
size_t stringLength = findStringLength(userString);
for (size_t index = 0; index < stringLength; index++)
{
userString[index] = '\0';
}
}
void printString(char* userString)
{
size_t stringLength = findStringLength(userString);
for (size_t index = 0; index < stringLength; index++)
{
if (userString[index] != '\0')
printf("~%zu:%c~ ", index, userString[index]);
else
printf("Null character");
}
}
bool ifEnd(char* numberInput, size_t counter) {
bool userEnd = false;
for (size_t index = 0; index < counter; index++)
{
if ((numberInput[index - 2] == 'E' && numberInput[index - 1] == 'N' && numberInput[index] == 'D')) {
userEnd = true;
}
}
return userEnd;
}
int isNumTrue(char userChar) {
int isRoman = NOT_A_NUMBER;
int isArabic = NOT_A_NUMBER;
if (userChar == 'I' || userChar == 'V' || userChar == 'X' ||
userChar == 'L' || userChar == 'C' || userChar == 'D' || userChar == 'M') {
isRoman = IS_ROMAN;
return isRoman;
}
else if (userChar == '0' || userChar == '1' || userChar == '2' || userChar == '3' || userChar == '4' || userChar == '5' || userChar == '6' || userChar == '7' || userChar == '8' || userChar == '9') {
isArabic = IS_ARABIC;
return isArabic;
}
else {
return NOT_A_NUMBER;
}
}
void convertToArabic(char* userString, size_t counter) {
for (size_t localIndex = 0; userString[localIndex] != '\0'; localIndex++) {
// printf("[ %c%s]", userString[localIndex], "-o ");
if (userString[localIndex] == 'I') {
if (userString[++localIndex] == 'V') {
printf("Made it in");
ARABIC_NUM += 4;
localIndex++;
}
else if (userString[++localIndex] == 'X') {
ARABIC_NUM += 9;
localIndex++;
}
else {
ARABIC_NUM += 1;
}
}
else if (userString[localIndex] == 'V') {
ARABIC_NUM += 5;
}
else if (userString[localIndex] == 'X') {
if (userString[localIndex++] == 'L') {
ARABIC_NUM += 40;
localIndex++;
}
else if (userString[localIndex++] == 'C') {
ARABIC_NUM += 90;
localIndex++;
}
else {
ARABIC_NUM += 10;
}
}
else if (userString[localIndex] == 'L') {
ARABIC_NUM += 50;
}
else if (userString[localIndex] == 'C') {
if (userString[localIndex++] == 'D') {
ARABIC_NUM += 400;
localIndex++;
}
else if (userString[localIndex++] == 'M') {
ARABIC_NUM += 900;
localIndex++;
}
else {
ARABIC_NUM += 100;
}
}
else if (userString[localIndex] == 'D') {
ARABIC_NUM += 500;
}
else if (userString[localIndex] == 'M') {
ARABIC_NUM += 1000;
}
else {
printf("Switch default. You shouldn't be seeing this");
}
/* else
{
printf("[ %c%s]", userString[localIndex],"-x ");
}*/
}
printf("%s%d%s", "\n Number was :", ARABIC_NUM, "\n");
}
bool convertToRoman(char* userString, char* romanStringHolder, size_t counter) {
bool isValid = true;
int arabicNum = atoi(userString);
char repetitionLimit = '\0';
for (size_t index = 0; arabicNum != 0; index++) {
/* if ((isNumTrue(userString[index]) == IS_ARABIC || userString[index] == '\n') && index < counter)
{
printf("[ %c%s]", userString[index], "-o ");
}*/
if (arabicNum >= 4000) {
do {
if (romanStringHolder[index - 2] == romanStringHolder[index - 1] == romanStringHolder[index]) {
repetitionLimit = romanStringHolder[index - 2];
}
if (arabicNum / 1000000 >= 1)//&& repetitionLimit != 'M')
{
romanStringHolder[index] = 'M';
arabicNum -= 1000000;
}
else if (arabicNum / 900000 >= 1)// && repetitionLimit != 'M')
{
romanStringHolder[index] = 'C';
romanStringHolder[++index] = 'M';
arabicNum -= 900000;
}
else if (arabicNum / 500000 >= 1)// && repetitionLimit != 'D')
{
romanStringHolder[index] = 'D';
arabicNum -= 500000;
}
else if (arabicNum / 400000 >= 1)//&& repetitionLimit != 'D')
{
romanStringHolder[index] = 'C';
romanStringHolder[++index] = 'D';
arabicNum -= 400000;
}
else if (arabicNum / 100000 >= 1)// && repetitionLimit != 'C')
{
romanStringHolder[index] = 'C';
arabicNum -= 100000;
}
else if (arabicNum / 90000 >= 1)//&& repetitionLimit != 'C')
{
romanStringHolder[index] = 'X';
romanStringHolder[++index] = 'C';
arabicNum -= 90000;
}
else if (arabicNum / 50000 >= 1)// && repetitionLimit != 'L')
{
romanStringHolder[index] = 'L';
arabicNum -= 50000;
}
else if (arabicNum / 40000 >= 1)// && repetitionLimit != 'L')
{
romanStringHolder[index] = 'X';
romanStringHolder[++index] = 'L';
arabicNum -= 40000;
}
else if (arabicNum / 10000 >= 1)//&& repetitionLimit != 'X')
{
romanStringHolder[index] = 'X';
arabicNum -= 10000;
}
else if (arabicNum / 9000 >= 1)// && repetitionLimit != 'X')
{
romanStringHolder[index] = 'I';
romanStringHolder[++index] = 'X';
arabicNum -= 9000;
}
else if (arabicNum / 5000 >= 1)//&& repetitionLimit != 'V')
{
romanStringHolder[index] = 'V';
arabicNum -= 5000;
}
else if (arabicNum / 4000 >= 1)//&& repetitionLimit != 'I')
{
romanStringHolder[index] = 'I';
romanStringHolder[++index] = 'V';
arabicNum -= 4000;
}
else if (arabicNum / 1000 >= 1)// && repetitionLimit != 'I')
{
romanStringHolder[index] = 'I';
arabicNum -= 1000;
}
index++;
} while (arabicNum >= 4000);
romanStringHolder[index] = '_';
index++;
}
if (arabicNum <= 3999) {
if (arabicNum / 1000 >= 1)
{
romanStringHolder[index] = 'M';
arabicNum -= 1000;
}
if (arabicNum / 900 >= 1)
{
romanStringHolder[index] = 'C';
romanStringHolder[++index] = 'M';
arabicNum -= 900;
}
else if (arabicNum / 500 >= 1)
{
romanStringHolder[index] = 'D';
arabicNum -= 500;
}
else if (arabicNum / 400 >= 1)
{
romanStringHolder[index] = 'C';
romanStringHolder[++index] = 'D';
arabicNum -= 400;
}
else if (arabicNum / 100 >= 1)
{
romanStringHolder[index] = 'C';
arabicNum -= 100;
}
else if (arabicNum / 90 >= 1)
{
romanStringHolder[index] = 'X';
romanStringHolder[++index] = 'C';
arabicNum -= 90;
}
else if (arabicNum / 50 >= 1)
{
romanStringHolder[index] = 'L';
arabicNum -= 50;
}
else if (arabicNum / 40 >= 1)
{
romanStringHolder[index] = 'X';
romanStringHolder[++index] = 'L';
arabicNum -= 40;
}
else if (arabicNum / 10 >= 1)
{
romanStringHolder[index] = 'X';
arabicNum -= 10;
}
else if (arabicNum / 9 >= 1)
{
romanStringHolder[index] = 'I';
romanStringHolder[++index] = 'X';
arabicNum -= 9;
}
else if (arabicNum / 5 >= 1)
{
romanStringHolder[index] = 'V';
arabicNum -= 5;
}
else if (arabicNum / 4 >= 1)
{
romanStringHolder[index] = 'I';
romanStringHolder[++index] = 'V';
arabicNum -= 4;
}
else if (arabicNum / 1 >= 1)
{
romanStringHolder[index] = 'I';
arabicNum -= 1;
}
}
}
if (romanStringHolder > 3999999)
printf("\n");
return isValid;
}
int findNumSystem(char* userString, char* toRomanString) {
//printf(" -%zu and %d-", counter, findStringLength(userString));
size_t counter = findStringLength(userString);
int romanNumAmount = 0;
int arabicNumAmount = 0;
int notNumAmount = 0;
for (size_t localIndex = 0; localIndex < counter; localIndex++) {
if (isNumTrue(userString[localIndex]) == IS_ROMAN || ((isNumTrue(userString[localIndex - 1]) == IS_ROMAN) && (userString[localIndex] == '\n')))
{
printf("[ %c%s]", userString[localIndex], "-R ");
romanNumAmount++;
if (romanNumAmount == (findStringLength(userString) - 1)) {
printf("\nAll Numbers are Roman");
convertToArabic(userString, counter);
break;
}
}
else if (isNumTrue(userString[localIndex]) == IS_ARABIC || ((isNumTrue(userString[localIndex - 1]) == IS_ARABIC) && (userString[localIndex] == '\n')))
{
printf("[ %c%s]", userString[localIndex], "-A ");
arabicNumAmount++;
if (arabicNumAmount == (findStringLength(userString) - 1))
{
printf("\nAll numbers are Arabic");
convertToRoman(userString, toRomanString, counter);
printString(toRomanString);
break;
}
}
else if (isNumTrue(userString[localIndex]) == NOT_A_NUMBER)
{
printf("[ %c%s]", userString[localIndex], "-X ");
notNumAmount++;
if (notNumAmount == (findStringLength(userString))) {
printf("\nNone of the characters is a number of either system");
}
}
}
}
#define LENGTH 1000u
int main() {
typedef char user_Input_Stream;
char lol = '\0';
user_Input_Stream arabToRomanString[LENGTH] = { '\0' };
user_Input_Stream numberInput[LENGTH] = { '\0' };
size_t counter = 0;
bool userEnd = false;
while ((lol != EOF) && (userEnd == false))
{
counter = 0;
printString(&numberInput);
resetString(&numberInput);
resetString(&arabToRomanString);
counter = 0;
printString(&numberInput);
ARABIC_NUM = 0;
printf("\n\n||Beta version, remember to not mix number systems yet||\n");
//Repeats until variable lol countains EOF or until boolean holds a true value
while ((lol != EOF) && (lol != '\n') && (userEnd == false))
{
//gets characters, assigns string with them. Gets rid of newline and stores string in array in uppercase
lol = getchar();
numberInput[counter] = toupper(lol);
userEnd = ifEnd(numberInput, counter);
counter++;
}
//TESTING Travels through String and outputs cells contents. Also, sets boolean to True if user writes END
for (size_t i = 0; i < counter; i++) {
if (numberInput[i] == '\n')
{
lol = '\\';
numberInput[i] = toupper(lol);
}
// printf("| [%zu] = %c |", i, numberInput[i]);
}
findNumSystem(numberInput, arabToRomanString);
printf("\n");
}
printf("\n");
return 0;
}
Does anyone have an idea of what the issue could be? (ARABIC_NUM is a global variable, the name is to make it easier for me to find for now.)
Just in case this might help somebody else, here's the solution I came up with using some of the pointers people in the comment section gave me. It was fairly simple:
I was under the impression that expressions within if-statements don't affect any variables they reference, but in reality they do.
For example: if(userString[localIndex] == 'I' && userString[localIndex++] == 'X')
In the line above, I was expecting the program to check both the current index and the next upcoming index, which it did but the expression userString[localIndex++] within the if-statement also permanently incremented my localIndex variable when I wasn't expecting that change to exist outside of the if-statement's parenthesis. So, my program would check the wrong indexes after the first comparison was made and thus why it gave me the wrong output.
To solve this, I created the variable nextIndex and used it to store the value localIndex +1 meaning it will always represent the index after localIndex. So, It now works as intended.
Below is what my program looks like now. (I moved around the if and if-else statements for better readability but the only changed that solved my predicament was the addition of nextIndex)
void convertToArabic(char* userString, size_t counter) {
size_t nextIndex = 0;
for (size_t localIndex = 0; localIndex < findStringLength(userString); localIndex++) {
// printf("[ %c%s]", userString[localIndex], "-o ");
nextIndex = localIndex+1;
if (userString[localIndex] == 'M') {
ARABIC_NUM += 1000;
}
else if (userString[localIndex] == 'C' && userString[nextIndex] == 'M') {
ARABIC_NUM += 900;
localIndex++;
}
else if (userString[localIndex] == 'D') {
ARABIC_NUM += 500;
}
else if (userString[localIndex] == 'C' && userString[nextIndex] == 'D') {
ARABIC_NUM += 400;
localIndex++;
}
else if(userString[localIndex] == 'C'){
ARABIC_NUM += 100;
}
else if (userString[localIndex] == 'X' && userString[nextIndex] == 'C') {
ARABIC_NUM += 90;
localIndex++;
}
else if (userString[localIndex] == 'L') {
ARABIC_NUM += 50;
}
else if (userString[localIndex] == 'X' && userString[nextIndex] == 'L'){
ARABIC_NUM += 40;
localIndex++;
}
else if (userString[localIndex] == 'X') {
ARABIC_NUM += 10;
}
else if ((userString[localIndex] == 'I') && (userString[nextIndex] == 'X')) {
//localIndex--;
ARABIC_NUM += 9;
localIndex++;
}
else if (userString[localIndex] == 'V') {
ARABIC_NUM += 5;
}
else if ((userString[localIndex] == 'I') && (userString[nextIndex] == 'V')) {
//localIndex--;
printf("Made it in");
ARABIC_NUM += 4;
localIndex++;
}
else if (userString[localIndex] == 'I') {
ARABIC_NUM += 1;
}
/* else
{
printf("[ %c%s]", userString[localIndex],"-x ");
}*/
}
printf("%s%d%s", "\n Number was :", ARABIC_NUM, "\n");
}

How do I alter this roman numeral converter code so that it correctly counts the numbers place?

So I've got code that looks like this
#include <stdio.h>
void decimal_to_roman(int num)
{
scanf("%d", &num);
while(num != 0)
{
if (num >= 1000) // 1000 - m
{
printf("C");
num = num % 1000;
}
else if (num >= 500) // 900 - cm
{
if (num < 900) // 500 - d
{
printf("D");
num = num % 500;
}
else
{
printf("CM");
num = num % 100;
}
}
else if (num >= 100) // 400 - cd
{
if (num < 400)
{
printf("C");
num = num % 100;
}
else
{
printf("CD");
num = num % 100;
}
}
else if (num >= 50) // 100 - c
{
if (num < 90)
{
printf("L");
num = num % 50;
}
else{
printf("XC");
num = num % 10;
}
}
else if (num >= 10)
{
if (num < 40)
{
printf("X");
num = num % 10;
}
else
{
printf("XL");
num = num % 10;
}
}
else if (num >= 5)
{
if (num < 9)
{
printf("V");
num = num % 5;
}
else
{
printf("IX");
num = 0;
}
}
else if (num >= 1)
{
if (num < 4)
{
printf("I");
num = 0;
}
else
{
printf("IV");
num = 0;
}
}
}
}
It doesn't work properly, for obvious reasons, but I'm having trouble on slotting in both num/1000 and num % 1000 that I need to make it proper, since when I try putting both in it gives me errors. I'm pretty new to coding so I have no idea where to start. Thanks!

function in queen's Attack II returns wrong answer

I'm solving Queen's Attack II problem in Hackerrank. My idea is traverse through every obstacles to find the closest obstacle in each directions (left, right, up down and 4 diagons. My function only passed half of testcases. Then I search on the Internet and I found a similar solution but different in code structure, obsiously it passed all testcases.
My function:
int queensAttack(int n, int k, int r_q, int c_q, int obstacles_rows, int obstacles_columns, int **obstacles) {
long a[8];
a[0]=c_q-1;
a[1]=n-c_q;
a[2]=r_q-1;
a[3]=n-r_q;
a[4]=min(a[3], a[1]);
a[5]=min(a[2], a[1]);
a[6]=min(a[2], a[0]);
a[7]=min(a[3], a[0]);
int x=obstacles[i][1], y=obstacles[i][0];
for (int i=0; i<obstacles_rows; i++) {
if(y==r_q && x<c_q) a[0]=min(a[0], c_q-x-1);
else if(y==r_q && x>c_q) a[1]=min(a[1], x-c_q-1);
else if(x==c_q && y<r_q) a[2]=min(a[2], r_q-y-1);
else if(x==c_q && y>r_q) a[3]=min(a[3], y-r_q-1);
else if(y-r_q==x-c_q) a[4]=min(a[4], y-r_q-1);
else if(r_q-y==x-c_q) a[5]=min(a[5], r_q-y-1);
else if(r_q-y==c_q-x) a[6]=min(a[6], r_q-y-1);
else if(y-r_q==c_q-x) a[7]=min(a[7], y-r_q-1);
}
int result=0;
for (int i=0; i<8; i++) {
result+=a[i];
}
return result;
}
Their fucntion:
int queensAttack(int n, int k, int r_q, int c_q, int obstacles_rows, int obstacles_columns, int **obstacles) {
a[0] = c_q -1 ;
a[1] = n -r_q;
a[2] = n -c_q;
a[3] = r_q -1;
a[4] = min(a[0],a[1]);
a[5] = min(a[1],a[2]);
a[6] = min(a[2],a[3]);
a[7] = min(a[3],a[0]);
int x,y;
while (--k >= 0)
{
y = obstacles[k][0] - r_q;
x = obstacles[k][1] - c_q;
if (x == 0)
{
if (y > 0)
{
a[1] = min(a[1], y - 1);
}
else
{
a[3] = min(a[3], -(y + 1));
}
}
else if (y == 0)
{
if (x > 0)
{
a[2] = min(a[2], x - 1);
}
else
{
a[0] = min(a[0], -(x + 1));
}
}
else
{
float m = (float)y / x;
if (m == 1.0)
{
if (x > 0)
{
a[5] = min(a[5], x - 1);
}
else
{
a[7] = min(a[7], -y - 1);
}
}
else if (m == -1.0)
{
if (x > 0)
{
a[6] = min(a[6], x - 1);
}
else
{
a[4] = min(a[4], y - 1);
}
}
}
}
int result=0;
for (int i=0; i<8; i++) {
result+=a[i];
}
return result;
}
Where am I wrong?
Any help would be appreciated.
Some issues:
1) This line should not occur before the loop, but as a first statement inside the loop body:
int x=obstacles[i][1], y=obstacles[i][0];
2) The second half of the loop has conditions which cause a problem. For instance when y-r_q==x-c_q is true, then also r_q-y==c_q-x is true, and vice versa. So this expression tells you whether an obstacle is on a queen's diagonal, but not on which side of the queen. As a consequence, the argument you pass to the min function could be negative, and this should never happen. You need an additional condition, much like you have in the first half of that if-chain. So change the second half to this:
else if(y-r_q==x-c_q && y>r_q) a[4]=min(a[4], y-r_q-1);
else if(r_q-y==x-c_q && y<r_q) a[5]=min(a[5], r_q-y-1);
else if(r_q-y==c_q-x && y<r_q) a[6]=min(a[6], r_q-y-1);
else if(y-r_q==c_q-x && y>r_q) a[7]=min(a[7], y-r_q-1);
It took me some time to figure out this one. My first code couldn't get through the time execution time limits. So, some math comes handy. First I calculate the total number of moves as there are no obstacles, just using math. If there are no obstacles that is the answer.
If there are obstacles, loop through them, using boolean to close each direction that is found and using math calculate the non moves. But I still had error, because the obstacles had to be sorted from the queen to the farthest obstacles position.
Here is my code in Java.
int vertHor = n - 1;
int d1 = Math.min(n - c_q, n - r_q) + Math.min(r_q - 1, c_q - 1);
int d2 = Math.min(c_q - 1, n - r_q) + Math.min(n - c_q, r_q - 1);
int total = vertHor * 2 + d1 + d2;
if (k == 0) {
return total;
}
boolean u = false;
boolean d = false;
boolean l = false;
boolean r = false;
boolean ul = false;
boolean ur = false;
boolean dl = false;
boolean dr = false;
Arrays.sort(obstacles, (int[] x, int[] y) -> Math.min(Math.abs(x[0] - r_q), Math.abs(x[1] - c_q))
- Math.min(Math.abs(y[0] - r_q), Math.abs(y[1] - c_q)));
for (int[] obs : obstacles) {
int oRow = obs[0];
int oCol = obs[1];
if (oRow == r_q) {
if (oCol < c_q && !l) {
total -= oCol;
l = true;
} else if (!r) {
total -= n - oCol + 1;
r = true;
}
} else if (oCol == c_q) {
if (oRow < r_q && !d) {
total -= oRow;
d = true;
} else if (!u) {
total -= n - oRow + 1;
u = true;
}
} else if (Math.abs(c_q - oCol) == Math.abs(r_q - oRow)) {//oCol != c_q && oRow != r_q) {
if (oCol < c_q && oRow > r_q && !ul) {
total -= Math.min(n - oRow + 1, oCol);
ul = true;
} else if (oCol < c_q && oRow < r_q && !dl) {
total -= Math.min(oRow, oCol);
dl = true;
} else if (oCol > c_q && oRow < r_q && !dr) {
total -= Math.min(oRow, n - oCol + 1);
dr = true;
} else if (oCol > c_q && oRow > r_q && !ur) {
total -= Math.min(n - oRow, n - oCol) + 1;
ur = true;
}
}
if (u && d && l && r && ul && ur && dl && dr) {
break;
}
}
return total;

C function doesn't return string, though it should

I'm super new in C, trying to solve CS50's credit problem here.
So I wrote a function, that should check some parameters, and return a string, which I use in the main function to print an answer.
#include <stdio.h>
#include <stdlib.h>
#include <cs50.h>
#include <math.h>
int lunh(long n);
char* check(long nu);
int main(void)
{
long number = get_long("Number: ");
printf("%s", check(number));
}
int lunh(long n)
{
int length, step_one, num;
long tens;
step_one = 0;
length = floor(log10(labs(n))) + 1;
for (int i = length, powering = 1; i > length / 2; i--)
{
tens = pow(10, powering);
num = ((n / tens) % 10) * 2;
if (floor(log10(abs(num))) + 1 > 1)
{
while (num)
{
step_one += num % 10;
num /= 10;
}
step_one += num;
powering += 2;
}
else
{
step_one += num;
powering += 2;
}
}
for (int i = length, powering = 0; i > length / 2; i--)
{
tens = pow(10, powering);
num = ((n / tens) % 10);
step_one += num;
powering += 2;
}
if (step_one % 10 == 0)
{
return 1;
}
else
{
return 0;
}
}
char* check(long nu)
{
int l, first_two_digits, first_one;
l = floor(log10(labs(nu))) + 1;
first_one = nu / 1000;
first_two_digits = nu / 100;
char* answer = NULL;
if (l == 15)
{
if (first_two_digits == 34 || first_two_digits == 37)
{
if (lunh(nu) == 1)
{
answer = "AMEX";
}
else
{
answer = "INVALID";
}
}
}
else if (l == 13 || first_one == 4)
{
if (lunh(nu) == 1)
{
answer = "VISA";
}
else
{
answer = "INVALID";
}
}
else if (l == 16)
{
if (first_two_digits == 51 || first_two_digits == 52 || first_two_digits == 53 || first_two_digits == 54 || first_two_digits == 55)
{
if (lunh(nu) == 1)
{
answer = "MASTERCARD";
}
else
{
answer = "INVALID";
}
}
}
else
{
answer = "INVALID";
}
printf("%s", answer);
return answer;
}
Input: 4003600000000014
Expected output: "VISA"
Current output: nothing, after inputting the number, the program stops.
At least one problem is here: else if (l == 13 || first_one == 4). From the spec:
Visa uses 13- and 16-digit numbers.
Visa numbers all start with 4
That if test will produce VISA if length is 13 or card starts with 4. The sample input is a 16 digit number.

Multiple value array

I am new to jScript and have written this code [which works perfectly]. Its purpose is to test that the term for the amount of loan is not exceeded. Can the process be consolidated into one array where you pass the loan amount which returns the term based on the range i.e. 6000 to 7000 = 96
function TestMaxTerm()
{
var LnAmt = 14000 //Testing Purposes
var Term = 0 //Testing Purposes
if (LnAmt > 0 && LnAmt <= 1000){Term = 0;}
if (LnAmt > 1000 && LnAmt <= 2000){Term = 1;}
if (LnAmt > 2000 && LnAmt <= 3000){Term = 2;}
if (LnAmt > 3000 && LnAmt <= 4000){Term = 3;}
if (LnAmt > 4000 && LnAmt <= 5000){Term = 4;}
if (LnAmt > 5000 && LnAmt <= 6000){Term = 5;}
if (LnAmt > 6000 && LnAmt <= 7000){Term = 6;}
if (LnAmt > 7000 && LnAmt <= 8000){Term = 7;}
if (LnAmt > 8000 && LnAmt <= 9000){Term = 8;}
if (LnAmt > 9000 && LnAmt <= 10000){Term = 9;}
if (LnAmt > 10000 && LnAmt <= 11000){Term = 10;}
if (LnAmt > 11000 && LnAmt <= 12000){Term = 11;}
if (LnAmt > 11000){Term = 12;}
//Obtain Maximum Term for Loan Amount
var MaxTerm = new Array();
MaxTerm[0] = 24; MaxTerm[1]=36; MaxTerm[2] = 48; MaxTerm[3] = 60;
MaxTerm[5] = 72; MaxTerm[5]=84; MaxTerm[6] = 96; MaxTerm[7] = 108;
MaxTerm[8] = 120; MaxTerm[9]=132; MaxTerm[10] = 164; MaxTerm[11] = 176;
MaxTerm[12] = 420;
var text = MaxTerm[Term];
alert(text);
}
You could put all of the data into a 2D array and loop through the array to find your answer.
Here's some sample code which you can tweak for your JScript implementation. Your last entry could go from 12000 to your max loan amount or Number.MAX_VALUE
var loanAmt = 2200;
var answer = -1;
var myData =
[
[0, 1000, 24],
[1000, 2000, 36],
[2000, 3000, 48],
[3000, 4000, 60]
];
for (var x=0; x < myData.length; x++) {
if ( (loanAmt > myData[x][0]) && (loanAmt <= myData[x][1]) ) {
answer = myData[x][2];
break;
}
}
alert(answer);
As the terms are multiples of 12 and the grouping is based on 1000, the term can be computed:
% function f(amt) {return 12 * (2 + Math.floor(amt / 1000));}
undefined
% f(6500)
96
% f(3999)
60
% f(4000)
72
%
On second thought:
% function g(amt) {return 24 + 12 * Math.floor((amt - 1) / 1000);}
undefined
% g(1)
24
% g(999)
24
% g(1000)
24
% g(1001)
36
% g(6000)
84
% g(6001)
96
% g(6999)
96
% g(7000)
96
% g(7001)
108
%

Resources