當前位置:首頁 » 編程語言 » c語言問題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言問題

發布時間: 2022-01-16 07:11:31

c語言簡單問題

int的變數裝不下15位那麼大的,無法scanf("%d")輸入,要表示這種超過計算機long大小的數據,最簡單的就是使用字元串,例如要表示1000位的整數,可以定義的變數為:
char big1[1000], big2[1000],big3[1000];
用scanf("%s")或者gets讀入數據,按照按右對齊進行加運算結果存入big3,最簡單的辦法是逆向big1、big2然後按位加結果保存到big3,最後逆向big後就是結果,形象點舉例:
如果輸入的big1是:123456789999999999
程序逆向排序為:999999999987654321
對big2同樣的處理,然後就可以按位計算合計存入big3
整個程序,關鍵的就是兩個函數,第一個是計算求和的:
void big_sum(char a[], char b[], char c[]);
函數的功能是計算超大整數的加法:c=a+b
第二個是逆向字元串的函數:
void str_rev(char s[]);
功能是把字元串s收尾顛倒,下面以C語言的語法描述兩個函數演算法,如果看不懂就代碼就看注釋。
void str_rev(char s[]){
int n=0,i=0;
char t;
while(s[n]) n++;/*使得指針移動到字元串末尾的結束符*/
n--;
while(i>n){t=s[i];s[i]=s[n];s[n]=t;i++;n--;}/*首尾交換*/
}
加法函數的演算法邏輯如下:
void big_sum(char a[], char b[], char c[]){
int ia=0,ib=0,ic=0,s=0;
str_rev(a);/*逆向a*/
str_rev(b);/*逆向b*/
while(a[ia] && b[ib]){
if (a[ia]) {s+=a[ia]-'0'; ia++;}/*如果a沒有完,那麼取出一位累加到s,移動到下一位*/

if (b[ib]) {s+=b[ib]-'0'; ib++;}/*如果b沒有完,那麼取出一位累加到s,移動到下一位*/
c[ic]='0' + s%10;/*一位結果,轉換為字元*/
s/=10;/*保留進位*/
ic++;
}
c[ic]='\0';/*給結果添加結束符*/
str_rev(a);/*還原a*/
str_rev(b);/*還原b*/
str_rev(c);/*還原c*/
}

最後就是主程序了:
main(){
char a[1000],b[1000],c[1000];
printf("a=");gets(a);
printf("b=");gets(b);
big_sum(a,b,c);
printf("c=");pets(c);
}

⑵ c語言問題

您好,c語言經典100題:
【程序1】
題目:有1,2,3,4個數字,能組成多少個互不相同且無重復數字的三位數 都是多少
1.程序分析:可填在百位,十位,個位的數字都是1,2,3,4.組成所有的排列後再去
掉不滿足條件的排列.
2.程序源代碼:
main()
{
int i,j,k;
printf("\n");
for(i1;i<5;i++) /*以下為三重循環*/
for(j1;j<5;j++)
for (k1;k<5;k++)
{
if (i!k&&i!j&&j!k) /*確保i,j,k三位互不相同*/
printf("%d,%d,%d\n",i,j,k);
}
}

【程序2】
題目:企業發放的獎金根據利潤提成.利潤(i)低於或等於10萬元時,獎金可提10%;利潤高
於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分,可可提
成7.5%;20萬到40萬之間時,高於20萬元的部分,可提成5%;40萬到60萬之間時高於
40萬元的部分,可提成3%;60萬到100萬之間時,高於60萬元的部分,可提成1.5%,高於
100萬元時,超過100萬元的部分按1%提成,從鍵盤輸入當月利潤i,求應發放獎金總數
1.程序分析:請利用數軸來分界,定位.注意定義時需把獎金定義成長整型.
2.程序源代碼:
main()
{
long int i;
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
scanf("%ld",&i);
bonus1100000*0.1;bonus2bonus1+100000*0.75;
bonus4bonus2+200000*0.5;
bonus6bonus4+200000*0.3;
bonus10bonus6+400000*0.15;
if(i<100000)
bonusi*0.1;
else if(i<200000)
bonusbonus1+(i-100000)*0.075;
else if(i<400000)
bonusbonus2+(i-200000)*0.05;
else if(i<600000)
bonusbonus4+(i-400000)*0.03;
else if(i<1000000)
bonusbonus6+(i-600000)*0.015;
else
bonusbonus10+(i-1000000)*0.01;
printf("bonus%d",bonus);
}

