我正在编写一个程序(为了练习和练习),它计算数组中元素的数量,直到遇到具有小数部分 0 的值,而不使用任何整数计数器变量。
我在下面使用整数计数器(它是'i',顺便说一句)完成了它,但我无法找到一种方法而不在循环中使用'i'。没有整数计数器怎么办?
输入:
5
1.2
-3.4
5.00
4
5.45
输出:
第一个整数之前:2个元素
void int_or_float(float arr[], int n){
int i, j;
int counter = 0;
char str[10];
for (i = 0; i < n; i++){
printf("%f\n", arr[i]);
sprintf(str, "%f", arr[i]);
for (j = 0; j < 9; j++){
printf("%c\n", str[j]);
if (str[j] == '.' && str[j + 1] == '0'){
printf("Aborted!");
printf("\n\nBefore the first integer: %d elements", i);
j = 11;
i = n + 1;
}
}
}
}
int main(){
int n, i;
float *things;
scanf("%d", &n);
things = malloc (n * sizeof(float));
for (i = 0; i < n; i++){
scanf("%f", &things[i]);
}
printf("\n");
int_or_float(things, n);
return 0;
}
最佳答案
OP 确实需要一个解决方案 而不使用任何整数计数器变量 。不使用计数器怎么能数数呢?通过使用指针在数组中前进,但这仅在您包含哨兵时才有效,以便您可以终止。假设这个哨兵是一些负数。
在 main())
中,您需要一个额外的哨兵元素。
在 int_or_float()
中,您可以使用指针遍历数组。
#include <stdio.h>
#include <stdlib.h>
void int_or_float(float arr[]) { // removed int n
float *ptr = arr;
int ival;
while (*ptr >= 0) {
printf("%f\n", *ptr);
ival = (int)*ptr;
if (*ptr == (float)ival) {
printf("Aborted!");
printf("\n\nBefore the first integer: %d elements", ptr - arr);
return;
}
ptr++;
}
printf("\n\nNo integer values found");
}
int main() {
int n, i;
float *things;
scanf("%d", &n);
things = malloc ((n+1) * sizeof(float)); // extra for sentinel
for (i = 0; i < n; i++){
scanf("%f", &things[i]);
}
things[i] = -1; // sentinel
printf("\n");
int_or_float(things); // n removed
free (things); // remember to free memory
return 0;
}
必须指出的是,并非所有整数都可以精确地用浮点数表示。
您还应该检查
malloc()
和 scanf()
的返回值。关于c - 迭代直到遇到小数部分为 0 的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27745676/