c语言中如何只清屏后半部分保留前半部分?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中如何只清屏后半部分保留前半部分?相关的知识,希望对你有一定的参考价值。

请看如下程序:如何才能把前半部分的字母abcdefg保留,只清屏后半部分的符号&&&&&&&&&&&&&?
谢谢!!!

#include<stdio.h>int main()

printf("abcdefg\n");
printf("&&&&&&&&&&&&&\n");

问题太多了,我只作了第一个,这个程序可以实现加减乘除指数运算,支持所有双精度型数据~~~~~~好累~~~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#define stacksize 100
//---字符栈的基本操作----------------------------------
typedef char datatype1;
typedef struct //定义字符栈,用数组表示

datatype1 data[stacksize];
int top;
seqstack1;
void initstack1(seqstack1 *s)//置空栈

s->top = -1;

int stackempty1(seqstack1 *s)//判栈空

return s->top == -1;

int stackfull1(seqstack1 *s)//判栈满

return s->top == stacksize-1;

void push1(seqstack1 *s, char x)//进栈

if(stackfull1(s)) return ;
++s->top;
s->data[s->top] =x;

char pop1(seqstack1 *s)//退栈

if(stackempty1(s)) return NULL;
s->top--;
return s->data[s->top+1];

char stacktop1(seqstack1 *s)//访问栈顶元素

if(stackempty1(s)) return NULL;
return s->data[s->top];

//---整数栈的基本操作----------------------
typedef double datatype2;
typedef struct//定义数栈,用数组表示

datatype2 data[stacksize];
int top;
seqstack2;
void initstack2(seqstack2 *s)//置空栈

s->top = -1;

int stackempty2(seqstack2 *s)//判栈空

return s->top == -1;

int stackfull2(seqstack2 *s)//判栈满

return s->top == stacksize-1;

void push2(seqstack2 *s, double x)//进栈

if(stackfull2(s)) return ;
++s->top;
s->data[s->top] =x;

double pop2(seqstack2 *s)//退栈

if(stackempty2(s)) return NULL;
s->top--;
return s->data[s->top+1];

double stacktop2(seqstack2 *s)//访问栈顶元素

if(stackempty2(s)) return NULL;
return s->data[s->top];

char proceed(char a,char b)//判断运算符的优先级,a为栈内运算符,b为栈外运算符

int i,j;
char c[9][9]=
,
,
,
,
,
,
,
,
;
for(i=1;i<7;i++)if(c[i][0]==a)break;
for(j=1;j<7;j++)if(c[0][j]==b)break;
return c[i][j];

double transform(char *s,int *i)//字符型数据转化为双精度型数据

int j=0,n;
double a[10],sum1=0,sum2=0;
for(;isdigit(s[*i]);(*i)++)
a[j++]=s[*i]-'0';
n=j;
for(j=0;j<n;j++)
sum1=(sum1+a[j])*10;
sum1=sum1/10;
if(s[(*i)]=='.')

*i=*i+1;
for(j=0;isdigit(s[*i]);(*i)++)
a[j++]=s[*i]-'0';
for(j=j-1;j>=0;j--)
sum2=(sum2+a[j])/10;

return sum1+sum2;

double operate(double a,char r,double b)//运算函数


switch(r)

case'+':return a+b;break;
case'-':return a-b;break;
case'*':return a*b;break;
case'/':return a/b;break;
case'^':return pow(a,b);break;
default:printf("error");
;

double evalexpres(char *s)//求表达式值的函数

char ch,r;
int i=0;
double a,b,num;
seqstack1 *stack1;
seqstack2 *stack2;
stack1=(seqstack1*)malloc(sizeof(seqstack1));//创建字符栈
stack2=(seqstack2*)malloc(sizeof(seqstack2));//创建数栈
initstack1(stack1);
push1(stack1,'#');
initstack2(stack2);
ch=s[i];
while(ch!='#'||stacktop1(stack1)!='#')//扫描表达式

if(isdigit(ch))//如果是‘0’~‘9’,转换为整形,进数栈

num=transform(s,&i);
push2(stack2,num);
ch=s[i];

else

switch (proceed(stacktop1(stack1),ch))

