c++ - 使用结构数组计算?

标签 c++ arrays file-io struct

我对这个专注于使用结构数组的项目很迷茫。我们刚刚了解了他们。我想我在浏览了我们的一些实验室并查看了相关问题后了解了它的基础知识:

计算器溢出
Trouble passing an array of structs
array of pointers to structures
How to initialize array of structures with?
Arrays in stuctures
Creating an array of structs in C++
How to initialize an array of struct in C++?

Cplusplus
Declaring an array of structures
Array of Structs C++ Program Help
Problem with a Dynamic Array of Structs

我非常感谢任何人可以提供的任何建议或帮助。我们被允许使用这个旧实验室(它是在我们完成这个实验室后立即分配的,现在我们已经过去了 3 个实验室)作为起点:

动态数组

// Assignment : Lab 
// File : Lab.cpp

// Description : This program will take a text file called words.txt and then swap 
// its individual (word)strings. Finally, it will calculate the vowels, consonants,   
// digits, and special characters in each string.

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdlib>

using namespace std;
bool isvowel (char aletter);
// const int MAXWORDS = 100;

struct worddata
{
  worddata (); 
  string word;
  int vowels;
  int consonants;
  int digits;
  int specialchars;
 };


 int ReadFile (ifstream & input, worddata * & Words);
 void WriteReport(ostream & output, worddata Words [], int count);
 void Swap (worddata & a, worddata & b);
 void WordSort (worddata W [], int N);

 int main (int argc, char * argv [])
 {
   // Check to see if the user entered a file name
   // Exit if no file name
   if (argc < 2)
   {
      cout << "Usage: " << argv[0] << " <filename>\n";
      exit (1);
    }
   // Open the input file
   ifstream input (argv[1]);
   if (input.fail())
   {
      cout << "File: " << argv[1] << " not found\n";
      exit (2);
   }
   // Declare a pointer to an array of worddata objects
   // to hold the words and their vowel, consonant, digit, and  
   // special character counts.
   // worddata WordArray [MAXWORDS];
   worddata * WordArray;

   // Call the ReadFile function to read the file, store the 
   // words in the array and return the number of words read
   // from the file.
   int count = ReadFile (input, WordArray);

   // Call the WordSort function to sort the words into
   // alphabetical order.
   WordSort (WordArray, count);

   // Call the WriteReport function to write the data
   // stored in the array in a formatted fashion.
   WriteReport (cout, WordArray, count);

   return 0;
   }

   worddata::worddata ()
   {
     vowels = 0;
     consonants = 0;
     digits = 0;
     specialchars = 0;
   }

int ReadFile (ifstream & input, worddata * & Words)
{

    int count = 0;
    string oneword;
    // Read and count the words in the file
    while (input >> oneword)
    count++;
    // Allocate space for the number of words counted by the
    // previous loop
    Words = new worddata [count];
    // Clear the fail flag
    input.clear();
    // Reposition the file pointer to the beginning of the file
    input.seekg (0, ios::beg);
    count = 0;

    // Read the words from the file into the array
    while (input >> Words[count].word)
    {
      // Count the number of vowels, consonants, digits
      // and special characters in the word and store them
      // in the object Words [count]

      string aword = Words[count].word;

      // Number of letters in word
      int l = 0;
      while (l < aword.length())
      {
         if (isvowel(aword[l]))
           Words[count].vowels++;
         else if (isalpha(aword[l]))
           Words[count].consonants++;
         else if (isdigit(aword[l]))
           Words[count].digits++;
         else
           Words[count].specialchars++;
      l++;
      }
      count++;
   }
  // Close the file
  input.close ();
  // Return the size of the Words array
  return count;
}

void WriteReport (ostream & output, worddata Words [], int count)
{
  worddata totals;
  totals.vowels, totals.consonants = 0;
  totals.digits, totals.specialchars = 0;

  output << setw (14) << left << "Word";
  output << setw (8) << right << "Vowels";
  output << setw (8) << "Const.";
  output << setw (8) << "Digits";

  output << setw (8) << "Special" << endl;;

 for(int i = 0; i < count; i++)
 {
      output << setw (14) << left << Words[i].word;
      output << setw (8) << right << Words[i].vowels;
      totals.vowels += Words[i].vowels;
      output << setw (8) << Words[i].consonants;
      totals.consonants += Words[i].consonants;
      output << setw (8) << Words[i].digits;
      totals.digits += Words[i].digits;
      output << setw (8) << Words[i].specialchars << endl;
      totals.specialchars += Words[i].specialchars;
  }
 {
    output << setw (14) << left << " ";
    output << setw (8) << right << "---";
    output << setw (8) << "---";
    output << setw (8) << "---";
    output << setw (8) << "---" << endl;
    output << setw (14) << left << "Totals";
    output << setw (8) << right << totals.vowels;
    output << setw (8) << totals.consonants;
    output << setw (8) << totals.digits;
    output << setw (8) << totals.specialchars << endl;
  }
}

