@timur102

Как улучшить код на Си(сделать "красивше")?

Задача:
Главный вождь племени Абба не умеет считать. В обмен на одну из его земель вождь другого племени предложил ему выбрать одну из трех куч с золотыми монетами. Но вождю племени Абба хочется получить наибольшее количество золотых монет. Помогите вождю сделать правильный выбор! 
INPUT.TXT
В первой строке входного файла INPUT.TXT записаны три натуральных числа через пробел. Каждое из чисел не превышает 10100. Числа записаны без ведущих нулей. 
OUTPUT.TXT
В выходной файл OUTPUT.TXT нужно вывести одно целое число — максимальное количество монет, которые может взять вождь.


#include <stdio.h>

#define N 103
char* maxNum(char *n1, char *n2);
int length(char s[]);
int main()
{
	FILE *in;
	FILE *out;
	int i,j;
	char c;
	char num1[N];
	char num2[N];
	char num3[N];
	char *nums[3] = {num1,num2,num3}; 
	in = fopen("input.txt","r");
	for (i=0;i<3; ++i){
		j = 0;
		while(c=fgetc(in)){
			if ( c == '\n' || c == ' ' ){
				(*(nums+i))[j] = '\0';
				break;
			}			
			(*(nums+i))[j] = c;
			j++;
			
		}
	}
	fclose(in);
	out = fopen("output.txt","w");
	fprintf(out, "%s",maxNum(*nums, maxNum(*(nums+1),*(nums+2))));
	fclose(out);
	//printf("%s", maxNum(*nums, maxNum(*(nums+1),*(nums+2))));
	return 0;
}

int length(char s[]){
	int i;
	for(i=0; i<N,s[i]!='\0';i++)
		;
	return i;
}

char* maxNum(char *n1, char *n2)
{
	int i;
	if (length(n1)>length(n2))
		return n1;
	if (length(n2)>length(n1))
		return n2;
	for (i=0; i<N;i++){
		if (n1[i]>n2[i])
			return n1;
		if (n2[i]>n1[i])
			return n2;
	}
}

Теперь вопрос: как сделать код меньше, "красивше". Может я где-то не те типы данных использовал. Подскажите, пожалуйста.
  • Вопрос задан
  • 625 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
char num1[N];
  char num2[N];
  char num3[N];
  char *nums[3] = {num1,num2,num3};

А чего не nums[3][N]?

while(c=fgetc(in))

Когда ты думаешь условие while перестанет выполняться?

if ( c == '\n' || c == ' ' )

Я бы добавил проверку на конец файла: if ( c == '\n' || c == ' ' || c == EOF)

(*(nums+i))[j]

А чего не nums[i][j]?

int length(char s[]){

Есть такая готовая функция strnlen из string.h

maxNum не обрабатывает случай когда аргументы равны.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Улучшить можно следующими способами:
  • знанием и использованием стандартных функций
  • проверкой результатов и обработкой ошибок
#include <stdio.h>
#include <string.h>

#define MAX_NUM_LENGTH 100

const char* chose(const char* left, const char* right)
{
	const size_t len_left = strlen(left);
	const size_t len_right = strlen(right);
	if (len_left > len_right)
		return left;
	if (len_right > len_left)
		return right;
	if (strcmp(left, right) < 0)
		return right;
	return left;
}

const char* get_max(const char* n1, const char* n2, const char* n3)
{
	return
	    chose(
	        chose(n1, n2),
	        chose(n2, n3));
}

int main()
{
	FILE* in = NULL;
	FILE* out = NULL;
	char n1[MAX_NUM_LENGTH + 1];
	char n2[MAX_NUM_LENGTH + 1];
	char n3[MAX_NUM_LENGTH + 1];
	in = fopen("input.txt", "r");
	if (!in) {
		perror("Cannot open file 'input.txt'");
		return 1;
	}
	if (3 != fscanf(in, "%100[0-9] %100[0-9] %100[0-9]", n1, n2, n3)) {
		perror("Wrong input format");
		fclose(in);
		return 1;
	}
	const char* max_num = get_max(n1, n2, n3);
	out = fopen("output.txt", "w");
	if (!out) {
		perror("Cannot open file 'output.txt'");
		return 1;
	}
	fprintf(out, "%s", max_num);
	fclose(in);
	fclose(out);
	return 0;
}
Ответ написан
@light24
Нужно найти свой стиль оформления кода, и стараться его придерживаться
рекомендую на будущее С. Макконнелл "Совершенный Код"
---------------------------------------------------------------------------------------------
отступы после математических знаков ( +, -, *, /, =), после запятой, после проверок ( ==, !=, <=, <, >, >=), логические отступы - после каждой задачки, переменные нужно объявлять как можно ближе к месту использования

#include <stdio.h>
#include <stdlib.h>     /* atoi */

int main()
{
  char nums[3][N];

  // читаем
  FILE *in = fopen("input.txt", "r");
  for (int i = 0; i < 3; ++i)
  {
    int j = 0;

    char c;
    while(c = fgetc(in))
    {
      nums[i][j++] = c;

      if (c == '\n' || c == ' ')
      {
        nums[i][j] = '\0';
        break;
      }
    }
  }
  fclose(in);
  
  // находим
  int maxNums = 0;
  for (int i = 0; i != sizeof(nums); ++i)
  {
    const int curNum = atoi(nums[i]);
	if (curNum <= maxNums)
		continue;
		
	maxNums = curNum;
  }

  // выводим
  FILE *out = fopen("output.txt", "w");
  fprintf(out, "%s", maxNums);
  fclose(out);

  // printf("%s", maxNum(*nums, maxNum(*(nums+1),*(nums+2))));

  return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы