Estoy aprendiendo el lenguaje de programación C. Estoy haciendo la tarea con el lenguaje de programación C. Pero estoy teniendo un problema. El resultado no es imprimir. Estoy usando el especificador de formato %s. Aquí está mi código a continuación. Por favor échale un vistazo.
#include <stdio.h> int gradeCalculation(int marks) { switch (marks) { case 0 ... 49: return 'F'; break; case 50 ... 59: return 'D'; break; case 60 ... 69: return 'C'; break; case 70 ... 79: return 'B'; break; case 80 ... 89: return 'A'; break; case 90 ... 100: return 'A+'; break; default: return 'Marks is not valid!'; } } int main() { int marks; printf("Marks: "); scanf("%d", &marks); printf("Grade: %s\n", gradeCalculation(marks)); return 0; }¿Cómo solucionar mi problema? ¿Qué especificador debo usar para obtener el resultado esperado?
Para empezar etiquetas de casos como este
case 90 ... 100: no es una función estándar de C. Es mejor usar sentencias if-else. Además, el parámetro de función debe tener un tipo de entero sin signo, por ejemplo, unsigned int .
Su función devuelve un objeto del tipo int
int gradeCalculation(int marks) { Entonces, usar el especificador de conversión %s con un objeto del tipo int da como resultado un comportamiento indefinido.
El tipo de retorno de la función debe ser const char *
const char * gradeCalculation( unsigned int marks ) {y en lugar de literales de caracteres enteros, debe devolver literales de cadena como, por ejemplo
case 80 ... 89: return "A"; break; case 90 ... 100: return "A+"; break; default: return "Marks is not valid!";Su programa puede verse de la siguiente manera
#include <stdio.h> const char * gradeCalculation( unsigned int marks ) { const char *grade = "Marks is not valid!"; if ( marks < 50 ) { grade = "F"; } else if ( marks < 60 ) { grade = "D"; } else if ( marks < 70 ) { grade = "C"; } else if ( marks < 80 ) { grade = "B"; } else if ( marks < 90 ) { grade = "A"; } else if ( marks <= 100 ) { grade = "A+"; } return grade; } int main( void ) { unsigned int marks = 0; printf("Marks: "); scanf( "%u", &marks ); printf( "Grade: %s\n", gradeCalculation( marks ) ); return 0; }.
Los apóstrofes denotan constantes de caracteres; F es un número entero que es el código para el carácter "F".
Por varios motivos heredados/históricos, puede tener constantes de varios caracteres como A+ , que tiene un valor que puede combinar los valores de los dos caracteres "A" y "+". Sin embargo, el resultado sigue siendo un int ; generalmente no se trata como una cadena de dos caracteres. Las constantes de varios caracteres se utilizan para fines especiales y dependen de la implementación. Debe evitarlos fuera de circunstancias especiales.
En gradeCalculation , desea devolver una cadena de caracteres. Para referirnos a una cadena, generalmente usamos un puntero a su primer elemento. Así que haga el tipo de retorno de gradeCalculation const char * . Luego cambie todas las constantes de caracteres a literales de cadena, como "F" , "A+" y "Marks is not valid" . Tenga en cuenta el uso de comillas en lugar de apóstrofes. Un literal de cadena denota una matriz de caracteres, incluido un carácter nulo para marcar el final.
Hay algunos puntos a tener en cuenta en su código dado:
En la línea printf("Grade: %s\n", gradeCalculation(marks)); , la función gradeCalculation() devuelve un int mientras que el especificador de formato es %s que es para una cadena (char *).
En el int gradeCalculation(int marks) , todos los casos devuelven un carácter, excepto
case 90 ... 100:
return 'A+';
break;
default:
return 'Marks is not valid!';
que están devolviendo la cadena.
Por lo tanto, será bueno convertir todo a cadena y cambiar el tipo de retorno a char * , es decir, cadena.
A continuación se muestra la solución: -
#include <stdio.h> char * gradeCalculation(int marks) { switch (marks) { case 0 ... 49: return "F"; break; case 50 ... 59: return "D"; break; case 60 ... 69: return "C"; break; case 70 ... 79: return "B"; break; case 80 ... 89: return "A"; break; case 90 ... 100: return "A+"; break; default: return "Marks is not valid!"; } } int main() { int marks; printf("Marks: "); scanf("%d", &marks); printf("Grade: %s\n", gradeCalculation(marks)); return 0; }