我在完成下面的代码时遇到问题。
#include <stdio.h>
void triR(void)
{
int size, repeat;
scanf("%d %d", &size, &repeat);
printf("Hello world\n");
// ...
// Complete this function
// ...
printf("Bye world\n");
}
以上三个是输入值。
我认为第一个是数字的最小大小(我不知道为什么如果不输入1也不起作用),中间是数字的最大大小,最后一个是迭代次数的输入值。
查看示例后,我创建了以下代码
#include <stdio.h>
#include <stdlib.h>
void triR(void)
{
int size, repeat;
int num;
scanf("%d %d", &size, &repeat);
printf("Hello world\n");
for (int b = 0; b < size; ++b) //b = horizontal line, a = number
{
for (int a = 0; a <= b; ++a)
{
for (num = 1; num <= a; ++num) - failed sentences
{
printf("%d", num);
}
}
printf("\n");
}
for (int k = size; k > 0 ; --k) //k = horizontal line, i = number
{
for (int i = 1; i < k; ++i)
{
{
printf("*"); -Sentences that were successfully run using *
}
}
printf("n");
}
// for (int c =o; ) - sentences tried to make about repeating output value
printf("Bye world\n");
return 0;
}
我知道我的代码看起来很奇怪。 我没有信心用数字制作该代码,因此我尝试制作它并进行转换。 它成功地用*开头,但是在执行该部分时仍然无法通过数字执行。
没有人寻求帮助,但是即使在周末我一个人,我也无法解决问题。我什至无法将数字转换成重复的输出。即使您能给我一个提示,我也非常感谢。
答案 0 :(得分:-1)
我想说的是,即使我管理了一个实现,它肯定也不有效也不实用。我不得不将您的大小变量限制为数字,因为我使用ASCII将数字转换为字符,并且由于它不是标准的,所以无法使用itoa()函数。
#include <stdio.h>
#include <stdlib.h>
void triR(void) {
int size, repeat;
scanf("%d %d", &size,&repeat);
printf("Hello world\n");
// string size of n^2+2n-1
char* print_string = malloc((size*size+2*size-1)*sizeof(char));
unsigned int number = 1;
unsigned int incrementer = 1;
while (number < size) {
for (int i = 0; i < number; i++) {
*(print_string+i+incrementer-1) = 48+number;
}
incrementer+=number;
number++;
*(print_string+incrementer-1) = '\n';
incrementer++;
}
while (number > 0) {
for (int i = 0; i < number; i++) {
*(print_string+i+incrementer-1) = 48+number;
}
incrementer+=number;
number--;
*(print_string+incrementer-1) = '\n';
incrementer++;
}
for (int i = 0; i < repeat; i++) {
printf("%s\n", print_string);
}
printf("Bye world\n");
free(print_string);
}
我分配了一个char *,其大小为size ^ 2 + 2size-1,因为这是换行符和数字字符所需的大小。
变量数字和增量器是无符号的,并且从1开始,因为它们不需要低于1。
我在其中放入了两个具有相似代码块的while循环:
while (number < size) {
for (int i = 0; i < number; i++) {
*(print_string+i+incrementer-1) = 48+number;
}
incrementer+=number;
number++;
*(print_string+incrementer-1) = '\n';
incrementer++;
}
while (number > 0) {
for (int i = 0; i < number; i++) {
*(print_string+i+incrementer-1) = 48+number;
}
incrementer+=number;
number--;
*(print_string+incrementer-1) = '\n';
incrementer++;
}
第一个循环达到最大大小,并将字符插入到char *中的位置。完成数字后,它会递增增量器并添加换行符。
第二个循环的次数减少,执行相同的操作,但是这次减少了number变量。这两个变量从1开始,因为那是“金字塔”的开始。
*(print_string+i+incrementer-1) = 48+number;
这里有一个限制,即如果您超过数字9,则输出将输出58的ASCII表示形式,因此,如果要超过9,则需要进行更改。
for循环仅按需要输出最终字符串“重复”次数。不需要printf()函数中的换行符,因为最后一个字符串的末尾包含一个换行符,但我还是把它留了下来。此实现的缺点是您使用的是char *而不是其他一些复杂的方法。
完成操作后,不要忘记释放char *,也不要忘记添加用户输入错误检查。
答案 1 :(得分:-1)
#include <stdio.h>
#include <stdlib.h>
void clear(FILE *stream)
{
int ch; // read characters from stream till EOF or a newline is reached:
while ((ch = fgetc(stream)) != EOF && ch != '\n');
}
int main(void)
{
int min, max, count;
while (scanf("%d %d %d", &min, &max, &count) != 3 || // repeat till all 3 fields read successfully and
!min || !max || !count || min > max) { // only accept positive numbers as input
fputs("Input error!\n\n", stderr); // and make sure that the max is greater than the min
clear(stdin); // remove everything from stdin before attempting another read for values
}
puts("Hello world\n");
for (int i = 0; i < count; ++i) { // output the triangle count times
for (int row = min; row <= max; ++row) { // count row from min to max
for (int n = min; n <= row; ++n) // print row (row-min) times
printf("%d ", row);
putchar('\n'); // add a newline after every row
}
for (int row = max - 1; row >= min; --row) { // count from max-1 to min
for (int n = min; n <= row; ++n) // same as above: print row (row-min) times
printf("%d ", row);
putchar('\n'); // add a newline after every row
}
putchar('\n'); // add a newline between repetitions
}
puts("Bye world\n");
}