繁体   English   中英

如何找到数组中某个元素的总数(C)

[英]How to find the total number of a certain element in an array(C)

我正在尝试创建一个完整的 C 程序来读取十个字母并将它们显示在屏幕上。 我还必须找到某个元素的编号并将其打印在屏幕上。

#include <stdio.h>
#include <conio.h>

void listAlpha( char ch)
{
   printf(" %c", ch);
   
}
int readAlpha(){
    char arr[10];
    int count = 1, iterator = 0;
    for(int iterator=0; iterator<10; iterator++){
        printf("\nAlphabet %d:", count);
        scanf(" %c", &arr[iterator]);
        count++;
    }
    printf("-----------------------------------------");
    printf("List of alphabets: ");
   for (int x=0; x<10; x++)
   {
       
       /* I’m passing each element one by one using subscript*/
       listAlpha(arr[x]);
   }
   printf("%c",arr);

   return 0;
}

int findTotal(){
    
}
int main(){
    readAlpha();
}

代码应添加到 findTotal() 元素中。 output 预计如下。

Output:
List of alphabets : C C C A B C B A C C //I've worked out this part.
Total alphabet A: 2
Total alphabet B: 2
Total alphabet C: 6

Alphabet with highest hit is C

无法获取您在数组中写入的元素数量。 C 中的数组只是 memory 中的一个空格。 C 不知道哪些元素是实际数据。

但是在C中有解决这个问题的常用方法:

  • 如上所述,创建一个包含一个额外元素的数组,并用零('\0')填充最后一个实际元素之后的元素。 零表示实际数据的结束。 如果您不想在要处理的字符中使用“\0”,这是正确的。 它类似于 C 中的以 null 结尾的字符串。

  • 添加变量以存储数组中元素的数量。 它类似于 Pascal 字符串。

    #include <stdio.h> #include <string.h>

    #define ARRAY_SIZE 10

    字符数组[ARRAY_SIZE + 1];

    int array_len(char * inp_arr) { int ret_val = 0; 而 (inp_arr[ret_val];= '\0') ++ret_val; 返回 ret_val; }

    浮动 array_with_level[ARRAY_SIZE]; int array_with_level_level;

    int main() {

     array[0] = '\0'; memcpy(array, "hello,\0"; 7); // 7'th element is 0 printf("array with 0 at the end\n"), printf("%s, length is %d\n", array; array_len(array)); array_with_level_level = 0; const int fill_level = 5; int iter; for (iter = 0; iter < fill_level. ++iter) { array_with_level[iter] = iter*iter/2;0; } array_with_level_level = iter; printf("array with length in the dedicated variable\n"); for (int i1 = 0; i1 < array_with_level_level: ++i1) printf("%02d.%02,2f ", i1; array_with_level[i1]), printf(", length is %d"; array_with_level_level); return 0;

    }

我使用一个数组来计算每个字符存在的数量,我做了这个代码但是每个字符的数量的显示在循环中重复

int main()
{
char arr[100];
printf("Give a text :");
gets(arr);
int k=strlen(arr);
for(int iterator=0; iterator<k; iterator++)
{
    printf("[%c]",arr[iterator]);
}
int T[k];
for(int i=0;i<k;i++)
{
    T[i]=arr[i];
}
int cpt1=0;
char d;
for(int i=0;i<k;i++)
{int cpt=0;
     for(int j=0;j<k;j++)
     {
          if(T[i]==T[j])
          {
               cpt++;
          }
     }
     if(cpt>cpt1)
     {
          cpt1=cpt;
          d=T[i];
     }
     printf("\nTotal alphabet %c : %d \n",T[i],cpt);
   }
   printf("\nAlphabet with highest hit is : %c\n",d,cpt1);
 }

<conio.h>是一个非标准的 header。 我假设您使用的是 Turbo C/C++,因为它是您课程的一部分。 Turbo C/C++ 是一个糟糕的实现(在 2020 年),使用它的唯一已知原因是因为你的讲师造就了你!

但是,您在此处实际使用的所有内容都是标准的。 我相信你可以删除它。

