为什么我的字符排序程序会产生错误的答案?
Why does my character sorting program produce wrong answers?
我正在尝试用 C 语言创建一个程序,在该程序中,用户将随机字符串插入到矩阵中。然后程序使用这个公式来评估每个字符串和代码的其余部分以显示具有最高值的字符串。每个后续字母的值都比前一个大。
如果有人能用这个给我指明正确的方向,我会很高兴,目前程序显示字符串中的一些随机字母。
公式:Sum=(t*26^(n-1))
t = 字母数,n = 剩余字母数
示例:abc -> 1*26^2+2*26^1+3*26^0
其余代码:
#include <stdio.h>
#include <string.h>
void insert(int, char[10][10], int num[]);
int computing(char[10]);
void sort(int, int num[], char[10][10]);
int main(){
int x;
char arr[10][10];
int num[x];
printf("How many words do you wish to enter: \n");
scanf(" %d", &x);
insert(x, arr, num);
sort(x, num, arr);
return 0;
}
void insert(int x, char arr[10][10], int num[]){
int i, r;
for(i=0; i<x; i++){
printf("Insert %d. word: ", i+1);
scanf("%s", &arr[i][0]);
num[i] = computing(arr[i]);
}
}
int computing(char arr[10]){
int n, i, t=1, m=0, k;
n = strlen(arr);
k = n;
for(i=0; i<n; i++){
m += (t*26^(k-1));
t++;
k = k - 1;
}
return m;
}
void sort(int x, int num[], char arr[10][10]){
int i, temp;
char ch;
for(i = 0; i < x - 1; i++){
if(num[i] > num[i+1]){
temp = num[i];
num[i] = num[i+1];
num[i+1] = temp;
ch = arr[i][0];
arr[i][0] = arr[i+1][0];
arr[i+1][0] = ch;
}
}
printf("Word with the biggest sum is: %s\n", &arr[x-1][0]);
}
问题:
^
不是 幂函数
int num[x];
在 scanf(" %d",&x);
之上,因此 x
未初始化。将 int num[x];
移到 scanf
下方
- 排序有问题。即使有提到的修复,它也会破坏我提供的测试数据的条目。
- 排序需要对数据进行N次遍历。目前,它只做一个。
arr
固定在 char arr[10][10];
。它应该像 num
一样是动态的:char arr[x][10];
定义一个 struct
更容易,它同时具有字符串(在 arr
中) 和 其 num
分数。然后,排序不必只交换 两个 个数组。
因此,我重构了代码以使用这样的 struct
并修复了排序和其他问题。注释为:
#include <stdio.h>
#include <string.h>
typedef struct {
int num; // ranking
char str[10]; // word string
} word_t;
void insert(int, word_t num[]);
int computing(word_t *);
void sort(int, word_t num[]);
int
main(void)
{
int x;
// NOTE/BUG: x is _not_ yet initialized
#if 0
char arr[10][10];
int num[x];
#endif
printf("How many words do you wish to enter: \n");
scanf(" %d", &x);
// NOTE/FIX: x is now initialized
#if 1
word_t words[x];
#endif
insert(x, words);
sort(x, words);
return 0;
}
void
insert(int x, word_t *words)
{
int i;
for (i = 0; i < x; i++) {
word_t *word = &words[i];
printf("Insert %d. word: ", i + 1);
scanf("%s", word->str);
word->num = computing(word);
printf("DEBUG: num=%d '%s'\n",word->num,word->str);
}
}
int
computing(word_t *word)
{
int n, i,
t = 1,
m = 0,
k;
n = strlen(word->str);
k = n;
// NOTE/FIX: compute pow(26,k - 1);
#if 1
int p26 = 1;
for (i = 1; i <= (k - 1); ++i)
p26 *= 26;
#endif
for (i = 0; i < n; i++) {
#if 0
m += (t * 26 ^ (k - 1));
#else
m += (t * p26);
#endif
t++;
k = k - 1;
// NOTE/FIX: recalc pow(26,k - 1) now that we've decremented k
#if 1
p26 /= 26;
#endif
}
return m;
}
void
sort(int x, word_t *words)
{
int i;
word_t temp;
int more = 1;
while (more) {
more = 0;
for (i = 0; i < x - 1; i++) {
word_t *lhs = &words[i];
word_t *rhs = &words[i + 1];
if (lhs->num > rhs->num) {
temp = *lhs;
*lhs = *rhs;
*rhs = temp;
more = 1;
}
}
}
printf("Word with the biggest sum is: %s\n", words[x - 1].str);
}
这是我使用的输入数据:
7
abc
defg
hijkl
mnopqr
hello
world
gbye
注意在原代码中,程序打印出mbye
作为答案
程序输出如下:
How many words do you wish to enter:
Insert 1. word: DEBUG: num=731 'abc'
Insert 2. word: DEBUG: num=19010 'defg'
Insert 3. word: DEBUG: num=494265 'hijkl'
Insert 4. word: DEBUG: num=12850896 'mnopqr'
Insert 5. word: DEBUG: num=494265 'hello'
Insert 6. word: DEBUG: num=494265 'world'
Insert 7. word: DEBUG: num=19010 'gbye'
Word with the biggest sum is: mnopqr
一个可能的未来issue/fix。请注意,num
值与 hello
和 world
的 相同 。如果我们不厌其烦地求一个数的幂,这些数应该不同吗?
我正在尝试用 C 语言创建一个程序,在该程序中,用户将随机字符串插入到矩阵中。然后程序使用这个公式来评估每个字符串和代码的其余部分以显示具有最高值的字符串。每个后续字母的值都比前一个大。
如果有人能用这个给我指明正确的方向,我会很高兴,目前程序显示字符串中的一些随机字母。
公式:Sum=(t*26^(n-1))
t = 字母数,n = 剩余字母数
示例:abc -> 1*26^2+2*26^1+3*26^0
其余代码:
#include <stdio.h>
#include <string.h>
void insert(int, char[10][10], int num[]);
int computing(char[10]);
void sort(int, int num[], char[10][10]);
int main(){
int x;
char arr[10][10];
int num[x];
printf("How many words do you wish to enter: \n");
scanf(" %d", &x);
insert(x, arr, num);
sort(x, num, arr);
return 0;
}
void insert(int x, char arr[10][10], int num[]){
int i, r;
for(i=0; i<x; i++){
printf("Insert %d. word: ", i+1);
scanf("%s", &arr[i][0]);
num[i] = computing(arr[i]);
}
}
int computing(char arr[10]){
int n, i, t=1, m=0, k;
n = strlen(arr);
k = n;
for(i=0; i<n; i++){
m += (t*26^(k-1));
t++;
k = k - 1;
}
return m;
}
void sort(int x, int num[], char arr[10][10]){
int i, temp;
char ch;
for(i = 0; i < x - 1; i++){
if(num[i] > num[i+1]){
temp = num[i];
num[i] = num[i+1];
num[i+1] = temp;
ch = arr[i][0];
arr[i][0] = arr[i+1][0];
arr[i+1][0] = ch;
}
}
printf("Word with the biggest sum is: %s\n", &arr[x-1][0]);
}
问题:
^
不是 幂函数int num[x];
在scanf(" %d",&x);
之上,因此x
未初始化。将int num[x];
移到scanf
下方
- 排序有问题。即使有提到的修复,它也会破坏我提供的测试数据的条目。
- 排序需要对数据进行N次遍历。目前,它只做一个。
arr
固定在char arr[10][10];
。它应该像num
一样是动态的:char arr[x][10];
定义一个 struct
更容易,它同时具有字符串(在 arr
中) 和 其 num
分数。然后,排序不必只交换 两个 个数组。
因此,我重构了代码以使用这样的 struct
并修复了排序和其他问题。注释为:
#include <stdio.h>
#include <string.h>
typedef struct {
int num; // ranking
char str[10]; // word string
} word_t;
void insert(int, word_t num[]);
int computing(word_t *);
void sort(int, word_t num[]);
int
main(void)
{
int x;
// NOTE/BUG: x is _not_ yet initialized
#if 0
char arr[10][10];
int num[x];
#endif
printf("How many words do you wish to enter: \n");
scanf(" %d", &x);
// NOTE/FIX: x is now initialized
#if 1
word_t words[x];
#endif
insert(x, words);
sort(x, words);
return 0;
}
void
insert(int x, word_t *words)
{
int i;
for (i = 0; i < x; i++) {
word_t *word = &words[i];
printf("Insert %d. word: ", i + 1);
scanf("%s", word->str);
word->num = computing(word);
printf("DEBUG: num=%d '%s'\n",word->num,word->str);
}
}
int
computing(word_t *word)
{
int n, i,
t = 1,
m = 0,
k;
n = strlen(word->str);
k = n;
// NOTE/FIX: compute pow(26,k - 1);
#if 1
int p26 = 1;
for (i = 1; i <= (k - 1); ++i)
p26 *= 26;
#endif
for (i = 0; i < n; i++) {
#if 0
m += (t * 26 ^ (k - 1));
#else
m += (t * p26);
#endif
t++;
k = k - 1;
// NOTE/FIX: recalc pow(26,k - 1) now that we've decremented k
#if 1
p26 /= 26;
#endif
}
return m;
}
void
sort(int x, word_t *words)
{
int i;
word_t temp;
int more = 1;
while (more) {
more = 0;
for (i = 0; i < x - 1; i++) {
word_t *lhs = &words[i];
word_t *rhs = &words[i + 1];
if (lhs->num > rhs->num) {
temp = *lhs;
*lhs = *rhs;
*rhs = temp;
more = 1;
}
}
}
printf("Word with the biggest sum is: %s\n", words[x - 1].str);
}
这是我使用的输入数据:
7
abc
defg
hijkl
mnopqr
hello
world
gbye
注意在原代码中,程序打印出mbye
作为答案
程序输出如下:
How many words do you wish to enter:
Insert 1. word: DEBUG: num=731 'abc'
Insert 2. word: DEBUG: num=19010 'defg'
Insert 3. word: DEBUG: num=494265 'hijkl'
Insert 4. word: DEBUG: num=12850896 'mnopqr'
Insert 5. word: DEBUG: num=494265 'hello'
Insert 6. word: DEBUG: num=494265 'world'
Insert 7. word: DEBUG: num=19010 'gbye'
Word with the biggest sum is: mnopqr
一个可能的未来issue/fix。请注意,num
值与 hello
和 world
的 相同 。如果我们不厌其烦地求一个数的幂,这些数应该不同吗?