如何解决当用户从命令行提供浮点数时,为什么我的C ++程序会保持冻结状态?
我正在用c ++编写一个程序,它将找到一个幂集的总和。我想包括一些错误处理,以清除诸如0,字符或非整数之类的内容。我的策略很简单。程序进入无限while循环,并且只有在用户输入的模数为零时才能退出。 我期望发生的事情:用户输入2.4(2.4%1 = .4,.4!= 0),程序再次循环并告诉用户输入整数。 会发生什么:用户输入2.4,程序将冻结。
有人可以告诉我发生了什么事吗?
谢谢
// This C++ program will compute sum of all subsets of a set "S" stored
// in an array data structure. We assume that these subsets are the
// powerset of S and not the permutation set.
// The program workflow is as follows:
//
// 1) Prompt the user to provide the length and elemets to a custom array,if none,use
// the default array.
// 2) The user creates a custom array.
// 3) Sort the array using the QuickSort function.
// 4) Get the sum by running the SubArraySum function
#include<iostream>
#include<limits>
#include<cmath>
using namespace std;
// Utility functions for quicksort
void Swap(int *x,int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
int RemoveDuplicates(int arr[],int size)
// This function removes duplicate elements by setting their value to
// zero. This works because the purpose of the main code is to sum the subarrays.
// Adding zero to the sum multiple times does not change the sum. However,technically this will
// shorten the array.
// So,we need to keep track of the number of duplicates and give this to the SubArraySum
// function since it used the length of the array to calculate the sum.
{
int dupCount = 0;
for(int i = 0; i < size-1; i++)
{
if(arr[i] == 0)
{
;
}
if(arr[i] == arr[i+1])
{
arr[i] = 0;
dupCount++;
}
}
return dupCount;
}
int Partition(int arr[],int low,int high)
{
int i = low - 1;
int pivot = arr[high];
for(int j = low; j <= high - 1; j++)
{
if(arr[j] < pivot)
{
i++;
Swap(&arr[i],&arr[j]);
}
}
Swap(&arr[i+1],&arr[high]);
return i+1;
}
void PrintArray(int arr[],int size)
{
cout << "[ ";
for(int i = 0; i < size-1; i++)
{
cout << arr[i] << ",";
}
cout << arr[size-1] << " ]" << endl;
}
// Quicksort to sort the array
void QuickSort(int arr[],int high)
{
if(low < high)
{
int p_idx = Partition(arr,low,high); // p_idx is the partition index
QuickSort(arr,p_idx-1);
QuickSort(arr,p_idx+1,high);
}
}
void GetSum(int arr[],int n,int dupCount)
// Computes sum all sub-array
// arr[] is an array provided by the user or if none given the
// default array is arr[] = {1,2,3,4...10}
{
int p = pow(2,n-1-dupCount);
long int sum = 0;
//cout << "These are the subarrays: " << endl;
// The outer forloop picks the starting point for each subarray
for (int i=0; i < n; i++)
{
sum += p*arr[i];
}
cout << "This is the sum: " << sum << endl;
}
void SubArraySum(int arr[],int size)
{
PrintArray(arr,size);
QuickSort(arr,size-1);
int dupCount = RemoveDuplicates(arr,size);
GetSum(arr,size,dupCount);
}
void DefaultSubArraySum()
{
int arr[] = {1,4,5,6,7,8,9,10};
int n = sizeof(arr)/sizeof(arr[0]);
SubArraySum(arr,n);
}
// Driver program to test above function
int main()
{
cout << "Enter a whole number for the length of the array or enter 0: ";
// This while loop will chatch any entries that were not whole numbers and force
// the user into a loop until they give a valide number.
double user_length;
cin >> user_length;
while(1)
{
double is_whole = fmod(user_length,1.0);
if(cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout << "Entry invalid. Please enter a whole number or enter 0: ";
cin >> user_length;
}
if(is_whole != 0.0)
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout << "Entry invalid. Please enter a whole number or enter 0: ";
cin >> user_length;
}
if(is_whole == 0.0)
{
break;
}
}
// If the user does not specify an array the default sub array sum will be calculated.
if(user_length == 0.0)
{
// Default code if the user enters 0.
DefaultSubArraySum();
}
else
{
cout << "this user_length: " << user_length << endl;
int arr[(int)user_length];
cout << "Enter your array values: " << endl;
for(int i = 0; i < user_length; i++)
{
cout << i+1 << ": ";
cin >> arr[i];
}
int n = sizeof(arr)/sizeof(arr[0]);
SubArraySum(arr,n);
}
int clear_buffer = cin.get();
return 0;
}
解决方法
好的,所以问题是我在模数运算符中使用%。这是一个二进制运算符,当我使用变量int user_length运行它时失败了。为了解决此问题,我删除了import { Directive,ElementRef,OnInit,ViewChildren } from '@angular/core';
import { SecurityService } from './security.service';
@Directive({selector: '[isControlReadonly]'})
export class IsReadonlyDirective implements OnInit {
constructor(
private elementRef: ElementRef,private securityService: SecurityService
) { }
ngOnInit(): void {
var ro = !this.securityService.user.canEdit
this.elementRef.nativeElement.setAttribute('readonly',ro)
}
并添加了#include<math.h>
。我删除了%运算符,并将其替换为fmod(x,y)函数。这解决了冻结问题。但是,代码仍在与char斗争。出于某种奇怪的原因,如果连续两次输入一个字符,is_whole会变为0,并且我的默认函数会运行。 @churill大声喊出发现%mod冲突。
这是一个简化的,主要工作的代码。
#include <cmath>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。