Ⅰ 怎樣編程序
/*1、 編程解決如下數學問題:有12升水,怎樣利用一個8升和一個5升的容器將水分為兩個6升?要求以如下格式列印出分水步驟。(20分)
a12 b8 c5
12 0 0
* * * ( "*"表示當前狀態下每個容器的盛水量)
......
6 6 0
# include <stdio.h>
# include <stdlib.h>
void move(int *x,int *y,int aMax,int bMax)
{
if(aMax>bMax)
{
if(*x+*y>bMax)
{
*x = *x-(bMax-*y);
*y = *y+(bMax-*y);
}
else
{
*y = *y+*x;
*x = *x-*x;//如果顛倒兩個的順序就會造成無法輸出
}
}
else
{
*y = *y + *x;
*x = *x - *x;
}
}
main()
{
int aMax=12,bMax=8,cMax=5;
int a=12,b=0,c=0;
int i=1;
printf(" a12 b8 c5:\n");
printf("%7d%7d%7d\n",a,b,c);
while(i)
{
move(&a,&b,aMax,bMax);
printf("%7d%7d%7d\n",a,b,c);
if(a==6&&b==6)
goto step2;
move(&b,&c,bMax,cMax);
printf("%7d%7d%7d\n",a,b,c);
if(a==6&&b==6)
goto step2;
move(&c,&a,cMax,aMax);
printf("%7d%7d%7d\n",a,b,c);
if(a==6&&b==6)
goto step2;
move(&b,&c,bMax,cMax);
printf("%7d%7d%7d\n",a,b,c);
if(a==6&&b==6)
goto step2;
}
step2:
printf("the water has been sorted!\n");
return 0;
}*/
/*2、 編程實現:有二維數組a[3][3]={{5.4,3.2,8},{6,4,3.3},{7,3,1.3}},
將數組a的每一行元素均除以該行上的主對角元素(第1行同除以a[0][0],第2行同除以a[1][1],...),
按行輸出新數組。(20分)
# include <stdio.h>
main()
{
double a[3][3]={{5.4,3.2,8},{6,4,3.3},{7,3,1.3}}; //可以在定義時初始化,在後來就不行了
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(i==j)
a[i][j]=a[i][j];
else
a[i][j]=a[i][j]/a[i][i];
}
a[i][i]=1;
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%6.2f",a[i][j]);
printf("\n");
}
}*/
/*3、編程:設x取值為區間[1,20]的整數,求函數f(x)=x-sin(x)- cos(x)的最大值,
要求使用自定義函數實現f(x)功能。(20分)
#include <stdio.h>
#include <math.h>
double f(long double x);
main()
{
double a[50];
int i,index,j;
long double temp;
for(i=0;i<20;i++)
a[i] = f(i+1);
for(i=0;i<19;i++)
{
index = i;
for(j=i+1;j<20;j++)
if(a[j]>a[index])
index = j;
temp = a[index];
a[index] = a[i];
a[i] = temp;
}
printf("the max is %6.2f",a[0]);
printf("\n");
return 0;
}
double f(long double x)
{
x = x - sin(x) - cos(x); //他輸入的是弧度數,而我用計算器算的是角度值,所以結果會不一樣
return x;
}*/
//冒泡排序
/*# include <stdio.h>
# include <math.h>
void swap(int *x,int *y);
main()
{
int i,j;
int a[50];
printf("please input the num:");
printf("\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=1;i<10;i++)
for(j=0;j<10-i;j++)
if(a[j]>a[j+1])
swap(&a[j],&a[j+1]);
printf("after sorted the num is:");
printf("\n");
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("\n");]
return 0;
}
void swap(int *x,int *y)
{
int p;
p = *x;
*x = *y;
*y = p;
}
*/
//選擇排序
/*# include <stdio.h>
# include <stdlib.h>
main()
{
int i,j,temp,index;
int a[50];
printf("input the num :");
printf("\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
{
index = i;
for(j=i+1;j<10;j++)
{
if(a[j]<a[index])
index = j;
temp = a[index];
a[index] = a[i];
a[i] = temp;
}
}
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("\n");
return 0;
}*/
/*編寫函反向。
要求主函數輸入字元串,通過調用函數fun實數fun,通過指針實現將一個字元串現輸入字元串反向。(20分)
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
char *fun(char *q)
{
char temp;
int len=strlen(q);
int i;
for(i=0;len-i-1>i;i++)
{
temp = *(q+i);
*(q+i) = *(q+len-i-1);
*(q+len-i-1) = temp;
}
return q;
}
main()
{
char *q;
q=(char *)malloc(200*sizeof(char));
printf("please input the string:\n");
scanf("%s",q);
fun(q);
printf("after reverse the string is:\n");
printf("%s\n",q);
return 0;
}*/
/*5、已知學生三門課程基本信息如下。請使用結構體編程,計算學生三門課程平均成績後,
列表輸出學生的姓名、數學、英語、計算機、平均分信息,並按平均分排序。(20分)
姓名 數學 英語 計算機
Mary 93 100 88
Jone 82 90 90
Peter 91 76 71
Rose 100 80 92
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student{
char name[20];
int math;
int english;
int computer;
double average;
};
main()
{
int i,j,index;
struct student a[4];
struct student temp;
strcpy(a[0].name,"mary"),a[0].math=93,a[0].english=100,a[0].computer = 88;
strcpy(a[1].name,"jone"),a[1].math=82,a[1].english=90,a[1].computer = 90;
strcpy(a[2].name,"peter"),a[2].math=91,a[2].english=76,a[2].computer = 71;
strcpy(a[3].name,"rose"),a[3].math=100,a[3].english=80,a[3].computer = 92;
for(i=0;i<4;i++)
a[i].average =(a[i].computer +a[i].english +a[i].math)/3 ;
for(i=0;i<3;i++)
{
index = i;
for(j=i;j<4;j++)
if(a[j].average <a[index].average )
index = j;
temp = a[i];
a[i] = a[index];
a[index] = temp;
}
printf("姓名 數學 英語 計算機 平均分\n");
for(i=0;i<4;i++)
{
printf("%6s%6d%6d%9d%9.1f",a[i].name ,a[i].math ,a[i].english ,a[i].computer ,a[i].average );
printf("\n");
}
}*/
/*6、附加題:編程實現輸入一串英文,統計其中各單詞出現的個數(不區分大小寫字母),
以"000"作為字元串輸入結束標志,例如:
Twinkle twinkle little star 000(回車)
twinkle little star
2 1 1 (50分)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
void main()
{
char string[400]; //裝載輸入的原始字元串
char temp[20][20]; //裝載string中的各個子字元串
char str[20][20]; //裝在string中的各個子字元串,不過不包括重復的字元串,只是把不同的字元串收錄在str中
int num=0; //記錄空格的個數
int order[20]; //記錄各個空格的位置
int i,j,k;
int sum[20]; //記錄子字元串出現的個數
int flag=0; //判斷是否把子字元串輸入到str中
for(i=0;i<20;i++)
memset(temp[i],'\0',20); //把那裡面的元素清零,如果不清零會產生亂碼
for(i=0;i<20;i++)
memset(str[i],'\0',20); //把那裡面的元素清零,如果不清零會產生亂碼
printf("please input the string:\n");
gets(string); //把字元串輸入到字元數組string[400]中
for(i=0;string[i]!='0';i++)
string[i]=tolower(string[i]); //將字元串中的大寫字母轉化成小寫字母
for(i=0;string[i]!='0';i++)
if(string[i]==' ')
{
order[num]=i; //記錄空格的位置
num++; //空格的數目加1
}
for(i=0;i<order[0];i++)
temp[0][i]=string[i];//記錄了第一個空格前的字元串,把它輸入到temp[0][]中.
for(j=0;j<num;j++)
for(k=0,i=order[j]+1;i<order[j+1];i++)
temp[j+1][k++] = string[i]; //將string字元串分開後存在temp中,也就是把第一個空格之後的字元串分別存放在temp中。
//第一個字元串為temp[0],第二個字元串為temp[1],往後就一次類推了
for(k=0,i=0;i<num;i++)
{
flag=0;
for(j=0;j<k;j++)
if(!strcmp(temp[i],str[j]))
{
flag=1;
break;
}
if(flag==0)
strcpy(str[k++],temp[i]);//關於他的實現舉例,第一遍時temp[0]=hello,str[0]=hello;但是當temp[1]=hello時,str[1]中不會
//在存儲temp的值,而是把這個忽略掉,接著往下找。
}
for(i=0;i<k;i++) //k決定了輸出的字元串的個數,從而避免了相同字元串的重復輸入,通過flag的變化來實現
{
sum[i]=0;
for(j=0;j<num;j++)
if(!strcmp(str[i],temp[j]))
sum[i]++;
printf("%s %d\n",str[i],sum[i]);
}
}*/
Ⅱ c語言問題求解
答案
①x>=0 ②x < amin
為什麼x同時賦給amin和amax?
並不是同時賦給amin和amax,每次只能執行一個if分支。對於每一次循環只能是要麼執行amax=x,要麼執行amin=x。只不過是一個while循環判斷輸入的這個數字是不是最大值或者最小值而已,這樣一次循環辦能兩個事情,方便。不可能出現一個數既比最大值要大還比最小值最小。不明白可以往下看。
解析
這個題讓找出所輸入的一組數據中的最大值和最小值。這個題的思路是使用了打擂台演算法。打擂台演算法就是可以解決最大值和最小值問題。演算法思路:默認設置所輸入的第一個數字就是最大值。其後,對於每次輸入的數字都和最大值進行比較,如果說當前值都比最大值都大了,那麼這個值就新的最大值。最小值也一樣:設置第一個數為最小值,對其後的每一個數字都和這個默認最小值進行比較,如果當前值都比最小值都還小了,那麼這個值就是新的最小值。所以會有這兩條語句:
if(x>amax)amax=x;
上面就是比較語句,對於所輸入的數值,和amax最大值比較,如果比最大值要大,就把當前值x賦予給amax,此時最大值被更新了。第二如果x比最小值都要小,就把當前x賦予給amin,此時最小值被更新了。所以這里並不是說x同時賦給了amax和amin,這個兩個if語句每次循環只能走一個。如果還不明白自己可以拿筆拿紙畫一畫,一畫就明白。
if(x<amin)amin=x;
Ⅲ c語言中用.c文件
程序源代碼如下,希望能幫到你:)
#include<stdio.h>
intmax(inta[],intn)
{
intaMax=0;
for(inti=0;i<n;i++)
{
if(aMax<a[i])
aMax=a[i];
}
returnaMax;
}
intmin(inta[],intn)
{
intaMin=0;
for(inti=0;i<n;i++)
{
if(aMin<a[i])
aMin=a[i];
}
returnaMin;
}
intmain()
{
inta[100],len;
intaMax,aMin;
printf("請輸入數組長度(最大值100):");
scanf("%d",&len);
printf("請輸入數組各個值:");
for(inti=0;i<len;i++)
scanf("%d",&a[i]);
//調用上面的兩個函數並輸出結果
aMax=max(a,len);
aMin=min(a,len);
printf("最大值:%d ",aMax);
printf("最小值:%d ",aMax);
return0
}
Ⅳ C語言,這里我不會寫了.語法沒錯
原本的答案就不刪除了,看過了你的代碼,主要的問題是類型轉換的問題!
你錄入的數據、新數據的轉換,採用的是char字元型,這樣是不能直接進行操作後%d輸出的。
字元型在做算數操作的時候,是按照assic碼值進行計算的。
雖然有了-'0'的操作,但是,直接操作還是會出問題的。
assic碼表定義了128個值,你字元型直接乘100的時候,就已經越界了,沒辦法表示,出現問題應該就在這個地方!
修改建議:將數組等相關變數定義成int或長整型,去除-'0'操作,經過測試是可以使用的!/*以下是實現第一步的操作輸出指定數值最大和最小的差值:*/
#include<stdio.h>
intmain()
{
inta,aMax=0,aMin=0;
inti=0,j=0,k=0,temp=0;
intarr[10];//這里只能統計10位數,不過正常應該夠了,不夠就調大一點
scanf("%d";&a);
while(a>0)
{
arr[i]=a%10;
a=a/10;
i++;
}
for(j=0;j<i;j++)//看一下獲取的數值對不對
{
printf("%d ",arr[j]);
}
for(j=0;j<i;j++)//從大到小重新排列很簡單卻又沒效率的排序方式
{
for(k=j+1;k<i;k++)
{
if(arr[j]<arr[k])
{
temp=arr[k];
arr[k]=arr[j];
arr[j]=temp;
}
}
}
for(j=0;j<i;j++)//獲取大數字
{
aMax=aMax*10+arr[j];
}
for(j=i-1;j>=0;j--)//獲取小數字
{
aMin=aMin*10+arr[j];
}
//輸出結果
printf(" %d %d %d ",aMax,aMin,aMax-aMin);
return0;
}
/*在封裝功能到函數裡面時候有了個發現,多次運行會出現死循環,最大數-最小數後,獲得數值運算出的新數值同原來的一樣,多次運行居然結果都是一個,有點意思,所以有了如下程序*/
/*ps裡面的輸出是為了便於觀察,不需要可以刪掉*/
#include<stdio.h>
intmain()
{
inta=0;
intb=0;
scanf("%d",&a);
while(a!=b)//兩次結果相同停止運行會死循環的
{
b=a;//記錄運行前的結果
a=f(a);//記錄運行後的結果
}
return0;
}
intf(inta)//同最開始的程序不做注釋
{
intaMax=0,aMin=0;
inti=0,j=0,k=0,temp=0;
intarr[10];
while(a>0)
{
arr[i]=a%10;
a=a/10;
i++;
}
for(j=0;j<i;j++)
{
for(k=j+1;k<i;k++)
{
if(arr[j]<arr[k])
{
temp=arr[k];
arr[k]=arr[j];
arr[j]=temp;
}
}
}
for(j=0;j<i;j++)
{
aMax=aMax*10+arr[j];
}
for(j=i-1;j>=0;j--)
{
aMin=aMin*10+arr[j];
}
printf(" %d %d %d ",aMax,aMin,aMax-aMin);
returnaMax-aMin;
}
以下是運行截圖,供參考:(試了幾個數字都是954 可能和你的題目有點關系,不做深入探討)
Ⅳ C語言求最大最小值,出錯在哪max=11,min=-82246761
這個就沒問題了,你問題出在temp,只是要找max,min,你值一直交換干嗎,而且temp沒賦值,默認隨機帶一個數,給你來個負的就比你自己寫的小了
#include<stdio.h>
intamax(inta[],intn)
{
inttemp,max,i;
max=a[0];
for(i=1;i<n;i++)
{
if(a[i]>max)
max=a[i];
}
returnmax;
}
intamin(inta[],intn)
{
inttemp,min,i;
min=a[0];
for(i=1;i<n;i++)
{
if(a[i]<min)
min=a[i];
}
returnmin;
}
intmain()
{
intmax,min,i,a[10]={3,7,9,11,0,6,7,5,4,2};
max=amax(a,10);
min=amin(a,10);
printf("max=%d ",max);
printf("min=%d ",min);
return0;
}