我的for循环似乎无法正常工作。第一个数字告诉我我希望程序执行多少任务n
。当我输入1或2时,它可以工作,但当我输入3或更多时,它开始挣扎。每行有3个数字,用空格分隔,如代码所示。我没有得到所有输出。该程序中的算法工作完美,所以没有问题。
请忽略代码中的注释。对不起我的英语。
#include <stdio.h>
int n;
int i;
int s;
int d;
int p;
int k;
int A;
int x;
int r[];
int koniec;
main()
{
scanf("%d", &n);
while( !(n >= 1 && n <=1000) )
{
//printf ( "max 1000 uloh min 1 \n");
return 1;//scanf("%d", &n);
}
for( i=1; i < n; i++)
{
scanf("%d %d %d", &s, &p, &d);
while((s < 1) || (s > 15000) || (p < 1) || (p > 4000) || (d < 1) || (d > 15000)) {
//printf ("prekroceny limit \n");
return 1; // scanf("%d %d %d", &s, &p, &d);
}
k = s / d;
A = s - ( k * d );
if ( A == 0 )
{
r[i] == 0;
}
else
{
//s = k * d + A ;
x = ( A * p ) / d ;
r[i] = p - x ;
}
}
for ( koniec = 0 ; koniec < i+1 ; koniec++ )
{
printf ( "%d", r[koniec] ) ;
printf ( "\n");
}
system("pause");
}
示例输入,以便您更好地理解:
4
5 4 4
6 100 3
500 5 1000
314 159 26
并输出:
3
0
3
147
编辑&gt;
5
3434 234 2345
14455 345 12
134 145 1345
9242 2455 13455
83 34 133
输出:
126
144
141
769
13
或更短的&gt;
输入:
2
15000 1 1
1 4000 1
输出:
0
0
我在两个例子中得到返回值
我的最终代码编辑:
#include <stdio.h>
#include <stdlib.h>
int n;
int i;
int s;
int d;
int p;
int k;
int A;
int x;
int *r;
int koniec;
main()
{
scanf("%d", &n);
while( !(n >= 1 && n <=1000) )
{
return 0;//printf ( "max 1000 uloh min 1 \n");
//scanf("%d", &n);
}
r = (int *)malloc(n*sizeof(int));
for(i=0; i < n; i++)
{
scanf("%d %d %d", &s, &p, &d);
while((s < 1) || (s > 15000) || (p < 1) || (p > 4000) || (d < 1) || (d > 15000))
{
//printf ("prekroceny limit \n");
return 0; //scanf("%d %d %d", &s, &p, &d);
}
k = s / d;
A = s - ( k * d );
if ( A == 0 )
{
r[i] = 0;
}
else
{
//s = k * d + A ;
x = ( A * p ) / d ;
r[i] = p - x ;
}
}
for ( koniec = 0 ; koniec < n ; koniec++ )
{
printf ( "%d", r[koniec] ) ;
printf ( "\n");
}
free(r);
return 0;
}
答案 0 :(得分:0)
为r[]
分配空间。
更改作业。
更改循环范围。
//int r[];
main() {
scanf("%d", &n);
// while( !(n >= 1 && n <=1000) )
if (!(n >= 1 && n <=1000) ) {
return 1;//scanf("%d", &n);
}
int r[n]; // allocate
// for( i=1; i < n; i++)
for( i=0; i < n; i++) // Change range (@MrHappyAsthma)
...
// r[i] == 0;
r[i] = 0; // change
r[i] = p - x ;
// for ( koniec = 0 ; koniec < i+1 ; koniec++ )
for ( koniec = 0 ; koniec < n ; koniec++ )
答案 1 :(得分:0)
您需要使用malloc()动态分配内存。 (还有#include stdlib.h
)
例如,在第一个while循环后添加以下行:
//Note - at the top, change int r[] to the below:
int *r; //Instead of int r[]
//End note
while( !(n >= 1 && n <=1000) )
{
printf ( "max 1000 uloh min 1 \n");
scanf("%d", &n);
}
r = (int *) malloc(n*sizeof(int)); //Allocate "n" integers to your 'array r'
还应该注意的是,一旦你完成使用数组r
,你必须free()这样的内存如下:
free(r);
此外,还有一些其他编码问题:
请确保for( i=1; i < n; i++)
符合您的要求。您使用“i”索引数组,但C中的数组从0开始。因此它(可能)应该读取for( i=0; i < n; i++)
。
r[i] == 0;
被错误地用作作业。使用单个=
为变量赋值。使用双等于==
来比较两个值。
for ( koniec = 0 ; koniec < i+1 ; koniec++ )
可能会出错。您的i
将比其上方的for循环小n
一个。因此,尝试迭代到i+1
或n
将导致数组出界问题 - 也就是分段错误。
编辑 - 这应该符合您的要求:
#include <stdio.h>
#include <stdlib.h>
int n;
int i;
int s;
int d;
int p;
int k;
int A;
int x;
int *r;
int koniec;
main()
{
scanf("%d", &n);
while( !(n >= 1 && n <=1000) )
{
//printf ( "max 1000 uloh min 1 \n");
//scanf("%d", &n);
return 1;
}
r = (int *)malloc(n*sizeof(int));
for(i=0; i < n; i++)
{
scanf("%d %d %d", &s, &p, &d);
while((s < 1) || (s > 15000) || (p < 1) || (p > 4000) || (d < 1) || (d > 15000))
{
//printf ("prekroceny limit \n");
//scanf("%d %d %d", &s, &p, &d);
return 1;
}
k = s / d;
A = s - ( k * d );
if ( A == 0 )
{
r[i] = 0;
}
else
{
s = k * d + A ; //This line does nothing... Just so you know
x = ( A * p ) / d ;
r[i] = p - x ;
}
}
for ( koniec = 0 ; koniec < n ; koniec++ )
{
printf ( "%d", r[koniec] ) ;
printf ( "\n");
}
free(r);
system("pause");
return 0;
}
输入:
4
5 4 4
6 100 3
500 5 1000
314 159 26
输出:
3
0
3
147