小明送外卖 C语言

Python022

小明送外卖 C语言,第1张

当外卖赚钱那么好赚的啊!!!!!

思路:

各自份数:k(开封菜)c(麦当劳)p(必胜客)

收入: money   总份数:total

k * 20 + c * 12 + p * 8 = money

k + c + p = total -> p = total - c - k

->k*20 + c * 12 + p * 8 = money  &p 不能小于0

开始编程:

int main()

{

int k,c,p

int total,money

printf("外卖人数:")

scanf("%d", &total)

printf("总收入:")

scanf("%d", &money)

bool found = false

for (k = 0 k <= total k ++)

{

for (c = 0 c <= total c ++)

{

p = total - k - c

if (p < 0)

{

continue

}

else

{

int tmp = k * 20 + c * 12 + p * 8

if (tmp == money)

{

found = true

printf("KFC = %d  MC = %d PIZZ = %d \n", k, c, p)

}

}

}

}

if (!found)

{

printf("No Solution \n")

}

return 0

}

//程序已经改正,可以正确运行,希望kutpbpb的回答能对你有所帮助!

#include <stdio.h>

#include<stdlib.h>

#include<string.h>

long i,j,l=0,k,q,p,n,m=1

char nana[30]

struct gf

{

char name[30]

long money

long get

}str[10]

void sc()

{

//printf("\nPlease enter the Number:")

scanf("%ld",&n)

for(i=0i<ni++)

{

//printf("\nPlease Input the %d members' name:",i+1)

scanf("%s",str[i].name)

str[i].get=0

str[i].money=0

}

}

void sj()

{

while(l<n)

{

i=0

//printf("\nP the %d members' name:",l+1)

scanf("%s",nana)

for(i=0i<ni++)

{

if(strcmp(nana,str[i].name)==0)//应该包括if(m=0)和if(m!=0)

{

//printf("\nP the %d members' money and number:",i+1)

scanf("%ld%ld",&str[i].money,&m)

if(m==0)

{

l++

break

}

if(m!=0)

{

//q=str[i].money-str[i].money/100*100

k=str[i].money/m

//printf("\nM K:%d%5d",m,k)

for(j=0j<mj++) //这里是他朋友的个数j<m,而不是n

{

//eprintf("\nfriendg!%d",j)

scanf("%s",nana)

for(p=0p<np++) //这里少个循环语句;

if(strcmp(nana,str[p].name)==0)

{

str[p].get=str[p].get+k

break

}

}

l++

}

break

}

}

}

}

void pr()

{

for(i=0i<ni++)

{

printf("%s %ld\n",str[i].name,str[i].get-str[i].money)

}

}

void main()

{

sc()

sj()

pr()

system("pause")

}百度地图

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

也就是为什么判断'\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++语言输入输出操作上面吃过的苦头太多了,不把话说白说通俗了,我怕将来连我自己都看不懂阿。哈哈。

请采纳。