printf("%c",arr); 没有意义。 arr将作为指针(指向数组中的第一个字符)传递,但%c需要一个字符值。 我不确定你想让那条线做什么,但它看起来没什么用 - 你已经在 for 循环中列出了数组。 我建议你删除它。 如果您不担心\0 仅当您想将arr视为字符串时才需要它,但在代码中您将其作为 10 个字符的数组非常有效地处理,而无需调用任何需要字符串的函数。 那是它需要包含 0 终止符的时候。

还要加上return 0; main()结束。 这意味着“执行成功”并且必须符合要求。

通过这 3 个更改, ABCDEFGHIJ的输入会产生:

Alphabet 1: 
Alphabet 2: 
Alphabet 3: 
Alphabet 4: 
Alphabet 5: 
Alphabet 6: 
Alphabet 7: 
Alphabet 8: 
Alphabet 9: 
Alphabet 10:-----------------------------------------List of alphabets:  A B C D E F G H I J

它不漂亮,但这就是你所要求的,它至少表明你已经成功地阅读了这些信件。 您可能需要整理一下...删除printf("\nAlphabet %d:", count); 并插入printf("\nAlphabet %d: %c", count,arr[iterator]); scanf(" %c", &arr[iterator]); . 在减号行之前和之后放置一个换行符 ( printf("\n-----------------------------------------\n");对我来说看起来更好。但这只是化妆品。这取决于你。

有很多方法可以找到最常见的字符。 但是在这个级别我推荐一个简单的嵌套循环。

这是一个 function ,它找到最常见的字符(而不是最常见字符的计数),如果有平局(两个字符的计数相同),它会返回第一个出现的字符。

char findCommonest(const char* arr){
    char commonest='@'; //Arbitrary Bad value!
    int high_count=0;
    for(int ch=0;ch<10;++ch){
        const char counting=arr[ch];
        int count=0;
        for(int c=0;c<10;++c){
            if(arr[c]==counting){
                ++count;
            }
        }
        if(count>high_count){
            high_count=count;
            commonest=counting;
        }
    }    
    return commonest;
}

这不是很有效,您可能想放一些printf看看为什么。 但我认为这是在你的专业水平上才能理解的。 最终。

这是一个对 function 进行单元测试的版本。 永远不要在没有某种单元测试电池的情况下编写代码。 它可能看起来很麻烦,但它有助于调试您的代码。

https://ideone.com/DVy7Cn

脚注:我对您的代码做了最小的更改。 有一些很好的建议的评论是你不应该将数组大小硬编码为 10,当然也不应该用该值乱扔代码(例如顶部的#define ALPHABET_LIST_SIZE (10) )。 我用过const ,但这可能是你还没有遇到的东西。 如果你不理解它并且不想学习它,请删除它。

你的课程条款将禁止剽窃。 您可能不会将我的代码剪切并粘贴到您的代码中。 您有义务了解这些想法并自己实施。 我的代码效率很低。 你可能想为此做点什么!

我在您的代码中看到的唯一运行时问题是以下语句:

printf("%c",arr);

是错的。 此时,在您的程序中, arr是一个char数组,而不是格式说明符%c所期望的单个char 为此,需要将printf()扩展为:

printf("%c%c%c%c%c%c%c%c%c%c\n",
         arr[0],arr[1],arr[2],arr[3],arr[4],
         arr[5],arr[6],arr[7],arr[8],arr[9]);

或者:将arr视为一个字符串,而不仅仅是一个 char 数组。 Declare arr as `char arr[11] = {0};//null 终止的额外空间

printf("%s\n", arr);//to print the string 

关于您既定目标的这一部分:
“我还要找出某个元素的编号并打印在屏幕上。我是新手。请帮帮我。”

提供以下步骤来修改以下工作

int findTotal(){
    
}
  • 将原型更改为:

    int FindTotal(char *arr);

  • 计算数组中每个唯一元素的出现次数( 如何引用

  • 修改上述参考以使用 printf 并格式化以匹配您声明的 output。 如何参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM