C programming language
2 отговора
0 прегледа
C programming language
Kakvo e re6enieto na slednata zada4a? Molq pomognete!
Dadeni sa 2 stringa s daljina po 32kb. Vseki ot tqh se sastoi samo ot deseti4ni tzifri. da se napi6e funkzia koqto sabira dvete 4isla koito se sadarjat v stringovete.
Dadeni sa 2 stringa s daljina po 32kb. Vseki ot tqh se sastoi samo ot deseti4ni tzifri. da se napi6e funkzia koqto sabira dvete 4isla koito se sadarjat v stringovete.
Re6enie no s problem!!!
Тук съм реализирал решението като програма но може съвсем спокойно функцията main
да се преобразува във функция която приема три параметъра. Първите два са
стринговете, а последният е само указател към низ който да се запълни.
/*------------------------------- zadacha_edno.c ---------------------------------------*/
/*
Дадени са 2 стринга с дълйина по 32kb.
Всеки от тях се състои само от десетични цифри.
Да се напи6е функция която събира двете числа които се съдържат в стринговете.
*/
/*
Програмата работи по следния начин.
Взимат се двата низа от командния ред или се въвеждат последователно,
след което се обръщат огледално. Нещо като преминаване от big-endian
към litle-endian подредба на числата. След това сумираме цифрите и записваме
резултата в променлива *sum*, след като сме сумирали две цифри изваждаме от
тяхната сумирана char стойност 0x30 или '0', и проверяваме дали съответният
char е по-голям от 0x39 или '9'. Ако е така записваме в променливата *izl*
на позиция с единица по-голяма от текущата на стринговете char-ат 0x31 или '1'.
като не пропускаме да извадим от char-ат по-голям от 0x39 числото 10.
След като преминем през всички цифри, копираме стринговете *sum* и *izl*
съответно в ao и bo. И присвояваме на всеки char от стринговете *sum* и *izl*
съответно 0x30 или '0' и продължаваме да итерираме, докато *izl*, не стане
само нули.
Променливи:
a, b - Копирани от командния ред или въведени от потребителя
ao, bo - обърнатите от invert_word(), стринговете a и b
la, lb - дължини a и b
l - по-голямата измежду la и lb, събрана с единица
i, j - итерационни променливи
sum - сума
izl - излишък
res - в нея запазваме резултата
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGTH 32<<10
int ne_e_samo_nuli(char *ptr);
void invert_word(char *src, char *dest);
int main (int argc, char *argv[]) {
char *a, *b;
char *ao, *bo;
char *sum, *izl, *res;
int i, la, lb, l, j;
if(argc == 3) {
a = (char *) malloc(strlen(argv[1])+1);
strcpy(a, argv[1]);
} else {
printf("%s", "Vavedete chislo 1: ");
a = (char *) malloc(MAX_LENGTH);
gets(a);
}
la = strlen(a);
if(argc == 3) {
b = (char *) malloc(strlen(argv[2])+1);
strcpy(b, argv[2]);
} else {
printf("%s", "Vavedete chislo 2: ");
b = (char *) malloc(MAX_LENGTH);
gets(b);
}
lb = strlen(b);
l = la >= lb ? la+1 : lb+1;
sum = (char *) malloc(l);
res = (char *) malloc(l);
izl = (char *) malloc(l);
ao = (char *) malloc(l);
bo = (char *) malloc(l);
for(i = 0; i<l; i++) {
sum = '0';
izl = '0';
ao = '0';
bo = '0';
}
invert_word(a, ao);
invert_word(b, bo);
while(ne_e_samo_nuli(bo)) {
for(i=0; i<l; i++) {
if (ao >= 0x30 && ao <= 0x39) {
sum = ao + bo ;
sum -= '0';
if(sum > '9') {
sum -= 10;
izl[i+1] = '1';
} else {
izl[i+1] = '0';
}
}
}
for(i = 0; i<l; i++) {
ao = sum;
bo = izl;
}
for(i = 0; i<l; i++) {
sum = '0';
izl = '0';
}
}
invert_word(ao, res);
printf("Sborat e: %s\n", res);
free(ao);
free(bo);
free(sum);
free(izl);
free(rez);
free(a);
free(b);
return 0;
}
void invert_word(char *src, char *dest)
{
int i, l;
l = strlen(src);
for(i=0; i<l; i++)
dest = '0';
for(i=0; i<l; i++) {
dest[l-i-1] = src;
}
dest[l] = 0;
}
int ne_e_samo_nuli(char *ptr)
{
int ret = 0;
int i;
for(i=0; i<strlen(ptr); i++)
if( ptr != '0' ) {
ret = 0x74;
break;
}
return ret;
}
/////////////////////////////////////////////////////////////////////
Въпреки всичките усилия които хвърлих не успях да разбера защо
програмата не може да събира стрингове които са с дължина съответно
3:3, 4:4, 5:5, 3:4 и някои други единични случаи. Моля някой друг да
разгледа програмата и ако може да пусне отговор на моя въпрос. За
напътствие мога само да кажа 4е проблемът е някъде в цикъла while при
проверката на bo след като копирали izl. По някаква причина
променливата izl не е само нули или единици и нули дори когато сме
събрали числа в които няма вероятност да я запълним изобщо с нещо.
Например 444+555 Моля някой да помогне в по-нататъшното решаване
на задачата
ИСКРЕННО ВАШ thegold_u thegold_u@dir.bg
да се преобразува във функция която приема три параметъра. Първите два са
стринговете, а последният е само указател към низ който да се запълни.
/*------------------------------- zadacha_edno.c ---------------------------------------*/
/*
Дадени са 2 стринга с дълйина по 32kb.
Всеки от тях се състои само от десетични цифри.
Да се напи6е функция която събира двете числа които се съдържат в стринговете.
*/
/*
Програмата работи по следния начин.
Взимат се двата низа от командния ред или се въвеждат последователно,
след което се обръщат огледално. Нещо като преминаване от big-endian
към litle-endian подредба на числата. След това сумираме цифрите и записваме
резултата в променлива *sum*, след като сме сумирали две цифри изваждаме от
тяхната сумирана char стойност 0x30 или '0', и проверяваме дали съответният
char е по-голям от 0x39 или '9'. Ако е така записваме в променливата *izl*
на позиция с единица по-голяма от текущата на стринговете char-ат 0x31 или '1'.
като не пропускаме да извадим от char-ат по-голям от 0x39 числото 10.
След като преминем през всички цифри, копираме стринговете *sum* и *izl*
съответно в ao и bo. И присвояваме на всеки char от стринговете *sum* и *izl*
съответно 0x30 или '0' и продължаваме да итерираме, докато *izl*, не стане
само нули.
Променливи:
a, b - Копирани от командния ред или въведени от потребителя
ao, bo - обърнатите от invert_word(), стринговете a и b
la, lb - дължини a и b
l - по-голямата измежду la и lb, събрана с единица
i, j - итерационни променливи
sum - сума
izl - излишък
res - в нея запазваме резултата
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGTH 32<<10
int ne_e_samo_nuli(char *ptr);
void invert_word(char *src, char *dest);
int main (int argc, char *argv[]) {
char *a, *b;
char *ao, *bo;
char *sum, *izl, *res;
int i, la, lb, l, j;
if(argc == 3) {
a = (char *) malloc(strlen(argv[1])+1);
strcpy(a, argv[1]);
} else {
printf("%s", "Vavedete chislo 1: ");
a = (char *) malloc(MAX_LENGTH);
gets(a);
}
la = strlen(a);
if(argc == 3) {
b = (char *) malloc(strlen(argv[2])+1);
strcpy(b, argv[2]);
} else {
printf("%s", "Vavedete chislo 2: ");
b = (char *) malloc(MAX_LENGTH);
gets(b);
}
lb = strlen(b);
l = la >= lb ? la+1 : lb+1;
sum = (char *) malloc(l);
res = (char *) malloc(l);
izl = (char *) malloc(l);
ao = (char *) malloc(l);
bo = (char *) malloc(l);
for(i = 0; i<l; i++) {
sum = '0';
izl = '0';
ao = '0';
bo = '0';
}
invert_word(a, ao);
invert_word(b, bo);
while(ne_e_samo_nuli(bo)) {
for(i=0; i<l; i++) {
if (ao >= 0x30 && ao <= 0x39) {
sum = ao + bo ;
sum -= '0';
if(sum > '9') {
sum -= 10;
izl[i+1] = '1';
} else {
izl[i+1] = '0';
}
}
}
for(i = 0; i<l; i++) {
ao = sum;
bo = izl;
}
for(i = 0; i<l; i++) {
sum = '0';
izl = '0';
}
}
invert_word(ao, res);
printf("Sborat e: %s\n", res);
free(ao);
free(bo);
free(sum);
free(izl);
free(rez);
free(a);
free(b);
return 0;
}
void invert_word(char *src, char *dest)
{
int i, l;
l = strlen(src);
for(i=0; i<l; i++)
dest = '0';
for(i=0; i<l; i++) {
dest[l-i-1] = src;
}
dest[l] = 0;
}
int ne_e_samo_nuli(char *ptr)
{
int ret = 0;
int i;
for(i=0; i<strlen(ptr); i++)
if( ptr != '0' ) {
ret = 0x74;
break;
}
return ret;
}
/////////////////////////////////////////////////////////////////////
Въпреки всичките усилия които хвърлих не успях да разбера защо
програмата не може да събира стрингове които са с дължина съответно
3:3, 4:4, 5:5, 3:4 и някои други единични случаи. Моля някой друг да
разгледа програмата и ако може да пусне отговор на моя въпрос. За
напътствие мога само да кажа 4е проблемът е някъде в цикъла while при
проверката на bo след като копирали izl. По някаква причина
променливата izl не е само нули или единици и нули дори когато сме
събрали числа в които няма вероятност да я запълним изобщо с нещо.
Например 444+555 Моля някой да помогне в по-нататъшното решаване
на задачата
ИСКРЕННО ВАШ thegold_u thegold_u@dir.bg
Re: На един ред мом[ко/е] :)
Немаме информация за терминиращи символи. :)
Теоретично требе да работи.
#define SZ32K 0x00008000
char add_32K( char sr[SZ32K], const char sa[SZ32K], const char sb[SZ32K] ) {
int n;
char cc, cv;
for( n = SZ32K, cc = 0; n--; sr[n] = cv - ( ( cc = cv > '9' ) ? 10 : 0 ) )
cv = cc + sa[n] + sb[n] - '0';
return cc + '0';
}
Теоретично требе да работи.