C语言编程题,拜托大家

键盘输入最多100个数字,回车给入下一个数读取到Ctrl-D的时候结束
打印出1、需要排序的数字:…
2、升序排好的数字:…
当输入不合法的字符时,打印出 错误输入

(已补充排序功能!基本冒泡排序!)

通过Ascii码来识别按键。

输入采用getch函数获取字符再转数字。

由于getch不在控制台显示,自定义函数实现回显。

代码实现了录入,删除功能。

录入只识别数字,其他字符按了也没用。

退格键一次删一个字符,可以跨行删除。

回车确认一个数字的输入,下次输入新数字自动换行(回车后光标不换行,另外删除当前行可以反退到上一行)。

Ctrl+D结束程序。

注意:getch函数在windows系统下正常。linux系统下不一定能运行。

另外,我没有写数值大小验证,数组变量是int型,如果你输入超出数值类型上限还是会报错的,想要输入更大的数字,可以换longlong性。想加验证,自己在代码里加好了,可以加在输入接收的位置。

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#define MAXS 100//数组大小

void showList(int *nums,int n,int flag);//打印数组

int inputNums(int *nums,int maxSize);//输入maxSize个以内的数字保存在maxSize中,返回输入的数字个数

void px(int *nums,int n);//升序排列

int main()

{

int nums[MAXS],n=MAXS,cnt;

cnt=inputNums(nums,n);

px(nums,cnt);

printf("\n升序排序后的数字为:\n");

showList(nums,cnt,1);

return 0;

}

int inputNums(int *nums,int maxSize)//输入maxSize个以内的数字保存在maxSize中,返回输入的数字个数

{

int i=1,cnt=0,n=MAXS,flag=0;//flag:待保存标识;1:标识有数据待保存2:无数据待保存

char c=0;

while(i<=n)

{

c=getch();

if(c!=13 && c!=4 && c>='0' && c<='9')//输入只接收并回显数字字符

{

if(!flag)

nums[cnt]=0,cnt++,flag=1;

nums[cnt-1]=nums[cnt-1]*10+c-'0';

}

if(c==8 && cnt>0)//退格删除

{

if(nums[cnt-1]/10>0)//当前输入数字大于1位,则删除一位输入

nums[cnt-1]=nums[cnt-1]/10;

else if(nums[i-1]/10==0)//当前输入数字只剩下1位,则删除当前输入的数值,数组个数-1

{

nums[cnt-1]=0,cnt--;

if(cnt==0)

flag=0;

else

i--,flag=1;

}

}

if(c==13)//回车

i++,flag=0;

if((c>='0' && c<='9')||c==13||c==8)

system("cls"),showList(nums,cnt,0);

if(c==4)//ctrl+D

{

if(flag)

flag=0;

break;

}

}

printf("\n输入的数字为:\n");

showList(nums,cnt,1);

return cnt;

}

void px(int *nums,int n)//升序排列

{

int i,j,num;

for(i=0;i<n;i++)

for(j=i+1;j<n;j++)

{

if(nums[i]>nums[j])

{

num=nums[i];

nums[i]=nums[j];

nums[j]=num;

}

}

}

void showList(int *nums,int n,int flag)//打印数组,flag:1打印模式;flag:0显示模式

{

int i;

if(flag && n>0)

{

printf("\n");

for(i=0;i<n;i++)

printf("%d ",nums[i]);

printf("\n");

}

else if(!flag && n>0)

{

for(i=0;i<n-1;i++)

printf("%d\n",nums[i]);

printf("%d",nums[i]);

}

}

追问

写的有点复杂了对我来说,但是真的是太感谢了!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-07-11

截图和代码如下:

#include <stdio.h>

#include <stdlib.h>

int main() {

int i = 0,j,k,r;

float array[100], f;

puts("需要排序的数字:");

while (i < 100) {

r = scanf("%f", &array[i]);

if (r == EOF)

break;

if (r == 0) {

puts("输入错误");

while (getchar()!='\n');

continue;

}

++i;

}

for (j=0; j<i-1; ++j) {

for (k=j+1; k<i; ++k) {

if (array[j] > array[k]) {

f = array[j];

array[j] = array[k];

array[k] = f;

}

}

}

puts("升序排好的数字:");

for (j=0; j<i; ++j) {

printf("%g\n", array[j]);

}

}

追问

写得很清楚!真的是太感谢了🙏

追答

不谢,兄弟,你忘了点采纳了

第2个回答  2019-07-10
#include<stdio.h>
#include<stdlib.h>

int main()
{
const int len=10;
int arr[len]={0};
char buffer[BUFSIZ]={0};
for (size_t i=0;
fread(buffer, BUFSIZ, 1, stdin)!=EOF&&i<len;
++i)
{
int n = atoi(buffer);
if (len==i||0==n)
{
break;
}
arr[i]=n;
}

for (size_t i=0; i<len; ++i)
{
printf("%d ", arr[i]);
}

//冒泡排序

return 0;
}

手机写的 没有验证 你试试看
第3个回答  2019-07-10
把输入的整数读入,然后存放到数组当中,一边读数一边记数。全部读书完成以后进行排序,然后最后进行输出。
第4个回答  2019-07-10
这个用到循环
用到if的条件语句
第一个for里面包含着第if语句
排序就另外再写一个语句
这个好像可以字符串读取的方式追问

可以帮忙写一下吗。刚开始学C不是很懂

本回答被网友采纳
相似回答