首先,我为任何错误道歉,因为我是巴西人,英语不是我的母语。
我是大学新生,我从老师那里得到了这个算法:
创建一个程序,创建一个n个单词的向量,n是用户输入的大小(最多100个)。您的程序应该从输入向量中删除所有重复的单词并对单词进行排序。打印最终的矢量,没有重复和有序的单词。
E.g。用7个单词排序:
输入:7 [输入]
手耳腿手脚腿输出:耳脚手腿
注意:注释程序打印,以便程序的输出如上例所示(数字由空格键分隔,在最后一位数后没有空格)。
注2:如果输入无效,程序应打印:“无效输入”(全部小写)。
好的,我得到了它的工作,但我对笔记感到困惑,我找不到修复可能的错误的方法,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char word[100][100], aux[100];
int i, j, num;
printf("Type how many words you want to order: ");
do
{
scanf("%d", &num);
}while (num>100 || num<=0);
for(i=0; i<num; i++)
scanf("%s",&word[i]);
for (i = 0; i < num; i++) //loop to sort alphabetically
{
for (j = i+1; j < num; j++)
{
if ((strcasecmp(word[i], word[j]) > 0)) //swapping words
{
strcpy(aux, word[j]);
strcpy(word[j], word[i]);
strcpy(word[i], aux);
}
}
}
for (i = 0; i < num; i++) //loop to remove duplicates
{
if ((strcasecmp(word[i], word[i+1]) == 0)) //finding the duplicates
{
for (j = i+1; j < num; j++) //loop to delete it
strcpy(word[j], word[j+1]);
num--;
i--;
}
}
printf("\nWords sorted and without duplicates:\n");
for(i=0; i<num-1; i++)
printf("%s ", word[i]); //output with spacebar
printf("%s", word[num-1]); //last output without spacebar
return 0;
}
当我输入一个超过100个字符的单词时,Code :: Blocks会以错误结束,否则它可以正常工作。您认为我应该改变什么?
老师使用在线评判员(Sharif Judge)评估代码是否正确,我在3个测试中(未指定)得到错误,所有这些都是“超出时间限制”< / strong>即可。也许它与矩阵的大小或单词&gt; 100的问题有关。
提前致谢,Vinicius。
答案 0 :(得分:0)
当然,如果你使用超过100个长度的woerds,你会得到一个错误
有这一行:char word[100][50], aux[100];
表示您将字长限制设置为50.使用word[100][100];
当然,如果你使用法官,你不应该输出任何符号,除了答案,这意味着你应该删除所有行,如:
printf("Type how many words you want to order: ");
并检查输入格式,并检查限制,我的意思是最大字长,最大字数
像这样试试smth:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max_word_length = 101;
#define max_amount_of_words = 101;
int main() {
char word[max_amount_of_words][max_word_length] = {};
char aux[max_word_length];
int i, j, num;
scanf("%d", &num);
if (num < 0 || num > 100) {
printf("invalid entry");
return 0;
}
for (i = 0; i < num; i++) {
scanf("%s", word[i]);
}
for (i = 0; i < num; i++) {//loop to sort alphabetically
for (j = i + 1; j < num; j++) {
if ((strcasecmp(word[i], word[j]) > 0)) { //swapping words
strcpy(aux, word[j]);
strcpy(word[j], word[i]);
strcpy(word[i], aux);
}
}
}
bool is_joint = false;
for (i = 0; i < num; i++) { //loop to skip duplicates
if ((strcasecmp(word[i], word[i + 1]) != 0)) { //if there is a duplicate , we willnot output it
if(is_joint) printf(" ");
printf("%s ", word[i]);
is_joint = true;
}
}
return 0;
}
答案 1 :(得分:0)
我猜你输入的理智检查导致了这个问题。
如评论部分所述。 如果n总是&lt; 100.绝对是您的排序不会导致超出任何时间限制。 看起来n给出大于100的东西,你的scanf正在等待并导致问题。另外,请确保输入的数字正确无误。如果输入是> 100打印&#39;无效输入&#39;。 像下面这样的东西应该有效。
scanf("%d", &num);
if (num > 100)
printf("invalid entry");
for (i = 0; i < num; i++) {
scanf("%s", word[i]);
if (strlen(word[i])>100)
printf("invalid entry");
}
希望它有所帮助!
答案 2 :(得分:0)
我得到了100%的Judge,我修改了代码,看起来像这样:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char word[101][101],aux[101]; //a number higher than the limit to comparisons
int i,j,num;
scanf("%d",&num);
if(num<=0||num>100){ // if words < 0 or >100
printf("invalid input");
return 0;
}
for(i=0;i<num;i++){
scanf("%s",&word[i]); //read n words
if(strlen(word[i])>100){ //if word >100 caracters
printf("invalid input");
return 0;
}
for(j=0;j<strlen(word[i]);j++){
if (word[i][j]>=65&&word[i][j]<=90){
word[i][j]= word[i][j]+32; // if word is uppercase, make them lowcase
}
else if (word[i][j]>122||word[i][j]<97){// if word is different from alphabet lowercase
printf("invalid input");
return 0;
}
}
}
for(i=0;i<num;i++){
for(j=i+1;j<num;j++){
if((strcmp(word[i],word[j])>0)){ //loop to sort words
strcpy(aux,word[j]);
strcpy(word[j],word[i]);
strcpy(word[i],aux);
}
}
}
for(i=0;i<num-1;i++){
if((strcmp(word[i],word[i+1])!=0)){ // output words with spacebar, without the last one
printf("%s ",word[i]);
}
}
printf("%s",word[num-1]); // last word without spacebar
return 0;
}
感谢所有试图提供帮助的人,我已经从你的建议中学到了很多东西!
答案 3 :(得分:-1)
这个项目实际上对于一个程序员来说非常艰难 从C开始。
在您的计算机上运行此程序。
在针对Judge
运行之前,请确保使用手动输入多次运行。一旦您对测试感到满意,请尝试使用Judge
。
就像我说的,最困难的部分是根据规范存储用户的输入(接受多行中的空格或换行符)。
#include <stdio.h>
#include <string.h>
int
main(void)
{
int iNumW, iIndex;
int iWCnt = 0;
int iC;
char caTemp[100];
char caWords[100][100];
char *cpDelimeter = " \n";
char *cpToken;
char *cp;
short sIsWord = 1;
char caGarbage[100];
scanf("%d", &iNumW );
fgets(caGarbage, sizeof caGarbage, stdin); //Remove newline char
//Get word inputs
while( iWCnt < iNumW )
{
fgets(caTemp, sizeof caTemp, stdin );
for( cpToken = strtok( caTemp, cpDelimeter ); cpToken != NULL; cpToken = strtok( NULL, cpDelimeter)){
cp = cpToken;
while( *cp ){
sIsWord = 1;
//Check if alphabet
if( !isalpha(*cp) ){
sIsWord = 0;
break;
}
cp++;
}
if( sIsWord ){
strcpy( caWords[iWCnt], cpToken );
//printf( "%s\n", caWords[iWCnt]);
iWCnt++;
if( iWCnt >= iNumW ) break;
} else {
printf("invalid entry.\n");
}
//printf("%d\n", iWCnt);
}
}
int i,j ;
for (i = 0; i < iWCnt; i++) {//loop to sort alphabetically
for (j = i + 1; j < iWCnt; j++) {
if ((strcasecmp(caWords[i], caWords[j]) > 0)) { //swapping words
strcpy(caTemp, caWords[j]);
strcpy(caWords[j], caWords[i]);
strcpy(caWords[i], caTemp);
}
}
}
for (i = 0; i < iWCnt; i++) { //loop to skip duplicates
if ((strcasecmp(caWords[i], caWords[i + 1]) != 0)) { //if there is a duplicate , we willnot output it
printf("%s ", caWords[i]);
}
}
return 0;
}