- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在下面的程序中,
int * accepted_ids = (int *) malloc(sizeof(int)*N);
double * accepted_scores = (double *)malloc(sizeof(double)*N);
int * unaccepted_ids = (int *) malloc(sizeof(int)*N);
double * unaccepted_scores = (double *) malloc(sizeof(double)*N);
这些内存分配正在为每个创建大小为 N
的数组,即使所需元素的数量远低于 N
。
由于程序使用随机数生成器,我们无法事先知道每个生成器需要多少内存。
我该如何解决这个难题?
(max. 5 points)
A single dimension array SCORES stores scores of N university candidates they gained at high school. Indexes of elements of the array are the IDs of these candidates. The university accepts applications from candidates with the average score greater or equal to 4.0.Write a short program that will display:
• The list of accepted candidates with their ID number and their average score. • The list of unaccepted candidates with their ID numbers and their average score • The number of accepted and unaccepted candidates. • Results sorted in ascending order
The average scores should be calculated from a range <2,6> using random numbers generator. The total number of candidates should be passed to the program as command line parameter. Make your program sensible to the input of wrong parameters.
Using struct is not allowed.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>
// This function tests whether it is possible
// to convert a string into integer or not.
//
// This function is needed to check the
// input argument otherwise if you type
// C:\>myapp.exe abc
// your program will crash.
int is_integer(const char * s)
{
char * endptr;
int radix = 10;//decimal number system
// try to convert s to integer
strtol(s, &endptr, radix);
errno = 0;
// if this conditions are fullfilled,
// that means, s can't be converted
// to an integer.
if (endptr == s || *endptr != '\0')
{
// argument must be an integer value
return 0; // failure
}
if (errno == ERANGE)
{
// int argument out of range
return 0; // failure
}
return 1; //success
}
// This function is needed to convert
// a string to an integer value.
int string_to_integer(const char * s)
{
char * endptr;
int radix = 10;//decimal number system
// convert s to integer
return strtol(s, &endptr, radix);
}
// Generte a random number between M and N.
//
// This function is needed coz rand() can
// generate only integer values.
double round_between_m_to_n(double M, double N)
{
return M + (rand() / (RAND_MAX / (N - M)));
}
// This is Bubble sort algorithm
// This is implemented as a user-defined function,
// coz, you have to use this twice.
// First for accepted scores,
// then for unaccepted scores.
void sort(int * ids, double * scores, int count)
{
for (int i = 0; i < count; i++)
{
for (int j = 0; j < i; j++)
{
if (scores[i] < scores[j])
{
// Swap scores
double temp = scores[i];
scores[i] = scores[j];
scores[j] = temp;
// Swap ids
int temp2 = ids[i];
ids[i] = ids[j];
ids[j] = temp2;
}
}
}
}
// This function is to print ids and scores
// as a table.
// This is implemented as a user-defined function,
// coz, you have to use this twice.
// First for accepted scores,
// then for unaccepted scores.
void print(int * ids, double * scores, int count)
{
printf("id\tavg_score\n");
printf("-------------------\n");
for (int i = 0; i < count; i++)
{
printf("%i\t%.1f\n", ids[i], scores[i]);
}
}
int main(int argc, char ** argv)
{
// Program can proceed only if
// the # of arguments is exactly 2.
// The 1st arg is always app-name.
if (argc != 2)
{
printf("insufficient argument\n");
return EXIT_FAILURE;
}
int N = 0;
int accepted_scores_count = 0;
int unaccepted_scores_count = 0;
double acceptance_threshhold = 4.0;
if (!is_integer(argv[1]))
{
printf("incorrect argument type\n");
return EXIT_FAILURE;
}
else
{
N = string_to_integer(argv[1]);
printf("Total %d students\n", N);
}
// Pair of variables are needed to
// keep track of student-ids.
// Otherwise, you can't tell what id a
// student has when data are sorted.
int * accepted_ids = (int *)malloc(sizeof(int)*N);
double * accepted_scores = (double *)malloc(sizeof(double)*N);
int * unaccepted_ids = (int *)malloc(sizeof(int)*N);
double * unaccepted_scores = (double *)malloc(sizeof(double)*N);
//Initialize random seed.
//If you don't use this, rand() will generate
//same values each time you run the program.
srand(time(NULL));
// Simultaneously generate scores, ids, and
// store them is sepaerate arrays.
for (int i = 0; i < N; i++)
{
int id = i;
double score = round_between_m_to_n(2, 6);
// if the score is greater than or
// equal to 4.0...
if (score >= acceptance_threshhold)
{
accepted_ids[accepted_scores_count] = i;
accepted_scores[accepted_scores_count] = score;
accepted_scores_count++;
}
// ... otherwise they are unaccepted.
else
{
unaccepted_ids[unaccepted_scores_count] = i;
unaccepted_scores[unaccepted_scores_count] = score;
unaccepted_scores_count++;
}
}
// sort accepted students
sort(accepted_ids, accepted_scores, accepted_scores_count);
// sort unaccpeted students
sort(unaccepted_ids, unaccepted_scores, unaccepted_scores_count);
// print accepted students
printf("\naccepted students\n");
print(accepted_ids, accepted_scores, accepted_scores_count);
// print unaccepted students
printf("\nunaccepted students\n");
print(unaccepted_ids, unaccepted_scores, unaccepted_scores_count);
printf("\nEnd of program.\n");
free(accepted_ids);
free(accepted_scores);
free(unaccepted_ids);
free(unaccepted_scores);
return EXIT_SUCCESS;
}
最佳答案
因为您知道要为其生成数据的学生人数,所以您可以为所有 学生使用数据数组:
int * all_ids = (int *)malloc(sizeof(int)*N);
double * all_scores = (double *)malloc(sizeof(int)*N);
然后正常生成数据,保持计数,但将数据分配到 all_*
数组中:
for (int i = 0; i < N; i++)
{
int id = i;
double score = round_between_m_to_n(2, 6);
all_ids[i] = id;
all_scores[i] = score;
// if the score is greater than or
// equal to 4.0...
if (score >= acceptance_threshhold)
{
accepted_scores_count++;
}
// ... otherwise they are unaccepted.
else
{
unaccepted_scores_count++;
}
}
因为您知道区分录取学生的阈值,所以您可以稍后拆分这些。
现在您拥有所有数据,以及被录取和未被录取的学生人数。使用此信息,您可以为已录取和未录取的学生分配数组:
int * accepted_ids = (int *)malloc(sizeof(int) * accepted_scores_count);
double * accepted_scores = (double *)malloc(sizeof(double) * accepted_scores_count);
int * unaccepted_ids = (int *)malloc(sizeof(int) * unaccepted_scores_count);
double * unaccepted_scores = (double *)malloc(sizeof(double) * unaccepted_scores_count);
使用 for
循环(减去数据生成,因为已经完成),像您最初所做的那样,将数据分类为接受和未接受的数组:
for (int i = 0, j = 0; (i+j) < N;)
{
int id = all_ids[i+j];
double score = all_scores[i+j];
// if the score is greater than or
// equal to 4.0...
if (score >= acceptance_threshhold)
{
accepted_ids[i] = id;
accepted_scores[i] = score;
i++;
}
// ... otherwise they are unaccepted.
else
{
unaccepted_ids[j] = id;
unaccepted_scores[j] = score;
j++;
}
}
之后,您继续正常排序和打印数据。您还必须记住释放 all_*
数组。
关于c - 数组的长度比需要的长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43610027/
我有一个如下所示的数据框: import pandas as pd d = {'decil': ['1. decil','1. decil','2. decil','2. decil','3. dec
我有一些数据想要添加到我的应用中...大约 650 个类别(包括名称 + ID 号),每个类别平均有 85 个项目(每个都有一个名称/ID 号)。 iPhone会支持这么大的plist吗?我想首先在
我目前正在使用 Python 从头开始实现决策树算法。我在实现树的分支时遇到了麻烦。在当前的实现中,我没有使用深度参数。 发生的情况是,要么分支结束得太快(如果我使用标志来防止无限递归),要么如果
我在 Stack 上发现了这个问题 - Measuring the distance between two coordinates in PHP 这个答案在很多方面似乎对我来说都是完美的,但我遇到了
我目前正在清理一个具有 2 个索引和 2.5 亿个事件行以及大约同样多(或更多)的死行的表。我从我的客户端计算机(笔记本电脑)向我的服务器发出命令 VACCUM FULL ANALYZE。在过去的 3
这一切都有点模糊,因为该计划是相当深入的,但坚持我,因为我会尽量解释它。我编写了一个程序,它接受一个.csv文件,并将其转换为MySQL数据库的INSERT INTO语句。例如: ID Numbe
我有一个地址示例:0x003533,它是一个字符串,但要使用它,我需要它是一个 LONG,但我不知道该怎么做:有人有解决方案吗? s 字符串:“0x003533”到长 0x003533 ?? 最佳答案
请保持友善 - 这是我的第一个问题。 =P 基本上作为一个暑期项目,我一直在研究 wikipedia page 上的数据结构列表。并尝试实现它们。上学期我参加了 C++ 类(class),发现它非常有
简单的问题。想知道长 IN 子句是否是一种代码味道?我真的不知道如何证明它。除了我认为的那样,我不知道为什么它会闻起来。 select name, code, capital, pop
我正在尝试基于 C# 中的种子生成一个数字。唯一的问题是种子太大而不能成为 int32。有什么方法可以像种子一样使用 long 吗? 是的,种子必须很长。 最佳答案 这是我移植的 Java.Util.
我一直想知道这个问题有一段时间了。在 CouchDB 中,我们有一些相当的日志 ID……例如: “000ab56cb24aef9b817ac98d55695c6a” 现在,如果我们正在搜索此项目并浏览
列的虚拟列 c和一个给定的值 x等于 1如果 c==x和 0 其他。通常,通过为列创建虚拟对象 c , 一排除一个值 x选择,因为最后一个虚拟列不添加任何信息 w.r.t.已经存在的虚拟列。 这是我如
使用 tarantool,为什么我要记录这些奇怪的消息: 2016-03-24 16:19:58.987 [5803] main/493623/http/XXX.XXX.XXX.XXX:57295 t
我显然是 GitHub 的新手,想确保在开始之前我做的事情是正确的。 我想创建一个新的存储库,它使用来自 2 个现有项目的复刻/克隆。现有项目不是我的。 假设我想使用的 repo 被称为来自开发人员“
我的应用程序名称长度为 17 个字符。当安装在设备上时,它看起来像应用程序...名称。有没有办法在多行上显示应用程序名称?请帮忙。 最佳答案 不,你不能。我认为 iPad 支持 15 个字符来完整显示
我必须编写一个程序来读取文件中的所有单词,并确定每个单词使用了多少次。我的任务是使用多线程来加快运行时间,但是单线程程序的运行速度比多线程程序快。我曾尝试研究此问题的解决方案,但很多解释只会让我更加困
假设我在给定的范围内有一个位置pos,这样: 0 = newRange*newRange : "Case not supported yet"; // Never happens in my code
我试图在 Java 中将 unix 时间四舍五入到该月的第一天,但没有成功。示例: 1314057600 (Tue, 23 Aug 2011 00:00:00 GMT) 至 1312156800
我们的项目有在 CVS 中从现有分支创建新分支的历史。几年后,这导致了每次发布时更改的文件上的这种情况: 新版本:1.145.4.11.2.20.2.6.2.20.2.1.2.11.2.3.2.4.4
我有以下数据框: DAYS7 <- c('Monday','Tuesday','Wednesday','Thursday','Friday', 'Saturday', 'Sunday') DAYS
我是一名优秀的程序员,十分优秀!