【程序3】
題目:一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少
1.程序分析:在10萬以內判斷,先將該數加上100後再開方,再將該數加上268後再開方,如果開方後
的結果滿足如下條件,即是結果.請看具體分析:
2.程序源代碼:
#include "math.h"
main()
{
long int i,x,y,z;
for (i1;i2)/*如果是閏年且月份大於2,總天數應該加一天*/
sum++;
printf("it is the %dth day.",sum);}

【程序4】
題目:輸入某年某月某日,判斷這一天是這一年的第幾天?
1.程序分析:以3月5日為例,應該先把前兩個月的加起來,然後再加上5天即本年的第幾天,特殊
情況,閏年且輸入月份大於3時需考慮多加一天。
2.程序源代碼:
main()
{
int day,month,year,sum,leap;
printf("\nplease input year,month,day\n");
scanf("%d,%d,%d",&year,&month,&day);
switch(month)/*先計算某月以前月份的總天數*/
{
case 1:sum0;break;
case 2:sum31;break;
case 3:sum59;break;
case 4:sum90;break;
case 5:sum120;break;
case 6:sum151;break;
case 7:sum181;break;
case 8:sum212;break;
case 9:sum243;break;
case 10:sum273;break;
case 11:sum304;break;
case 12:sum334;break;
default:printf("data error");break;
}
sumsum+day; /*再加上某天的天數*/
if(year%4000||(year%40&&year%100!0))/*判斷是不是閏年*/
leap1;
else
leap0;
if(leap1&&month>2)/*如果是閏年且月份大於2,總天數應該加一天*/
sum++;
printf("It is the %dth day.",sum);}
【程序5】
題目:輸入三個整數x,y,z,請把這三個數由小到大輸出.
1.程序分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,
然後再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小.
2.程序源代碼:
main()
{
int x,y,z,t;
scanf("%d%d%d",&x,&y,&z);
if (x>y)
{tx;xy;yt;} /*交換x,y的值*/
if(x>z)
{tz;zx;xt;}/*交換x,z的值*/
if(y>z)
{ty;yz;zt;}/*交換z,y的值*/
printf("small to big: %d %d %d\n",x,y,z);
}

【程序6】
題目:用*號輸出字母c的圖案.
1.程序分析:可先用'*'號在紙上寫出字母c,再分行輸出.
2.程序源代碼:
#include "stdio.h"
main()
{
printf("hello c-world!\n");
printf(" ****\n");
printf(" *\n");
printf(" * \n");
printf(" ****\n");
}

【程序7】
題目:輸出特殊圖案,請在c環境中運行,看一看,very beautiful!
1.程序分析:字元共有256個.不同字元,圖形不一樣.
2.程序源代碼:
#include "stdio.h"
main()
{
char a176,b219;
printf("%c%c%c%c%c\n",b,a,a,a,b);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",a,a,b,a,a);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",b,a,a,a,b);}

【程序8】
題目:輸出9*9口訣.
1.程序分析:分行與列考慮,共9行9列,i控制行,j控制列.
2.程序源代碼:
#include "stdio.h"
main()
{
int i,j,result;
printf("\n");
for (i1;i<10;i++)
{ for(j1;j<10;j++)
{
resulti*j;
printf("%d*%d%-3d",i,j,result);/*-3d表示左對齊,佔3位*/
}
printf("\n");/*每一行後換行*/
}
}

【程序9】
題目:要求輸出國際象棋棋盤.
1.程序分析:用i控制行,j來控制列,根據i+j的和的變化來控制輸出黑方格,還是白方格.
2.程序源代碼:
#include "stdio.h"
main()
{
int i,j;
for(i0;i<8;i++)
{
for(j0;j<8;j++)
if((i+j)%20)
printf("%c%c",219,219);
else
printf(" ");
printf("\n");
}
}

【程序10】
題目:列印樓梯,同時在樓梯上方列印兩個笑臉.
1.程序分析:用i控制行,j來控制列,j根據i的變化來控制輸出黑方格的個數.
2.程序源代碼:
#include "stdio.h"
main()
{
int i,j;
printf("\1\1\n");/*輸出兩個笑臉*/
for(i1;i<11;i++)
{
for(j1;j<i;j++)
printf("%c%c",219,219);
printf("\n");
}
}

【程序11】
題目:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月
後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少
1.程序分析: 兔子的規律為數列1,1,2,3,5,8,13,21....
2.程序源代碼:
main()
{
long f1,f2;
int i;
f1f21;
for(i1;i<20;i++)
{ printf("%12ld %12ld",f1,f2);
if(i%20) printf("\n");/*控制輸出,每行四個*/
f1f1+f2; /*前兩個月加起來賦值給第三個月*/
f2f1+f2; /*前兩個月加起來賦值給第三個月*/
}
}

