C语言紧急求助!!!!!

一1.构建包含10个元素的(数据类型为int)的一维数组,通过键盘输入数据并打印,
2.通过函数调用的方式,实现对输入数据的逆序排列,并打印结果
3.通过函数调用的方式实现找到输入数据的最大值和最小值,并打印结果

关于你的问题:为什么是判断是否到换行?

也就是为什么判断'\n'而不是'\0'或者EOF或者别的什么?一个简单的回答是,抬头看看loop上面的这个语句:printf("请输入一行字符:\n");。判断“一行”的结束,自然用'\n'。

但是这显然不是你想要的答案,因为你提到“while((c=getchar( ))!='\n')这句很是不解,它是怎样来接收字符串的”以及“总之接收判断字符串这块很迷茫”。万分理解。C语言的输入输出较为底层,一些琐碎的细节都需要编程者有不错的掌握,否则连一个正常的程序都运行不起来。

下面我就分步骤解答你的疑惑。

1)getchar()是什么
没有函数参数(其实是void),它从哪接受输入?从stdin,这又是什么东西?stdin=standard input,也就是标准输入。stdin数据流来自哪里?一般来自你敲字的那个黑洞洞的屏幕,学术点的名字叫console,是你手动输入数据,查看打印信息的地方。简而言之,你在屏幕上手动敲什么字符,getchar()就接受什么字符,但是一次只能接受一个。所以如果你敲了"abc"三个字符,你就需要3个getchar()了。这就是为什么getchar()被放在while loop里的原因,因为这个函数要被调用多次。

接下来,你或许要问,是不是我敲"abc"三个字符的过程中,getchar()每侦测到一个字符,都会把它读走?并非如此。你在屏幕上敲的字符,首先都被送往stdin buffer,也就是标准输入的缓冲区。缓冲区?是不是听上去有点悬?不要被吓着了,其实说白了,缓冲区就是一个类似字符数组的东西,你把它当做char[256]或者更大的数组理解就行了。你每敲一个字符,这个字符就进入缓冲区,你敲完"abc",则这3个字符统统跑到缓冲区里去了。getchar()再从缓冲区里读东西。所以,缓冲区充当了你和getchar()之间的媒介。你并不是直接和getchar()交互。

那么getchar()什么时候从缓冲区里拿东西呢?更准确的说,是缓冲区什么时候把东西给getchar()主动送过去?一种情况是缓冲区满了,比如你一下子输了超过256个char给char[256],但这种情况并不常见。更常见的是第二种情况,也就是缓冲区还没满,还能继续装东西,但是你,不耐烦了,想让缓冲区早点把东西给getchar()送过去,所以你就要对缓冲区发一个指令。这个指令就是你敲了回车键,把'\n'扔进缓冲区。缓冲区一看你都扔'\n'了,知道你急了,赶紧停止继续接受你的输入,而是先把已经存在它内部的东西给送出去。送给谁呢?送给各种各种的等着输入的函数。有的函数,比如scanf("%s", str),能一下子接受一大块数据,这样送起来就快。有的函数,比如getchar(),只能一个字符一个字符的接收,送起来就慢,你就得等半天。所以你往往只打一个字符‘a',然后敲回车,这样缓冲区往getchar()送只要送一次。如果你敲了"abc",再回车,就要送三次了,不是我们想要的。

忘提了,你往缓冲区里扔的这个'\n'最后也会被它转交给getchar(),所以"abc"再回车,就不是3个字符,而是4个字符了。

2. c=getchar()是什么
简单,把getchar()从缓冲区拿到的一个字符,再转手交给字符c

3. (c=getchar( ))!='\n' 是什么
(c=getchar( ))就是c,但是是从getchar()拿到字符之和的c
(c=getchar( ))!='\n'就是c!='\n',也就是判断“新”拿到手的字符是不是'\n',如果是'\n'说明什么?
说明用户不耐烦了,用户怒了,用户想快点要结果了---》 说明用户这行输完了。

再抬头看看:printf("请输入一行字符:\n"); 懂了不?

4. 为什么(c=getchar( ))!='\0'不行
'\0'是什么?是null,是一个特殊字符。这个字符你作为用户,一般是没法手动输入的,往往是系统自己加的,什么时候加?当你输入一串字符串,按回车键之后。比如scanf("%s", str),你手动打入"abc",然后回车,这时缓冲区里有4个字符:"abc\n",缓冲区看到'\n'了,知道该把东西继续往下传了,就把"abc"传给str。注意这里的特殊情况,缓冲区倒是想把'\n'也传给str,但是str很倔,不接收,所以'\n'就留在缓冲区里了。有趣的是,虽然str拒绝了'\n',但却主动要求系统给它的末尾加上'\0',表明自己的边界,起到保护作用。

所以你发现,'\0'跟用户输入压根没关系,你想输入都输入不了这个特殊字符。再退一步说,即使你能输入'\0',缓冲区也并不把它当作继续往下传东西的指令呀。缓冲区就认'\n'! 还有EOF(可以用ctrl-z输入,但不如'\n'常用)。

