/*--------------------------------------------------------------------------------------
專業(yè):計算機(jī)原理與應(yīng)用
姓名:姚明
學(xué)號:04051
日期:2007.12.3
說明:C語言上機(jī)實(shí)驗1~6程序設(shè)計
---------------------------------------------------------------------------------------*/
//------------------------------------------------------------
//
// 實(shí)驗2 基本數(shù)據(jù)類型和運(yùn)算程序設(shè)計
//
//------------------------------------------------------------
#include <stdio.h>
#define PI 3.14159;
void main(void)
{
int k,p; /* for task 1*/
int c; /* for task 2*/
int x,y,z,w; /* for task 3*/
float r, s; /* for task 4*/
unsigned short i,m,n,_result; /* for task 5*/
char a; /* for task 6*/
/*task 1*/
/*輸入整數(shù)k、p,將整數(shù)k的高字節(jié)作為結(jié)果的低字節(jié),
整數(shù)p的高字節(jié)作為結(jié)果的高字節(jié),拼成一個新的整數(shù),
然后輸出;*/
printf("input int k,p:");
scanf("%x%x",&k,&p);
int newint = (p&0xff00)|(k&0xff00)>>8;
printf("new int = %x\n\n",newint);
getchar();
/*task 2*/
/*輸入字符c。如果c是大寫字母,
則將c轉(zhuǎn)換成對應(yīng)的小寫,否則c的值不變,
最后輸出c;*/
printf("input a character:");
c = getchar();
c >= 'A' && c <= 'Z'? putchar(c + 'a'- 'A'): putchar(c);
putchar('\n');
putchar('\n');
/*task 3*/
/*輸入整數(shù)x、y、z,輸出其中最小值;*/
printf("input x, y, z:");
scanf("%d%d%d", &x, &y, &z);
w = x < y?x:y;
w = w < z?w:z;
printf("min = %d\n\n",w);
/*task 4*/
/*輸入圓的半徑值r,計算并輸出圓的面積
s=∏r2(∏=3.14159);*/
printf("input the radius r:");
scanf("%f", &r);
s = r * r * PI;
printf("The acreage is %.2f\n\n",s);
/*task 5*/
/* 輸入無符號短整數(shù)
i,m,n(0 <= m<= 15, 1 <= n<= 16-m),
取出i從第m位開始向左的n位
(m從右至左編號為0~15),
并使其向左端(第15位)靠齊;*/
printf("input i, m, n(0 <= m <= 15, 1 <= n <= 16 - m):");
scanf("%hu%hu%hu", &i, &m, &n);
_result = i << 16 - m - n & ~0xffff >> m + n;
printf("The result is %hu\n\n", _result);
getchar();
/*task 6*/
/*輸入一個字符,如果是數(shù)字(0~9)
則輸出該數(shù)字代表的整數(shù)(8位)的反碼,
否則原樣輸出。(反碼用十六進(jìn)制數(shù)表示,
例如,整數(shù)0的反碼為0xff,整數(shù)1的反碼為0xfe,
整數(shù)9的反碼0xf6。)*/
printf("input a charater:");
a = getchar();
a >= '0' && a <= '9'?printf("%hx",~a - '0'):putchar(a);
printf("\n\n");
getchar();
}
//------------------------------------------------------------
//
// 實(shí)驗3 C程序流程控制實(shí)驗
//
//------------------------------------------------------------
#include <stdio.h>
void main()
{
int c; /* 每行的元素值(循環(huán)中生成), 初值為1 */
int n; /* 顯示的行數(shù) */
int i, j; /* 循環(huán)控制 */
/* 輸入行數(shù),顯示13行以內(nèi)為佳 */
do
{
printf("Input n=");
scanf("%d",&n);
} while(n <= 0 || n > 13);
for(i = 0; i < n; i++)
{
for(j = 0; j < n - i; j++) /* 輸入每行前的空格 */
printf("%3c", ' ');
c=1; /* 每行開始輸出前都將c重置為1 */
for(j = 0; j <= i; j++)
{
printf("%-3d", c);
printf("%-3c", ' ');
c = c * (i - j) / (j + 1); /* 核心: 遞推公式 */
}
printf("\n");
}
}
運(yùn)行結(jié)果(VC):
=======================================================================
Input n=10↙
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
=======================================================================
/* 編寫一個程序,將用戶輸入的任意正整數(shù)逆轉(zhuǎn),例如,輸入1234,輸出4321。*/
#include <stdio.h>
void main()
{
int num,_result=0;
printf("enter number:");
scanf("%d",&num);
while(num)
{
_result=_result*10;
_result= num%10+_result;
num/=10;
}
printf("%d\n",_result);
}
/* 驗證歌德巴赫猜想:任何充分大(>=4)的偶數(shù)都可以用兩個素數(shù)之和表示,
將4到100中的所有偶數(shù)分別用兩個素數(shù)之和的形式表示。(例如:4=2+2,100=3+97)*/
#include <stdio.h>
int IsPrime(int n);
void main()
{
for(int i=4;i<=100;i+=2)
{
int x=0;
for(x=2;x<i;x++)
{
if(IsPrime(x)&&IsPrime(i-x))
{
printf("%d = %d + %d\n",i,x,i-x);
break;
}
}
}
}
int IsPrime(int n)
{
int i;
if (n == 1 || n == 2 || n == 3 || n == 5)
return 1;
else if (n % 2)
{
for (i = 3; i <= n / 2 + 1; i += 2)
{
if (n % i == 0) return 0;
}
return 1;
}
else
{
return 0;
}
}
/*計算兩個數(shù)的最大公約數(shù)*/
#include <stdio.h>
unsigned int gcd(unsigned int,unsigned int);
void main()
{
int x,y;
printf("Enter 2 num:");
scanf("%d%d",&x,&y);
printf("common divisor:%d\n",gcd(x,y));
}
unsigned int gcd(unsigned int x,unsigned int y) // common divisor
{
unsigned int i,j,t;
if(x==0)
return y;
if(y==0)
return x;
for(i=0;0==(x&1);x>>=1,++i);
for(j=0;0==(y&1);y>>=1,++j);
if(j<i)
i=j;
for(;;)
{
if(x<y)
t=y,y=x,x=t;
if(0==(x-=y))
return y<<i;
for(;0==(x&1);x>>=1);
}
}
/* 輸出所輸入的正文。輸出時將連續(xù)的多個空格字符和橫向制表符縮減為一個空格字符,
空行刪去不輸出(空行是指僅由空格字符、橫向制表符和行結(jié)束符組成的行)*/
#include <stdio.h>
int main()
{
int ch, flag1 =0, flag2 = 0;
while((ch=getchar())!=EOF)
switch(ch){
case '\n':
if(flag2) {
flag1=flag2=0;
putchar(ch);
}
break;
case ' ':
case '\t':
flag1=1;
break;
default:
if(flag1){
putchar(' ');
flag1=0;
}
putchar(ch);
flag2=1;
continue;
}
return 0;
}
//------------------------------------------------------------
//
// 實(shí)驗4 C函數(shù)程序設(shè)計
//
//------------------------------------------------------------
#include <stdio.h>
int factorial(int n); //計算階乘
double reckon(int n); //公式函數(shù)
void main()
{
int num;
printf("Enter num:");
scanf("%d",&num);
printf("out:%f\n",reckon(num));
}
int factorial(int n)
{
long _result;
if(n>1)
_result=factorial(n-1)*n;
else _result=1;
return(_result);
}
double reckon(int n)
{
double sum=0;
for(int i=1;i<n;i++)
{
double ret = factorial(i);
sum += 1/ret;
}
return sum;
}
//------------------------------------------------------------
//
// 實(shí)驗5 數(shù)組程序設(shè)計
//
//------------------------------------------------------------
/* 用rand函數(shù)模擬擲雙骰子,計算投擲出的兩個值的和。在程序中把這兩個骰子各擲3600次,
用一維數(shù)組記錄每一種可能值的出現(xiàn)次數(shù),以表格格式打印出結(jié)果,判斷算出的和是否合理。*/
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <time.h>
void main()
{
int rands[13];int num1,num2;int i;
memset(rands,0,sizeof(int)*13);
/* Seed the random-number generator with current time so that
* the numbers will be different every time we run.
*/
srand( (unsigned)time( NULL ) );
for(i = 1; i < 3600; i++ )
{
num1 = rand()%6;
num2 = rand()%6;
num1==0?num1=6:num1;
num2==0?num2=6:num2;
rands[num1+num2]++;
}
printf("-------------------------------------------------------------------------------\n");
printf("number:\t");
for(i=2; i<13; i++)
{
printf("%d\t",i);
}
printf("\ntimes:\t");
for(i=2; i<13; i++)
{
printf("%d\t",rands[i]);
}
printf("\n-------------------------------------------------------------------------------\n");
}
/* 定義函數(shù)stncat(s,t,n),從串t中至多取 n個字符添加到 s的尾部,在主函數(shù)中輸入兩個字符串和一個整數(shù)n,
調(diào)用函數(shù)stncat按要求連接成一個字符串,輸出連接后的結(jié)果字符串。*/
#include <stdio.h>
char * strncat(char*,const char *,int);
void main()
{
char string[80] = "This is the initial string!";
char suffix[] = " extra text to add to the string...";
/* Combine strings with no more than 19 characters of suffix: */
printf( "Before: %s\n", string );
strncat( string, suffix, 19 );
printf( "After: %s\n", string );
}
char * strncat(char *dest,const char *source,int count)
{
char *p = dest;
while (*p) p++;
while (count-- && (*p++ = *source++));
*p = '\0';
return(dest);
}
/* 找出二維數(shù)組b[3][3]的“鞍點(diǎn)”(即行上為最大,列上為最小的元素)
及其位置(行、列下標(biāo)),如果不存在鞍點(diǎn)也輸出相應(yīng)信息。*/
#include<stdio.h>
#define N 3
#define M 3
void main()
{
int a[N][M],i,j,k,max=0,xmax,ymax,found=0,flag=1;
printf("Input the array(%d numbers):\n",N*M);
for( i=0;i<N;i++ )
{
for( j=0;j<M;j++ )
{
printf("array[%d][%d]=",i,j);
scanf("%d",&a[i][j]);
}
}
for( i=0;i<N;i++ )
{
for( j=0;j<M;j++ )
{
if( max<a[i][j] )
{
max=a[i][j];
}
}
for( j=0;j<M;j++ )
{
if(max==a[i][j])
{
xmax=j;
for( k=0;k<N;k++ )
{
if( max>a[k][xmax] )
flag=0;
}
if( flag==1 )
{
ymax = i;
printf("%d is the andian.\n",max);
printf("pt: x=%d\ty=%d\n",xmax+1,ymax+1);
found++;
}
}
}
}
if( found==0 )
printf("andian not found!\n");
}
/* 八皇后問題,在8*8方格國際象棋盤上放置8個皇后,任意兩個皇后不能位于同一行、
同一列或同一斜線(正斜線或反斜線)上,輸出所有可能的放法。*/
#include <stdio.h>
#include "math.h"
void paichu(char (*a)[8],int i,int j);
void main()
{
int i,j,k,n;
char a[8][8];
for(k=0;k<8;++k)
{
n=0;
for(i=0;i<8;++i)
for(j=0;j<8;++j)
a[i][j]='*';
for(i=0;i<8;++i)
for(j=0;j<8;++j)
{
if(i==0 && j<k) continue;
else if(a[i][j]=='*' && (fabs(j-k)<i+5))
{
paichu(a,i,j);
a[i][j]='*';
}
}
for(i=0;i<8;++i)
for(j=0;j<8;++j)
if(a[i][j]=='*') ++n;
if(n!=8) continue;
for(i=0;i<8;++i)
{
for(j=0;j<8;++j)
printf("%c",a[i][j]);
printf("\n");
}
printf("\n");
getchar();
}
}
void paichu(char (*a)[8],int i,int j)
{
int k,n,i1,i2,j1,j2;
if(i>j) n=j;
else n=i;
for(k=0;k<8;++k)
{
*(*(a+k)+j)='o';
*(*(a+i)+k)='o';
}
i1=i-n;
j1=j-n;
while(i1<8 && j1<8)
{
*(*(a+i1)+j1)='o';
++i1;
++j1;
}
if(i+j<8) i2=0;
else i2=i-7+j;
j2=j+i-i2;
while(i2<8 && j2>=0)
{
*(*(a+i2)+j2)='o';
++i2;
--j2;
}
}
//------------------------------------------------------------
//
// 實(shí)驗6 指針程序設(shè)計
//
//------------------------------------------------------------
1.2 運(yùn)行下面的程序之前,先給出你自己認(rèn)為的結(jié)果,再看看運(yùn)行結(jié)果是否和你想的一樣,試著解釋程序輸出的結(jié)果。
#include <stdio.h>
#include <stdlib.h>
void f(char s[100])
{
printf("s size in function f: %d\n", sizeof(s));
}
int main()
{
char s[] = "hello";
char *p, *mp;
int n;
char str[100];
printf("s size: %d\n", sizeof(s));
p = s;
printf("p size: %d\n", sizeof(p));
printf("n size: %d\n", sizeof(n));
printf("str size: %d\n", sizeof(str));
mp = malloc(100);
printf("mp size: %d\n", sizeof(mp));
f(str);
return 0;
}
sizeof是是長度運(yùn)算符, 獲得數(shù)據(jù)類型或是變量的長度,如果是數(shù)據(jù)類型,
則返回數(shù)據(jù)類型大小,如果是用數(shù)組,則返回數(shù)組所占空間大小
s size:6 s是自動分配的數(shù)組,根據(jù)所給字符串長度,編譯器自動分配空間,(h,e, l, l, o, \0)
p size:4 p是char*,通常,指針長度和計算機(jī)CPU的位數(shù)相等,此計算機(jī)為32位,即4字節(jié)
str size:100 返回數(shù)組長度,str是用戶自定義長度的數(shù)組
mp size:4 同上 p size
s size in function f:4 f函數(shù)屬于傳參操作,即指針傳遞,沒有開辟新空間,函數(shù)對s做指針處理。
2.判斷與改錯:
#include <stdio.h>
void upper(char *s)
{
while (*s != '\0')
{
if (*s >= 97 && *s <= 122)
*s -= 32;
s++;
}
}
void lower(char *s)
{
while (*s != '\0')
{
if (*s >= 65 && *s <= 90)
*s += 32;
s++;
}
}
int main ()
{
char str[100];
char *p, *q;
printf("Input a string with uppercase, lowercase or digits: \n");
gets(str);
printf("Original: %s\n",str);
p = str;
upper(p);
printf("Uppercase: %s\n",p);
q = str;
lower(q);
printf("Lower: %s\n",q);
return 0;
}
錯誤原因:
p,q兩個指針指向了同一個數(shù)據(jù)源str,對p,q的操作會直接改變str的內(nèi)容,
printf函數(shù)必須在每次數(shù)據(jù)改變時,分別打印到屏幕,否則只能輸出3行同樣的str數(shù)據(jù)。
/*編寫一個你自己的strlen函數(shù),輸入一個字符串,返回它的長度,
并在一個完整的程序中驗證它。提示:字符串的結(jié)尾為 ‘\0’*/
void main ()
{
char buffer[61] = "How long am I?";
int len;
len = strlen( buffer );
printf( "'%s' is %d characters long\n", buffer, len );
}
int strlen(const char * str) {
int length = 0 ;
while (*str++ )
++ length;
return length;
}
/*指針數(shù)組最頻繁的用處是存放具有不同長度的字符串。
試用指針數(shù)組對輸入的n個長度不等的字符串進(jìn)行排序,
升序。字符串的比較可以用標(biāo)準(zhǔn)庫中的strcmp函數(shù)。*/
#include <stdio.h>
void BubbleSort(char* pt[1024],int count);
void main()
{
char buffer[1024];
char *pBuffer;
char *pt[1024];
int i, ch;
printf( "Do over please input '0'\n" );
printf( "Before:\n" );
/* Read in single line from "stdin": */
for( i = 0; (i < 1024) && ((ch = getchar()) != EOF)
&& (ch != '0'); i++ )
buffer[i] = (char)ch;
/* Terminate string with null character: */
buffer[i] = '\0';
int pl=0;
pt[pl] = buffer;
pBuffer = buffer;
while (*pBuffer++)
{
if(*pBuffer == '\n')
{
++pl;
*pBuffer = '\0';
pBuffer++;
pt[pl] = pBuffer;
}
}
BubbleSort(pt,pl);
printf( "After:\n" );
for(i=0;i<pl;i++)
{
printf( "%s\n", pt[i]);
}
}
void BubbleSort(char* in[1024],int count)
{
char* temp;
for(int y=0;y<count-1;y++)
{
for(int x=1;x<count-y;x++)
{
if((in[x][0])<(in[x-1][0]))
{
temp=in[x-1];
in[x-1]=in[x];
in[x]=temp;
}
}
}
}
/*編寫一個帶有命令行參數(shù)的程序showletter*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
printf("showletter [start] [end]\nstart\t a~z\nend\t0~99\n");
int start=0,end=0;
if(argc == 1)
{
start = 'a';
end = 'z';
}
else if(argc == 2)
{
start = (int)argv[1][0];
end = 'z';
}
else if(argc == 3)
{
start = (int)argv[1][0];
end = start+atoi(argv[2]);
}
else
{
printf("The command parameter error!\n");
}
for(int i=start; i<end; i++)
{
if(i>'z')
{
printf("\n");
end-=26;
i='a';
}
printf("%c",i);
}
printf("\n");
return 0;
}
posted on 2007-12-03 13:48
姚明 閱讀(1211)
評論(2) 編輯 收藏 引用 所屬分類:
Win32API