【程序12】
題目:判斷101-200之間有多少個素數,並輸出所有素數.
1.程序分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,
則表明此數不是素數,反之是素數.
2.程序源代碼:
#include "math.h"
main()
{
int m,i,k,h0,leap1;
printf("\n");
for(m101;m<200;m++)
{ ksqrt(m+1);
for(i2;i<k;i++)
if(m%i0)
{leap0;break;}
if(leap) {printf("%-4d",m);h++;
if(h%100)
printf("\n");
}
leap1;
}
printf("\nthe total is %d",h);
}

⑶ C語言問題

因為在C語言中,主調函數傳遞給被調函數的值,都是「單身傳遞」的。在被調函數中形式參數值的變化,並不會對主調函數中的實在參數產生變化的。所以,三次調用,並不會改變主函數中x,y,z的值。

⑷ C語言問題

1
答案應該是B,這個沒什麼好解釋的(就是指針變數指向變數的地址)
2
答案應該是D 如果直接用字元串對字元數組初始化的話字元數組的長度要比實際字元串長度大1的
因為字元串在字元數組中是以'\0'結束的,這個你也可以用sizeof() 分別測試一下
我已經測試過了A比B大1的
3
答案應該是D,這個沒的說,括弧的作用就是避免二義
4
答案應該是C,不要把 int *ptr();搞混了,題上的是返回一個整形數據的指針函數,後者是一個
返回指針的函數
5
答案是A,呵呵,這個你好好想一下就明白了
6
答案是A 4
7
答案是23 這個你要好好看一看,特別是(&Arr+1)它和(Arr+1)區別很大,前者在地址上加了
1而後者在地址上加了1*sizeof(int);
8.
這道題你是不是搞錯了,你仔細看看有很多錯誤的。
9.
答案是 B 為了幫助你理解,對此程序我寫了段代碼
#include<stdio.h>
void main()
{
void func(char str[100]);
char str[100];
printf("%d\n",sizeof(str));//答案是100
func(str);

}
void func(char str[100])
{
printf("%d\n",sizeof(str));//答案是4

}
為什麼會出現這種情況呢,原因是因為兩者有著本質性的區別,第一個sizeof(str)中的str是一個
地址常量,它索引著一段大小為100的內存堆,而第二個sizeof(str)中的str是一個字元指針變數
sizeof(str)的結果就是一個字元指針變數所具有的內存,它的內存應該是為4的
10
答案是D
二:
1.
錯,應該放在靜態存儲區(或全局數據區的)
2

3.

4.
錯,不可能是float 型的
5.


1. int main(void)
{
Unsigned char index = 0;//這個地方應該是unsigned int index=0;注意第一個u不能大寫
While(index < 256)
{
index +=index;
index++;
}
Printf(「index value %d\n」,index);
Return 0;
}
2.
char*f()
{ //應該是static char s[4]={'0','1','2','3','\0'};
Char s[4]={『1』,』2』,』3』,』0』};//關鍵字的開頭是不能大寫的,還有就是符號『也不對
Return s;//ruturn 第一個字母也不能大寫,
}

Void main()
{
Char *s;//應該是char 第一個字母不能大寫
s=f();
printf(「%s」,s);
}
//你這道題的本意是想通過函數調用來獲得一個字元串的首地址從而在主函數中輸出,
//但是,有一點這個程序沒有考慮到那就是當被調函數結束後那個char s[4] 所佔內存將自動
//操作系統回收,因為它只是個動態局部變數,所以要想達到目的應該是聲明成靜態變數的
//static char s[4],還有一點錯誤就是字元串都要'\0'結尾否則輸出的字元串的將不會是你想要的那樣

3.
這道題沒什麼錯誤,能達到預期的效果,除了有幾處拼寫錯誤,例如你第一個是GetmMnory而第二個是
GetMemory這一點你注意一下就可以了
void GetMenory(char**p)
{
*p = (char*)malloc(100);
}
Void Test(void)
{
char*str = NULL;
GetMemory(&str);
strcpy(str,」hello morld」);
printf(str);
}
4.
這道題沒什麼語法錯誤,除了單引號格式不對,還有就就違反了字元串都要以'\0'結尾這一約定
5.
這道題沒有什麼語法錯誤,就是有個字元串函數寫錯了str,應該寫成 strcpy的
四:
你這道題具體是讓做什麼的,我不是太明白,是讓建一個動態鏈表啊還是靜態鏈表啊,
請你把問題寫詳細點
五。