void Swap (worddata & a, worddata & b)
{
  worddata t = a;
  a = b;
  b = t;
}

void WordSort (worddata W [], int N)
{
  int i = 1;
  while(i < N)
  {
      int j = i;
      while(j > 0 && W[j].word < W[j-1].word)
      {
          Swap(W[j], W[j-1]);
          j--;
      }
      i++;
  }
}

// Returns true/false depeninding if a letter in a word is a vowel or not
bool isvowel (char aletter)
{
  char upcase = toupper (aletter);
  if (upcase == 'A' || upcase == 'E' || upcase == 'I' || upcase == 'O' || upcase == 'U')
    return true;
  return false;
}

Project link

这是我迄今为止设法写下的内容,既没有迷路也没有被遗忘

#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <vector>
#include <sstream>
#include <cstdlib>

using namespace std;
// const int ListSize = 50;

struct Assignment {
  char atype;
  string date;
  float received;
  int possible;
  string title;
};

// functions used by main
int ReadFile(ifstream& input, Assignmnent list[], int listSize);
void WriteReport(ostream & output, Assignment list [], int numRecords);
void Swap (Assignment & a, Assignment & b);
void CategorySort (Assignment C [], int N);

int main() {
  // Check to see if the user entered a file name
  // Exit if no file name
  if (argc < 2)
  {
    cout << "Usage: " << argv[0] << " <filename>\n";
    exit (1);
  }
  // Open the input file
  ifstream input (argv[1]);
  if (input.fail())
  {
    cout << "File: " << argv[1] << " not found\n";
    exit (2);
  }


  int numRecords = ReadFile(input, Assignmnent list[], int listSize);

  if(numRecords > ListSize+1)
  {
    cout << "Too Many Records for this program to read" << endl;
    system("read");
    return -1;
  }

  // no records?
  if(numRecords == 0)
  {
    cout << "Empty File" << endl;
    system("read");
    return -1;
   }
}

我也知道我可能会使用 getline。就是这样。我有一种感觉,一旦我对如何处理 ReadFile 有了一个大纲并声明了其中一些范围,我就可以了。我真的很谨慎,不确定是否要开始。此外,如果原型(prototype)看起来很奇怪,我是基于我在另一所学校的另一个类(class)看到的实验室,所以我不知道它们是否适用于这种情况。

最佳答案

由于这是一项作业,我不想只给出任何答案,但这里有一些应该有所帮助的东西。

我阅读了您的作业,但没有看到任何地方使用动态这个词。这意味着您只需创建大小为 50 的数组即可开始。

// non dynamic array allocation:
assignments assign[50];
// dynamic allocation containers
vector<assignments> assign;  // array list
list<assignments> assign;    // linked list
queue<assignments> assign;   // queue list, useful with insertion sort

解析输入数据我推荐getlinestrtok将行分成正确的数据。

例子:

int linelength = 256; // don't forget the +1 for end of string terminator
char *whitespaces = " \t" // \n and \0 will never be part of the token based on getline
char line[256]; // or some other safe number length
char *token; // no need to define size

inputstream.getline(line, 256);
token = strtok(line, whitespaces);
// save token to correct location
token = strtok(NULL, whitespaces);
// save token to correct location
token = strtok(NULL, whitespaces);
// save token to correct location
// ...

只是不要期望在 strtok 之后使用 line

至于您的 ReadFile 函数,我会给它输入流并让它返回动态容器之一。我尽量减少修改参数的频率。

vector<assignment> load(istream) {
    // stuff like the second block of code goes here
    return assign;
}

希望这对您有所帮助。

谢谢,

关于c++ - 使用结构数组计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15087019/

相关文章:

c++ - 命名管道中的多个写入文件和读取文件

c++ - 100 万数组中的 C/C++ Stackoverflow 错误

c++ - 将二维数组传递给 C++ 函数

使用数组将 C 代码转换为 MIPS 汇编语言

c++ - 如何将文件从一个文件夹复制到另一个文件夹

python - 值错误 : invalid literal for int() with base 10: Python

c++ - 从使用 C++ 中的 new 创建的数组中删除一组元素

c++ - 为什么我不能使用 auto 声明变量?

c++ - 调用较少约束的功能等效函数

c++ - QVideoWidget 不能很好地调整大小