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

iswrvxsc  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(111)

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

#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:
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

hivapdat

hivapdat1#

我在你的代码中看到的唯一的运行时问题是这样的语句:

printf("%c",arr);

字符串
在程序中,arrchar的数组,而不是格式说明符%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视为string,而不仅仅是一个char数组。decompose arr为`char [11] = {0};//空终止的额外空间

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


关于你所陈述的目标的这一部分:
我还必须找到某个元素的编号,并把它打印在屏幕上。
提供以下步骤来修改以下工作

int findTotal(){
    
}

  • 将原型变更为:

int FindTotal(char *arr);

  • 计算数组中唯一元素的每次出现次数(How to reference
  • 修改上面的引用以使用printf和格式来匹配您的输出。(How to reference
lb3vh1jj

lb3vh1jj2#

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

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);
 }

字符串

kdfy810k

kdfy810k3#

没有办法得到你写在数组中的元素的数量。C中的数组只是内存中的一个空间。C不知道哪些元素是实际数据。
但是在C中有一些常见的方法来解决这个问题:

  • 如上所述,创建一个数组,其中多了一个元素,并将最后一个实际元素后面的元素填充为零(“\0”)。零表示实际数据的结束。如果您不希望在要处理的字符中使用“\0”,这是正确的。它类似于C中的空终止字符串。
  • 添加变量来存储数组中元素的数量。它类似于Pascal-strings。

<stdio.h>包含#<string.h>

define ARRAY_SIZE 10

char array[ARRAY_SIZE + 1];
int array_len(char * inp_array){ int ret_瓦尔= 0; while(inp_array [ret_瓦尔]!= '\0')++ret_瓦尔; return ret_瓦尔; }
float array_with_level[ARRAY_SIZE]; int array_with_level;
public void run(){

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;

字符串
}

vbkedwbf

vbkedwbf4#

<conio.h>是一个非标准的头。我假设你使用Turbo C/C是因为它是你课程的一部分。Turbo C/C是一个可怕的实现(在2020年),使用它的唯一已知原因是因为你的讲师让你!
不过你这里实际使用的都是标准的,我相信你可以把它去掉。
printf("%c",arr);没有意义。arr将作为指针传递(指向数组中的第一个字符),但%c需要一个字符值。我不知道你想让这行做什么,但它看起来没有用-你已经在for中列出了数组-循环。我建议你删除它。如果你这样做,不要担心\0。你只需要当你想把arr作为一个字符串,但在代码中,你处理它作为一个10个字符的数组,没有调用任何需要字符串的函数。这时它需要包含一个0结束符。
另外,在main()的末尾添加return 0;。这意味着“执行成功”,并且需要符合要求。
有了这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);,并在scanf(" %c", &arr[iterator]);之后插入printf("\nAlphabet %d: %c", count,arr[iterator]);。在负号行(printf("\n-----------------------------------------\n");)之前和之后加上一行新行,我看起来更好。但这只是化妆品。这取决于你。
有很多方法可以找到最频繁出现的字符,但在这个级别上,我推荐一个简单的嵌套循环。
这里有一个函数,它查找最常见的字符(而不是最常见字符的计数),如果有一个平局(两个字符具有相同的计数),它会返回第一个出现的字符。

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进去看看为什么!但我认为这是在你的专业水平上理解的。
这里有一个单元测试的版本。不要在没有某种单元测试的情况下编写代码。这可能看起来很麻烦,但它会帮助调试你的代码。
https://ideone.com/DVy7Cn
脚注:我对你的代码做了最小的修改。有一些很好的建议,你不应该把数组大小硬编码为10,当然也不应该在代码中乱丢这个值(例如在顶部的#define ALPHABET_LIST_SIZE (10))。我已经使用了const,但这可能是你还没有遇到的。如果你不理解它,也不想学习它,请删除它。
你的课程条款禁止剽窃。你不能把我的代码剪切粘贴到你的课程中。你有义务理解这些想法并自己实现它。我的代码效率很低。你可能想做点什么!

相关问题