这就是问题的关键!

说了一大堆废话,不知道你现在明白了没有。希望你现在明白了。为什么我写这么长,又用这么通俗易懂的语言?说白了,我上面这段话不只是给你看的,也是给我自己的看的,因为我在C/C++语言输入输出操作上面吃过的苦头太多了,不把话说白说通俗了,我怕将来连我自己都看不懂阿。哈哈。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-13

#include <stdio.h>

void print(int *a, int n)//逆向打印

{

    int i;

    for(i=n-1; i>=0; i--)

    {

        printf("%-5d", a[i]);

    }

}

void func(int *a, int n)//找出最大值和最小值

{

    int min, max, i;

    min = max =a[0];

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

    {

        if(a[i]<min) min=a[i];

        if(a[i]>max) max=a[i];

    }

    printf("\n\nmin = %d\nmax = %d\n", min, max);

}

int main()

{

    int a[15], i=0;

    printf("请输入整型元素,按ctrl+z结束输入:\n\n");

    while(scanf("%d", &a[i])!=EOF)

    {

        i++;

    }

    print(a, i);

    func(a, i);

    return 0;

}

第2个回答  2011-07-13
程序如下:已经调试运行过了,结果已正确
#include "stdafx.h"
#include<stdlib.h>

void sort(int a[10]); //比较最值函数声明
int main()
{
int num[10],i;
printf("please input 10 numbers!:\n");
for(i=0;i<10;i++)
scanf("%d",&num[i]);
void arry(int p[]); //排序函数声明
printf("原来的十个数为:\n");
for(i=0;i<10;i++)
{
printf("%d ",num[i]);
}
printf("\n");
arry(num);
sort(num);

system("pause");
return 0;
}

void arry(int p[10]) //排序函数的定义
{
int temp;
int i,j;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
{
if(p[j]<p[j+1])
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
printf("从大到小排序为:\n");
for(i=0;i<10;i++)
printf("%d ",p[i]);
printf("\n");

}
void sort(int a[10]) //最值 函数的定义
{
int i,max,min,temp;
max=a[0];
for(i=0;i<10;i++)
{
if(a[i]>max)
{
max=a[i];
}
}
min=a[0];
for(i=0;i<10;i++)
{
if(a[i]<min)
{
min=a[i];
}
}
printf("max=%d,min=%d\n",max,min);
}

看看吧,有问题可追问即可!呵呵
第3个回答  2011-07-13
#include<stdio.h>
void fun(int * a,int n)//逆序打印
{
int temp=0;
for(int i =0;i<n/2; i++)
{
temp = a[i];
a[i] = a[n-i-1];
a[n-i-1] = temp;
}
for(int j=0;j<n;j++)
printf("%d\t",a[j]);
printf("\n");
}

void find(int *a,int n)//查找最大最小值
{
int max=0,min=0;
for(int i=0;i<n;i++)
{
if(a[i] > max)
max = a[i];
if(a[i] < min)
min = a[i];
}
printf("max = %d\tmin = %d\n",max,min);
}

int main()
{
int a[10];
for(int i =0;i<10;i++)
scanf("%d",&a[i]);
for(int j=0;j<10;j++)
printf("%d\t",a[j]);
printf("\n");
fun(a,10);
find(a,10);
return 0;
}本回答被提问者采纳
第4个回答  2011-07-13
#include<stdio.h>
void sort(int *a,int n)
{
int i,j,t;
for(i=0;i<n;i++)
for(j=0;j<n-i-1;j++)
if(*(a+j)<*(a+j+1))
{
t=*(a+j);
*(a+j)=*(a+j+1);
*(a+j+1)=t;
}
}
int max(int *a,int n)
{
return a[0];
}
int min(int *a,int n)
{
return a[n-1];
}
int main()
{
int i,b[10];
printf("input 10 numbers:\n");
for(i=0;i<10;i++)
scanf ("%d",&b[i]);
for(i=0;i<10;i++)
printf ("%d ",b[i]);
printf("\n");
sort(b,10);
for(i=0;i<10;i++)
printf("%d ",b[i]);
printf("\n");
printf("max=%d min=%d\n",max(b,10),min(b,10));
return 0;
}

运行情况如下:
input 10 numbers:
1 3 5 7 9 10 8 6 4 2
1 3 5 7 9 10 8 6 4 2
10 9 8 7 6 5 4 3 2 1
max=10 min=1
请按任意键继续. . .追问

还有一个,能帮忙吗,会加分的。
第二题 1.构建int 数据类型的4*4儿维数组A,并通过键盘输入数据,并打印这个数组
2.打印出这个二维数组的首地址,通过指针实现
3.通过函数调用的方式,实现对该数组的转置操作,并计算原矩阵和转置矩阵的乘积,打印该结果