Перевод чисел - исправить синтаксические ошибки - C (СИ)
Формулировка задачи:
помогите исправить хотя бы синтаксические ошибки уже сдавать через несколько часов
main.cpp
main.h
func.cpp
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include"main.h"
int main()
{
int w,a,b1,b2,n=0,n1=0,l=0,l1=0;
int k=0,i,i1=0,i2=0;
double result,fractional,celie;
char c[14];
scanf("%d%d",&b1,&b2);
scanf("%s",c);
bad(b1,b2);
bad_input(c,n,b1);
n=schet(c);
if (w=1)
{
l1=celiy_schet(c);
result=celie_v_dec_system(c,b1,l1);
celie=celie_v_b2(result,b2);
result=0;
result=fractional_v_dec(l1,n,b1,c);
fractional=result_to_b2_fractional(l1,b2,result);
crazy_vivod(w,celie,fractional);
}
else
{
result=celie_v_dec_system(c,b1,n);
celie=celie_v_b2(result,b2);
fractional=0;
crazy_vivod(w,celie,fractional);
}
}int powe( int a, int x); //возведение в положительную и отрицательную степень void bad(int b1,int b2); //смотрим действительно ли б1 и б2 от 2 до 16 int schet(char c); //считает кол-во символов попутно сообщая дробьное число это или нет int celiy_schet(char c); //считает кол-во четных символов int bad_input(char c,int n,int b1); //смотрит то ли введено int celie_v_dec_system(char* c,int b1,int l1); //берем целую часть и переводим в 10-ную систему int celie_v_b2(double result,int b2); //результат предыдущей деятельности в б2 int fractional_v_dec(int l1,int n,int b1,char c); //дробину при наличии оной в десятичную int result_to_b2_fractional(int l1,int b2,double result); //а потом в б2 void crazy_vivod(int w,double celie,double fractional); //все это чудо выводим //PROFIT
#include<stdlib.h>
#include"main.h"
#include<stdio.h>
int powe( int a, int x){ // а в степени х
int result = 1;
if (x>0){
while(x>0){
result = result * a;
--x;
}
} else
while(x>0){
result = result * (1/a);
--x;
}
return result;
}
void bad(int b1,int b2)
{
if (b1>16||b2>16||b1<2||b2<2) // 2<b1 b2<16
{printf("bad input");
exit(0);}
}
int schet(char* c){
int i,w,n;
for(i=0;c[i]!=0;i++)
{if (c[i]=='.')
w=1;
n++;}
return w,n;
}
int celiy_schet(char* c)
{
int i,l1;
for(i = 0; c[i] != '.' && c[i] != 0; i++)
l1++;
return l1;
}
void bad_input(char* c[],int n,int b1)
{
int i;
for(i=0;i<n;i++)
if (!(c[i]-'0'<b1||c[i]==','))
{
printf("bad input");
exit(0);
}
}
int celie_v_dec_system(char* c,int b1,int l1)
{
int i;
double celie;
for(i=0;i<l1;i++)
{
celie=celie+c[i]*powe(b1,l1-1);
l1--;
}
return celie;
}
int celie_v_b2(double result,int b2)
{
int i,a;
double celie;
for(i=0;celie!=0;i++)
{ a =(int) celie % b2;
celie = celie / b2;
celie=celie+a*powe(10,i);
}
return result;
}
int fractional_v_dec(int l1,int n,int b1,char* c)
{
int i,k=0;
double result=0;
for(i=l1;i<n;i++)
{
result=result+c[i]*powe(b1,-k);
k++;
l1--;
}
return result;
}
int result_to_b2_fractional(int l1,int b2,double result,double celie)
{
double fractional;
int i,a;
for(i=l1;fractional!=0;i++)
{ a =(int)fractional % b2;
fractional = celie / b2;
result=result+a*powe(10,i);
}
return fractional;
}
void crazy_vivod(int w,double celie,double fractional)
{
if(w=1)
printf("%s.%s",celie,fractional);
else
printf("%s",celie);
}Решение задачи: «Перевод чисел - исправить синтаксические ошибки»
textual
Листинг программы
#include<stdlib.h>
#include"main.h"
#include<stdio.h>
int powe( int a, int x){ // а в степени х
int result = 1;
if (x>0){
while(x>0){
result = result * a;
--x;
}
} else
while(x>0){
result = result * (1/a);
--x;
}
return result;
}
void bad(int b1,int b2)
{
if (b1>16||b2>16||b1<2||b2<2) // 2<b1 b2<16
{printf("bad input");
exit(0);}
}
int schet(char *c){
int i,w,n;
for(i=0;c[i]!=0;i++)
{if (c[i]=='.')
w=1;
n++;}
return w,n;
}
int celiy_schet(char *c)
{
int i,l1;
for(i = 0; c[i] != '.' && c[i] != 0; i++)
l1++;
return l1;
}
int bad_input(char *c,int n,int b1)
{
int i;
for(i=0;i<n;i++)
if (!(c[i]-'0'<b1||c[i]==','))
{
printf("bad input");
exit(0);
}
}
int celie_v_dec_system(char *c,int b1,int l1)
{
int i;
double celie;
for(i=0;i<l1;i++)
{
celie=celie+c[i]*powe(b1,l1-1);
l1--;
}
return celie;
}
int celie_v_b2(double result,int b2)
{
int i,a;
double celie;
for(i=0;celie!=0;i++)
{ a =(int) celie % b2;
celie = celie / b2;
celie=celie+a*powe(10,i);
}
return result;
}
int fractional_v_dec(int l1,int n,int b1,char *c)
{
int i,k=0;
double result=0;
for(i=l1;i<n;i++)
{
result=result+c[i]*powe(b1,-k);
k++;
l1--;
}
return result;
}
int result_to_b2_fractional(int l1,int b2,double result,double celie)
{
double fractional;
int i,a;
for(i=l1;fractional!=0;i++)
{ a =(int)fractional % b2;
fractional = celie / b2;
result=result+a*powe(10,i);
}
return fractional;
}
void crazy_vivod(int w,double celie,double fractional)
{
if(w=1)
printf("%s.%s",celie,fractional);
else
printf("%s",celie);
}
Объяснение кода листинга программы
- Перевод чисел - исправить синтаксические ошибки: Код содержит несколько функций для работы с числами различных систем счисления. Некоторые функции могут вызывать ошибки синтаксиса, которые нужно исправить.
- Перечислим функции, которые присутствуют в коде:
- powe(int a, int x) - функция возведения в степень
- bad(int b1,int b2) - функция проверки корректности ввода
- schet(char *c) - функция подсчета количества цифр в числе
- celiy_schet(char *c) - функция подсчета количества цифр в числе с плавающей точкой
- bad_input(char *c,int n,int b1) - функция проверки корректности ввода
- celie_v_dec_system(char *c,int b1,int l1) - функция преобразования числа из одной системы счисления в другую с учетом разрядов
- celie_v_b2(double result,int b2) - функция преобразования числа из десятичной системы счисления в число с плавающей точкой, кратное b2
- fractional_v_dec(int l1,int n,int b1,char *c) - функция преобразования числа из десятичной системы счисления в число с плавающей точкой
- result_to_b2_fractional(int l1,int b2,double result,double celie) - функция преобразования числа из одной системы счисления в другую с учетом разрядов
- crazy_vivod(int w,double celie,double fractional) - функция вывода числа в заданной системе счисления
- Проблемы, которые можно заметить в коде:
- В функции bad_input(char *c,int n,int b1) проверка корректности ввода выполняется некорректно. Необходимо проверить, что каждый символ в числе соответствует допустимому диапазону.
- В функции celie_v_dec_system(char *c,int b1,int l1) и celie_v_b2(double result,int b2) возможна переполнение при выполнении операций с плавающей точкой. Необходимо использовать функции для безопасных вычислений с плавающей точкой.
- В функции fractional_v_dec(int l1,int n,int b1,char *c) возможна переполнение при выполнении операций с плавающей точкой. Необходимо использовать функции для безопасных вычислений с плавающей точкой.
- В функции result_to_b2_fractional(int l1,int b2,double result,double celie) возможна переполнение при выполнении операций с плавающей точкой. Необходимо использовать функции для безопасных вычислений с плавающей точкой.
- В функции crazy_vivod(int w,double celie,double fractional) необходимо убедиться, что вывод числа в заданной системе счисления выполняется корректно.