case'<'://栈内符号优先级低,栈外符号进栈
push1(stack1,ch);
ch=s[++i];
break;
case'='://脱括号并接收下一个字符。
pop1(stack1);
ch=s[++i];
break;
case'>'://退栈并将运算结果入数栈。
r=pop1(stack1);
b=pop2(stack2);
a=pop2(stack2);
printf("计算步骤:\n%.3f%c%.3f=%.3f\n",a,r,b,operate(a,r,b));//输出运算步骤
push2(stack2,operate(a,r,b));
break;
case'x': printf("原表达式%s有误,请检查:\n",s);break;
//switch
//else
//while
return stacktop2(stack2);


main()

double num;
char s[stacksize];
printf("\t\t\t| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|\n");
printf("\t\t\t|^_^这是我的计算器^_^|\n");
printf("\t\t\t|____________________|\n");
printf("\t\t支持加,减,乘,除,指数及括号运算.\n");
printf("\t\t数据可以为双精度类型的任意数\n");
printf("\t\t请输入表达式,并以#结束:\n");
scanf("%s",s);
while(s[strlen(s)-1]!='#')

printf("输入有误!请重新输入:\n");
scanf("%s",s);

num=evalexpres(s);
printf("%s=%.3f\n",s,num);
getchar();


如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
参考技术A 把后半句话去掉不就行了

将动态数组的前半部分复制到后半部分在 C 中失败?

【中文标题】将动态数组的前半部分复制到后半部分在 C 中失败?【英文标题】:Copying first half of dynamic array into second half failed in C? 【发布时间】:2022-01-15 23:11:24 【问题描述】:

我想将我的动态数组的前半部分复制到同一数组的后半部分,但这里的输出是从 ptr[100] 到 ptr[200] 9.90。我想我编码的一切都很好,但我不知道问题出在哪里。你能帮帮我吗?


#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) 
    int i;

    int j;
    
    double * ptr = calloc(100, sizeof(double));
    
    if (ptr == NULL)
        return 0;

        for(i = 0; i < 100; i++) 
            ptr [i] = i / 10.0;
        
    
    
    for(i = 0; i < 100; i++) 
        printf("ptr[%d] = %.2f\n", i, ptr[i]);
        
        
        
        if (realloc(ptr, 200) == NULL)
            return 0;


            for (i = 0; i < 100; i++) 
                for (j = 100; j < 201; j++) 
                    ptr [j] = ptr[i];
                
        
            
            
            for (j = 100; j < 201; j++) 
                    printf("ptr[%d] = %.2f\n", j, ptr[j]);
        
        
    return 0;

【问题讨论】:

realloc(ptr, 200) 应该是realloc(ptr, 200 * sizeof *ptr) 我试过了。它不工作 【参考方案1】:

您在 realloc 上分配不足。您没有为 200 个双打腾出足够的空间,因此尝试访问 ptr[x] 对于 x > 99 的值是未定义的行为。此外,realloc 可能会移动内存,因此您需要将新值分配回 @987654323 @。例如:

ptr = realloc(ptr, 200 * sizeof *ptr);
if( ptr == NULL )
    perror("realloc");
    exit(1);

在此之后,访问ptr[200] 是未定义的行为。您需要将循环索引的范围缩小到for( j = 100; j &lt; 200; j++ )

【讨论】:

【参考方案2】:

你正在覆盖每个副本

for (i = 0; i < 100; i++) // for every item in the first half
    for (j = 100; j < 201; j++)  // into every cell
        ptr [j] = ptr[i];

应该是

for (i = 0; i < 100; i++) 
        ptr [i+100] = ptr[i];

第 2 期:

您没有分配足够的内存:将 realloc(ptr, 200) 更改为 realloc(ptr, 200 * sizeof(double))

【讨论】:

非常感谢。它现在正在工作,但我不明白为什么要覆盖它。 您对它们不同步但嵌套的循环感到困惑,因此对于 i 的每一步,j 都在 100 到 199 的整个范围内

以上是关于c语言中如何只清屏后半部分保留前半部分?的主要内容,如果未能解决你的问题,请参考以下文章

调整数组顺序使奇数位于偶数前面(C语言+Java)

(C语言)请问出了啥问题导致最后运行出来没有下半部分的内容?

AndroLua

C语言中文件流操作基本函数总结

linux中的-(减号)

C语言数组排序问题