int judgment(int a[],int length )//這個函數是判斷是否對稱的

{
for(int i=0;i<=length/2;i++)
if(a[i]!=a[length-i])

break;
if(i==length/2+1)
return 1;
else
return 0;

}
void main(void)
{
int a[10];
int num;
printf("請輸入你要檢測的數\n") ;
scanf("%d",&num);
int length=0;

//這個循環是為了把整數拆開放到一個整形數組中,拆開以後放進數組裡面的剛好是和正常的數
//反序的,不過這個不會影響結果的,因為只要數對稱反序後一樣對稱,如果數不對稱反序後依然不對稱
do
{
int temp=num%10;
a[length]=temp;
num=num/10;
length++;
} while(num>=10);
a[length]=num;
if( judgment(a,length))
printf("是\n");
}
如果這個程序有什麼不懂得話,可以提出來,隨時幫你解析

希望我的答案對你有點幫助……
希望對你能有所幫助。

⑸ C語言問題~

if語句的用法

if 語句

if語句是C++/C語言中最簡單、最常用的語句,然而很多程序員用隱含錯誤的方式寫if語句。本節以「與零值比較」為例,展開討論。

4.3.1 布爾變數與零值比較

l 【規則4-3-1】不可將布爾變數直接與TRUE、FALSE或者1、0進行比較。

根據布爾類型的語義,零值為「假」(記為FALSE),任何非零值都是「真」(記為TRUE)。TRUE的值究竟是什麼並沒有統一的標准。例如Visual C++ 將TRUE定義為1,而Visual Basic則將TRUE定義為-1。

假設布爾變數名字為flag,它與零值比較的標准if語句如下:

if (flag) // 表示flag為真

if (!flag) // 表示flag為假

其它的用法都屬於不良風格,例如:

if (flag == TRUE)

if (flag == 1 )

if (flag == FALSE)

if (flag == 0)

4.3.2 整型變數與零值比較

l 【規則4-3-2】應當將整型變數用「==」或「!=」直接與0比較。

假設整型變數的名字為value,它與零值比較的標准if語句如下:

if (value == 0)

if (value != 0)

不可模仿布爾變數的風格而寫成

if (value) // 會讓人誤解 value是布爾變數

if (!value)

4.3.3 浮點變數與零值比較

l 【規則4-3-3】不可將浮點變數用「==」或「!=」與任何數字比較。

千萬要留意,無論是float還是double類型的變數,都有精度限制。所以一定要避免將浮點變數用「==」或「!=」與數字比較,應該設法轉化成「>=」或「<=」形式。

假設浮點變數的名字為x,應當將

if (x == 0.0) // 隱含錯誤的比較

轉化為

if ((x>=-EPSINON) && (x<=EPSINON))

其中EPSINON是允許的誤差(即精度)。

4.3.4 指針變數與零值比較

l 【規則4-3-4】應當將指針變數用「==」或「!=」與NULL比較。

指針變數的零值是「空」(記為NULL)。盡管NULL的值與0相同,但是兩者意義不同。假設指針變數的名字為p,它與零值比較的標准if語句如下:

if (p == NULL) // p與NULL顯式比較,強調p是指針變數

if (p != NULL)

不要寫成

if (p == 0) // 容易讓人誤解p是整型變數

if (p != 0)

或者

if (p) // 容易讓人誤解p是布爾變數

if (!p)

4.3.5 對if語句的補充說明

有時候我們可能會看到 if (NULL == p) 這樣古怪的格式。不是程序寫錯了,是程序員為了防止將 if (p == NULL) 誤寫成 if (p = NULL),而有意把p和NULL顛倒。編譯器認為 if (p = NULL) 是合法的,但是會指出 if (NULL = p)是錯誤的,因為NULL不能被賦值。

程序中有時會遇到if/else/return的組合,應該將如下不良風格的程序

if (condition)

return x;

return y;

改寫為

if (condition)

{

return x;

}

else

{

return y;

}

或者改寫成更加簡練的

return (condition ? x : y);

⑹ C語言問題!!

#include<stdio.h>
typedef
struct
element_t
{
int
nNum;
/*原子序號*/
char
cName[20];/*元素名稱*/
char
cSign[10];/*化學符號*/
float
fWeight;/*原子重量*/
int
nStruct[7];
/*電子排布*/
}element_t;
void
scan_element(element_t
array[],int
n)
{
int
i;
for(i=0;i<n;i++)
{
printf("元素序號:");
scanf("%d",&array[i].nNum);
while(getchar()!='\n');
printf("元素名稱:");
gets(array[i].cName);
printf("元素符號:");
gets(array[i].cSign);
printf("原子重量:");
scanf("%f",&array[i].fWeight);
while(getchar()!='\n');
printf("電子排布(7個整數):");
scanf("%d%d%d%d%d%d%d",&array[i].nStruct[0],&array[i].nStruct[1],
&array[i].nStruct[2],&array[i].nStruct[3],
&array[i].nStruct[4],&array[i].nStruct[5],&array[i].nStruct[6]);
while(getchar()!='\n');
}
}
void
print_element(element_t
array[],int
n)
{
int
i;
printf("這%d個原子的信息如下:\n",n);
printf("原子序號
元素名稱
元素符號
原子重量
核外電子排布
\n");
for(i=0;i<n;i++)
{
printf("%-9d
%-9s
%-9s
%-10.4f",array[i].nNum,array[i].cName,array[i].cSign,array[i].fWeight);
printf("%-2d%-2d%-2d%-2d%-2d%-2d%-2d",array[i].nStruct[0],array[i].nStruct[1],
array[i].nStruct[2],array[i].nStruct[3],
array[i].nStruct[4],array[i].nStruct[5],array[i].nStruct[6]);
printf("\n");
}
}
void
main()
{
element_t
arr[10];
int
n;
printf("輸入元素的個數n(0<n<11):");
scanf("%d",&n);
scan_element(arr,n);
print_element(arr,n);
}

⑺ c語言問題,

一、C語言規定總是從main()開始執行的(這個函數也叫「主函數」)。因此,你發來的題目中的(1、6、8)敘述都是錯誤的,都應該選擇F。二、第2題中,C語言對其數據在內存中所佔用的實際位元組數,隨著程序中聲明的數據類型以及數據的多少而變化,C語言本身並沒有明確規定。這題應該選F。三、第3題,C語言中強制類型轉換,僅對轉換的語句有效,而不會改變所轉換變數的原有數據類型,這是正確的,應該選T。四、第4題,i=8,j=10;printf("%d,%d,%d,%d\n",i,j,++i,j++);實際上是一個程序執行類題目,執行這一句時,先取得ij變數的值,其中有一個++i(先自增),一個j++(後自增),先自增的i先加上1,也就是i=8+1=9,而後自增的j在列印之後再加1,所以列印時仍是j=10。所以列印出來是:9 10 9 10。這是正確的。五、第5題「C語言中放在「」之間的內容都被視為字元串的一個構成部分,都可以在屏幕上原樣顯示」的說法是錯誤的。舉一個例子就可以了:print("%d",8);是列印不出來%d的,它只能列印出來8。所以它是錯的。六、第7題,設x、t均為int型變數,則執行語句"x = 10;t = x && x >10;"後,t的值為,這個題目好似沒有寫完,成了填空題了,現在來看計算過程,t = x && x >10,根據計算的優先順序,>號是6級,&&是11級,先計算x >10,因為x=10,故x>10是不成立的,所以它的值是0,第二步再計算x && 0=10 && 0=0。t的值最後應該是0。希望對你有所幫助。

⑻ 關於c語言問題

是數組越界了。
空格字元' '的數值是32,當你把ch初始化為0,然後又讀取了一串字元,然後 j 循環超過字元串長度後,所有ch[j]都是0,用0減32當數組下標,嘿嘿。。。
不知道你ch[j]-' ' 這是干什麼?是要小寫字母轉大寫?為什麼坐標位置用它來定而不是直接用j?
估計一定要改的是循環中的j<100,改成j<strlen(ch)

⑼ C語言問題###

\xhh 表示一個ASCII碼用16進表示,
其中hh是1到2個16進制數
\ddd 表示一個ASCII碼用8進表示,
其中dd是1到3個8進制數

示常式序:
#include <stdio.h>
#include <stdlib.h>

int main( int argc, char* argv[] )
{
/*A的ascii碼是65,轉成十六進制是41,轉成8進制是101*/
printf("\x41\n"); /*輸出A*/
printf("\101\n"); /*輸出A*/

system("pause");

return 0;
}

⑽ c語言問題

說實話這代碼有點問題s數組只有6位元組5個數加一個空字元 再加一個字元進去 空字元就沒有了
再用puts列印會越界 puts判斷空字元為結尾

while(*(a++) !=0);
這個循環會讓指針a指向空字元後面一個位元組
判斷當前位元組是否為0 不管是與否指針加1

whiIe(*(a-l)<b)
這里因為剛才指向空字元後一個所以要減1
*(a--)=*(a-1);

這句意思就是
*a=*(a-1); 前一個放到現在的位置
然後a--